diff --git a/build.zig b/build.zig index 40e1b36e71..449c6a7f1a 100644 --- a/build.zig +++ b/build.zig @@ -61,6 +61,7 @@ pub fn build(b: *Builder) !void { const omit_stage2 = b.option(bool, "omit-stage2", "Do not include stage2 behind a feature flag inside stage1") orelse false; const static_llvm = b.option(bool, "static-llvm", "Disable integration with system-installed LLVM, Clang, LLD, and libc++") orelse false; const enable_llvm = b.option(bool, "enable-llvm", "Build self-hosted compiler with LLVM backend enabled") orelse (is_stage1 or static_llvm); + const enable_macos_sdk = b.option(bool, "enable-macos-sdk", "Run tests requiring presence of macOS SDK and frameworks") orelse false; const config_h_path_option = b.option([]const u8, "config_h", "Path to the generated config.h"); if (!skip_install_lib_files) { @@ -186,7 +187,7 @@ pub fn build(b: *Builder) !void { }, 2 => { // Untagged development build (e.g. 0.8.0-684-gbbe2cca1a). - var it = mem.split(git_describe, "-"); + var it = mem.split(u8, git_describe, "-"); const tagged_ancestor = it.next() orelse unreachable; const commit_height = it.next() orelse unreachable; const commit_id = it.next() orelse unreachable; @@ -340,7 +341,7 @@ pub fn build(b: *Builder) !void { )); toolchain_step.dependOn(tests.addCompareOutputTests(b, test_filter, modes)); - toolchain_step.dependOn(tests.addStandaloneTests(b, test_filter, modes, skip_non_native, target)); + toolchain_step.dependOn(tests.addStandaloneTests(b, test_filter, modes, skip_non_native, enable_macos_sdk, target)); toolchain_step.dependOn(tests.addStackTraceTests(b, test_filter, modes)); toolchain_step.dependOn(tests.addCliTests(b, test_filter, modes)); toolchain_step.dependOn(tests.addAssembleAndLinkTests(b, test_filter, modes)); @@ -478,7 +479,7 @@ fn addCxxKnownPath( ctx.cxx_compiler, b.fmt("-print-file-name={s}", .{objname}), }); - const path_unpadded = mem.tokenize(path_padded, "\r\n").next().?; + const path_unpadded = mem.tokenize(u8, path_padded, "\r\n").next().?; if (mem.eql(u8, path_unpadded, objname)) { if (errtxt) |msg| { warn("{s}", .{msg}); @@ -501,7 +502,7 @@ fn addCxxKnownPath( } fn addCMakeLibraryList(exe: *std.build.LibExeObjStep, list: []const u8) void { - var it = mem.tokenize(list, ";"); + var it = mem.tokenize(u8, list, ";"); while (it.next()) |lib| { if (mem.startsWith(u8, lib, "-l")) { exe.linkSystemLibrary(lib["-l".len..]); @@ -595,11 +596,11 @@ fn findAndParseConfigH(b: *Builder, config_h_path_option: ?[]const u8) ?CMakeCon }, }; - var lines_it = mem.tokenize(config_h_text, "\r\n"); + var lines_it = mem.tokenize(u8, config_h_text, "\r\n"); while (lines_it.next()) |line| { inline for (mappings) |mapping| { if (mem.startsWith(u8, line, mapping.prefix)) { - var it = mem.split(line, "\""); + var it = mem.split(u8, line, "\""); _ = it.next().?; // skip the stuff before the quote const quoted = it.next().?; // the stuff inside the quote @field(ctx, mapping.field) = toNativePathSep(b, quoted); diff --git a/ci/azure/linux_script b/ci/azure/linux_script index 33ad349044..dac7bac614 100755 --- a/ci/azure/linux_script +++ b/ci/azure/linux_script @@ -69,9 +69,11 @@ release/bin/zig fmt --check .. cmake .. -DZIG_EXECUTABLE="$(pwd)/release/bin/zig" make $JOBS install -for step in test-toolchain test-std docs; do - release/bin/zig build $step -Denable-qemu -Denable-wasmtime -done +release/bin/zig test ../test/behavior.zig -fno-stage1 -fLLVM -I ../test + +release/bin/zig build test-toolchain -Denable-qemu -Denable-wasmtime +release/bin/zig build test-std -Denable-qemu -Denable-wasmtime +release/bin/zig build docs -Denable-qemu -Denable-wasmtime # Look for HTML errors. tidy -qe ../zig-cache/langref.html diff --git a/ci/azure/macos_script b/ci/azure/macos_script index 4afaedfa12..d56ba63b6b 100755 --- a/ci/azure/macos_script +++ b/ci/azure/macos_script @@ -54,9 +54,12 @@ make $JOBS install cmake .. -DZIG_EXECUTABLE="$(pwd)/release/bin/zig" make $JOBS install -for step in test-toolchain test-std docs; do - release/bin/zig build $step -done +# TODO figure out why this causes a segmentation fault +# release/bin/zig test ../test/behavior.zig -fno-stage1 -fLLVM -I ../test + +release/bin/zig build test-toolchain -Denable-macos-sdk +release/bin/zig build test-std +release/bin/zig build docs if [ "${BUILD_REASON}" != "PullRequest" ]; then mv ../LICENSE release/ diff --git a/ci/azure/windows_msvc_script.bat b/ci/azure/windows_msvc_script.bat index df1b63b485..a073650717 100644 --- a/ci/azure/windows_msvc_script.bat +++ b/ci/azure/windows_msvc_script.bat @@ -26,6 +26,10 @@ cd %ZIGBUILDDIR% cmake.exe .. -Thost=x64 -G"Visual Studio 16 2019" -A x64 "-DCMAKE_INSTALL_PREFIX=%ZIGINSTALLDIR%" "-DCMAKE_PREFIX_PATH=%ZIGPREFIXPATH%" -DCMAKE_BUILD_TYPE=Release -DZIG_OMIT_STAGE2=ON || exit /b msbuild /maxcpucount /p:Configuration=Release INSTALL.vcxproj || exit /b +REM Sadly, stage2 is omitted from this build to save memory on the CI server. Once self-hosted is +REM built with itself and does not gobble as much memory, we can enable these tests. +REM "%ZIGINSTALLDIR%\bin\zig.exe" test "..\test\behavior.zig" -fno-stage1 -fLLVM -I "..\test" || exit /b + "%ZIGINSTALLDIR%\bin\zig.exe" build test-toolchain -Dskip-non-native -Dskip-stage2-tests || exit /b "%ZIGINSTALLDIR%\bin\zig.exe" build test-std -Dskip-non-native || exit /b "%ZIGINSTALLDIR%\bin\zig.exe" build docs || exit /b diff --git a/ci/azure/windows_upload b/ci/azure/windows_upload index 1f47359dd9..9c5e07e5f9 100755 --- a/ci/azure/windows_upload +++ b/ci/azure/windows_upload @@ -11,6 +11,11 @@ if [ "${BUILD_REASON}" != "PullRequest" ]; then mv dist/bin/zig.exe dist/ rmdir dist/bin + # Remove the unnecessary zig dir in $prefix/lib/zig/std/std.zig + mv dist/lib/zig dist/lib2 + rmdir dist/lib + mv dist/lib2 dist/lib + VERSION=$(dist/zig.exe version) DIRNAME="zig-windows-x86_64-$VERSION" TARBALL="$DIRNAME.zip" diff --git a/ci/srht/freebsd_script b/ci/srht/freebsd_script index 44b0330542..27c7df4933 100755 --- a/ci/srht/freebsd_script +++ b/ci/srht/freebsd_script @@ -38,6 +38,11 @@ cmake .. \ -GNinja samu install +# TODO ld.lld: error: undefined symbol: main +# >>> referenced by crt1_c.c:75 (/usr/src/lib/csu/amd64/crt1_c.c:75) +# >>> /usr/lib/crt1.o:(_start) +#release/bin/zig test ../test/behavior.zig -fno-stage1 -fLLVM -I ../test + # Here we skip some tests to save time. release/bin/zig build test -Dskip-compile-errors -Dskip-non-native diff --git a/ci/srht/netbsd_script b/ci/srht/netbsd_script index 508da4b324..f2d2f09467 100755 --- a/ci/srht/netbsd_script +++ b/ci/srht/netbsd_script @@ -51,6 +51,11 @@ samu install unset CC unset CXX +# TODO ld.lld: error: undefined symbol: main +#>>> referenced by crt0-common.c +#>>> /usr/lib/crt0.o:(___start) +#release/bin/zig test ../test/behavior.zig -fno-stage1 -fLLVM -I ../test + # Here we skip some tests to save time. release/bin/zig build test -Dskip-compile-errors -Dskip-non-native diff --git a/doc/langref.html.in b/doc/langref.html.in index 9e98bb0114..386fe9f41a 100644 --- a/doc/langref.html.in +++ b/doc/langref.html.in @@ -2846,7 +2846,7 @@ test "pointer to non-bit-aligned field" { Zig should correctly understand the alignment of fields. However there is a bug:

- {#code_begin|test_err#} + {#code_begin|test_err|expected type '*u32', found '*align(1) u32'#} const S = packed struct { a: u32, b: u32, @@ -2855,6 +2855,7 @@ test "overaligned pointer to packed struct" { var foo: S align(4) = undefined; const ptr: *align(4) S = &foo; const ptr_to_b: *u32 = &ptr.b; + _ = ptr_to_b; } {#code_end#}

When this bug is fixed, the above test in the documentation will unexpectedly pass, which will @@ -3422,10 +3423,11 @@ test "call foo" {

Blocks are used to limit the scope of variable declarations:

- {#code_begin|test_err|unused local variable#} + {#code_begin|test_err|use of undeclared identifier 'x'#} test "access variable after block scope" { { var x: i32 = 1; + _ = x; } x += 1; } @@ -7125,6 +7127,7 @@ fn func(y: *i32) void { an integer or an enum.

{#header_close#} + {#header_open|@bitCast#}
{#syntax#}@bitCast(comptime DestType: type, value: anytype) DestType{#endsyntax#}

@@ -7164,8 +7167,8 @@ fn func(y: *i32) void { {#header_open|@boolToInt#}

{#syntax#}@boolToInt(value: bool) u1{#endsyntax#}

- Converts {#syntax#}true{#endsyntax#} to {#syntax#}u1(1){#endsyntax#} and {#syntax#}false{#endsyntax#} to - {#syntax#}u1(0){#endsyntax#}. + Converts {#syntax#}true{#endsyntax#} to {#syntax#}@as(u1, 1){#endsyntax#} and {#syntax#}false{#endsyntax#} to + {#syntax#}@as(u1, 0){#endsyntax#}.

If the value is known at compile-time, the return type is {#syntax#}comptime_int{#endsyntax#} @@ -7987,6 +7990,17 @@ test "@hasDecl" {

{#header_close#} + {#header_open|@maximum#} +
{#syntax#}@maximum(a: T, b: T) T{#endsyntax#}
+

+ Returns the maximum value of {#syntax#}a{#endsyntax#} and {#syntax#}b{#endsyntax#}. This builtin accepts integers, floats, and vectors of either. In the latter case, the operation is performed element wise. +

+

+ NaNs are handled as follows: if one of the operands of a (pairwise) operation is NaN, the other operand is returned. If both operands are NaN, NaN is returned. +

+ {#see_also|@minimum|SIMD|Vectors#} + {#header_close#} + {#header_open|@memcpy#}
{#syntax#}@memcpy(noalias dest: [*]u8, noalias source: [*]const u8, byte_count: usize){#endsyntax#}

@@ -8024,6 +8038,17 @@ mem.copy(u8, dest[0..byte_count], source[0..byte_count]);{#endsyntax#} mem.set(u8, dest, c);{#endsyntax#} {#header_close#} + {#header_open|@minimum#} +

{#syntax#}@minimum(a: T, b: T) T{#endsyntax#}
+

+ Returns the minimum value of {#syntax#}a{#endsyntax#} and {#syntax#}b{#endsyntax#}. This builtin accepts integers, floats, and vectors of either. In the latter case, the operation is performed element wise. +

+

+ NaNs are handled as follows: if one of the operands of a (pairwise) operation is NaN, the other operand is returned. If both operands are NaN, NaN is returned. +

+ {#see_also|@maximum|SIMD|Vectors#} + {#header_close#} + {#header_open|@wasmMemorySize#}
{#syntax#}@wasmMemorySize(index: u32) u32{#endsyntax#}

@@ -8177,6 +8202,15 @@ test "@wasmMemoryGrow" { a calling function, the returned address will apply to the calling function.

{#header_close#} + + {#header_open|@select#} +
{#syntax#}@select(comptime T: type, pred: std.meta.Vector(len, bool), a: std.meta.Vector(len, T), b: std.meta.Vector(len, T)) std.meta.Vector(len, T){#endsyntax#}
+

+ Selects values element-wise from {#syntax#}a{#endsyntax#} or {#syntax#}b{#endsyntax#} based on {#syntax#}pred{#endsyntax#}. If {#syntax#}pred[i]{#endsyntax#} is {#syntax#}true{#endsyntax#}, the corresponding element in the result will be {#syntax#}a[i]{#endsyntax#} and otherwise {#syntax#}b[i]{#endsyntax#}. +

+ {#see_also|SIMD|Vectors#} + {#header_close#} + {#header_open|@setAlignStack#}
{#syntax#}@setAlignStack(comptime alignment: u29){#endsyntax#}

diff --git a/lib/libc/include/aarch64-macos-gnu/Availability.h b/lib/libc/include/any-macos-any/Availability.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/Availability.h rename to lib/libc/include/any-macos-any/Availability.h diff --git a/lib/libc/include/aarch64-macos-gnu/CommonCrypto/CommonDigest.h b/lib/libc/include/any-macos-any/CommonCrypto/CommonDigest.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/CommonCrypto/CommonDigest.h rename to lib/libc/include/any-macos-any/CommonCrypto/CommonDigest.h diff --git a/lib/libc/include/aarch64-macos-gnu/TargetConditionals.h b/lib/libc/include/any-macos-any/TargetConditionals.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/TargetConditionals.h rename to lib/libc/include/any-macos-any/TargetConditionals.h diff --git a/lib/libc/include/aarch64-macos-gnu/_ctermid.h b/lib/libc/include/any-macos-any/_ctermid.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/_ctermid.h rename to lib/libc/include/any-macos-any/_ctermid.h diff --git a/lib/libc/include/aarch64-macos-gnu/ar.h b/lib/libc/include/any-macos-any/ar.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/ar.h rename to lib/libc/include/any-macos-any/ar.h diff --git a/lib/libc/include/aarch64-macos-gnu/bsm/audit.h b/lib/libc/include/any-macos-any/bsm/audit.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/bsm/audit.h rename to lib/libc/include/any-macos-any/bsm/audit.h diff --git a/lib/libc/include/aarch64-macos-gnu/dispatch/block.h b/lib/libc/include/any-macos-any/dispatch/block.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/dispatch/block.h rename to lib/libc/include/any-macos-any/dispatch/block.h diff --git a/lib/libc/include/aarch64-macos-gnu/dispatch/dispatch.h b/lib/libc/include/any-macos-any/dispatch/dispatch.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/dispatch/dispatch.h rename to lib/libc/include/any-macos-any/dispatch/dispatch.h diff --git a/lib/libc/include/aarch64-macos-gnu/dispatch/group.h b/lib/libc/include/any-macos-any/dispatch/group.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/dispatch/group.h rename to lib/libc/include/any-macos-any/dispatch/group.h diff --git a/lib/libc/include/aarch64-macos-gnu/dispatch/object.h b/lib/libc/include/any-macos-any/dispatch/object.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/dispatch/object.h rename to lib/libc/include/any-macos-any/dispatch/object.h diff --git a/lib/libc/include/aarch64-macos-gnu/dispatch/queue.h b/lib/libc/include/any-macos-any/dispatch/queue.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/dispatch/queue.h rename to lib/libc/include/any-macos-any/dispatch/queue.h diff --git a/lib/libc/include/aarch64-macos-gnu/dispatch/semaphore.h b/lib/libc/include/any-macos-any/dispatch/semaphore.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/dispatch/semaphore.h rename to lib/libc/include/any-macos-any/dispatch/semaphore.h diff --git a/lib/libc/include/aarch64-macos-gnu/dispatch/source.h b/lib/libc/include/any-macos-any/dispatch/source.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/dispatch/source.h rename to lib/libc/include/any-macos-any/dispatch/source.h diff --git a/lib/libc/include/aarch64-macos-gnu/dispatch/workloop.h b/lib/libc/include/any-macos-any/dispatch/workloop.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/dispatch/workloop.h rename to lib/libc/include/any-macos-any/dispatch/workloop.h diff --git a/lib/libc/include/aarch64-macos-gnu/libkern/OSByteOrder.h b/lib/libc/include/any-macos-any/libkern/OSByteOrder.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/libkern/OSByteOrder.h rename to lib/libc/include/any-macos-any/libkern/OSByteOrder.h diff --git a/lib/libc/include/aarch64-macos-gnu/libkern/_OSByteOrder.h b/lib/libc/include/any-macos-any/libkern/_OSByteOrder.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/libkern/_OSByteOrder.h rename to lib/libc/include/any-macos-any/libkern/_OSByteOrder.h diff --git a/lib/libc/include/aarch64-macos-gnu/libproc.h b/lib/libc/include/any-macos-any/libproc.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/libproc.h rename to lib/libc/include/any-macos-any/libproc.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach-o/arch.h b/lib/libc/include/any-macos-any/mach-o/arch.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach-o/arch.h rename to lib/libc/include/any-macos-any/mach-o/arch.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach-o/arm64/reloc.h b/lib/libc/include/any-macos-any/mach-o/arm64/reloc.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach-o/arm64/reloc.h rename to lib/libc/include/any-macos-any/mach-o/arm64/reloc.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach-o/compact_unwind_encoding.h b/lib/libc/include/any-macos-any/mach-o/compact_unwind_encoding.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach-o/compact_unwind_encoding.h rename to lib/libc/include/any-macos-any/mach-o/compact_unwind_encoding.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach-o/dyld.h b/lib/libc/include/any-macos-any/mach-o/dyld.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach-o/dyld.h rename to lib/libc/include/any-macos-any/mach-o/dyld.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach-o/fat.h b/lib/libc/include/any-macos-any/mach-o/fat.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach-o/fat.h rename to lib/libc/include/any-macos-any/mach-o/fat.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach-o/loader.h b/lib/libc/include/any-macos-any/mach-o/loader.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach-o/loader.h rename to lib/libc/include/any-macos-any/mach-o/loader.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach-o/nlist.h b/lib/libc/include/any-macos-any/mach-o/nlist.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach-o/nlist.h rename to lib/libc/include/any-macos-any/mach-o/nlist.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach-o/ranlib.h b/lib/libc/include/any-macos-any/mach-o/ranlib.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach-o/ranlib.h rename to lib/libc/include/any-macos-any/mach-o/ranlib.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach-o/reloc.h b/lib/libc/include/any-macos-any/mach-o/reloc.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach-o/reloc.h rename to lib/libc/include/any-macos-any/mach-o/reloc.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach-o/stab.h b/lib/libc/include/any-macos-any/mach-o/stab.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach-o/stab.h rename to lib/libc/include/any-macos-any/mach-o/stab.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach-o/x86_64/reloc.h b/lib/libc/include/any-macos-any/mach-o/x86_64/reloc.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach-o/x86_64/reloc.h rename to lib/libc/include/any-macos-any/mach-o/x86_64/reloc.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/kern_return.h b/lib/libc/include/any-macos-any/mach/kern_return.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/kern_return.h rename to lib/libc/include/any-macos-any/mach/kern_return.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/mach_port.h b/lib/libc/include/any-macos-any/mach/mach_port.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/mach_port.h rename to lib/libc/include/any-macos-any/mach/mach_port.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/mach_traps.h b/lib/libc/include/any-macos-any/mach/mach_traps.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/mach_traps.h rename to lib/libc/include/any-macos-any/mach/mach_traps.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/mach_types.h b/lib/libc/include/any-macos-any/mach/mach_types.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/mach_types.h rename to lib/libc/include/any-macos-any/mach/mach_types.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/machine.h b/lib/libc/include/any-macos-any/mach/machine.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/machine.h rename to lib/libc/include/any-macos-any/mach/machine.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/machine/_structs.h b/lib/libc/include/any-macos-any/mach/machine/_structs.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/machine/_structs.h rename to lib/libc/include/any-macos-any/mach/machine/_structs.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/machine/boolean.h b/lib/libc/include/any-macos-any/mach/machine/boolean.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/machine/boolean.h rename to lib/libc/include/any-macos-any/mach/machine/boolean.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/machine/exception.h b/lib/libc/include/any-macos-any/mach/machine/exception.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/machine/exception.h rename to lib/libc/include/any-macos-any/mach/machine/exception.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/machine/kern_return.h b/lib/libc/include/any-macos-any/mach/machine/kern_return.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/machine/kern_return.h rename to lib/libc/include/any-macos-any/mach/machine/kern_return.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/machine/processor_info.h b/lib/libc/include/any-macos-any/mach/machine/processor_info.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/machine/processor_info.h rename to lib/libc/include/any-macos-any/mach/machine/processor_info.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/machine/rpc.h b/lib/libc/include/any-macos-any/mach/machine/rpc.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/machine/rpc.h rename to lib/libc/include/any-macos-any/mach/machine/rpc.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/machine/thread_state.h b/lib/libc/include/any-macos-any/mach/machine/thread_state.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/machine/thread_state.h rename to lib/libc/include/any-macos-any/mach/machine/thread_state.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/machine/thread_status.h b/lib/libc/include/any-macos-any/mach/machine/thread_status.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/machine/thread_status.h rename to lib/libc/include/any-macos-any/mach/machine/thread_status.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/machine/vm_param.h b/lib/libc/include/any-macos-any/mach/machine/vm_param.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/machine/vm_param.h rename to lib/libc/include/any-macos-any/mach/machine/vm_param.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/machine/vm_types.h b/lib/libc/include/any-macos-any/mach/machine/vm_types.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/machine/vm_types.h rename to lib/libc/include/any-macos-any/mach/machine/vm_types.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/message.h b/lib/libc/include/any-macos-any/mach/message.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/message.h rename to lib/libc/include/any-macos-any/mach/message.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/port.h b/lib/libc/include/any-macos-any/mach/port.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/port.h rename to lib/libc/include/any-macos-any/mach/port.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/processor_set.h b/lib/libc/include/any-macos-any/mach/processor_set.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/processor_set.h rename to lib/libc/include/any-macos-any/mach/processor_set.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/task.h b/lib/libc/include/any-macos-any/mach/task.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/task.h rename to lib/libc/include/any-macos-any/mach/task.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/task_info.h b/lib/libc/include/any-macos-any/mach/task_info.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/task_info.h rename to lib/libc/include/any-macos-any/mach/task_info.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/task_policy.h b/lib/libc/include/any-macos-any/mach/task_policy.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/task_policy.h rename to lib/libc/include/any-macos-any/mach/task_policy.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/task_special_ports.h b/lib/libc/include/any-macos-any/mach/task_special_ports.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/task_special_ports.h rename to lib/libc/include/any-macos-any/mach/task_special_ports.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/thread_act.h b/lib/libc/include/any-macos-any/mach/thread_act.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/thread_act.h rename to lib/libc/include/any-macos-any/mach/thread_act.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/thread_special_ports.h b/lib/libc/include/any-macos-any/mach/thread_special_ports.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/thread_special_ports.h rename to lib/libc/include/any-macos-any/mach/thread_special_ports.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/thread_status.h b/lib/libc/include/any-macos-any/mach/thread_status.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/thread_status.h rename to lib/libc/include/any-macos-any/mach/thread_status.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/vm_prot.h b/lib/libc/include/any-macos-any/mach/vm_prot.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/vm_prot.h rename to lib/libc/include/any-macos-any/mach/vm_prot.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/vm_statistics.h b/lib/libc/include/any-macos-any/mach/vm_statistics.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/vm_statistics.h rename to lib/libc/include/any-macos-any/mach/vm_statistics.h diff --git a/lib/libc/include/aarch64-macos-gnu/mach/vm_types.h b/lib/libc/include/any-macos-any/mach/vm_types.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/mach/vm_types.h rename to lib/libc/include/any-macos-any/mach/vm_types.h diff --git a/lib/libc/include/aarch64-macos-gnu/machine/_mcontext.h b/lib/libc/include/any-macos-any/machine/_mcontext.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/machine/_mcontext.h rename to lib/libc/include/any-macos-any/machine/_mcontext.h diff --git a/lib/libc/include/aarch64-macos-gnu/machine/_param.h b/lib/libc/include/any-macos-any/machine/_param.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/machine/_param.h rename to lib/libc/include/any-macos-any/machine/_param.h diff --git a/lib/libc/include/aarch64-macos-gnu/machine/_types.h b/lib/libc/include/any-macos-any/machine/_types.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/machine/_types.h rename to lib/libc/include/any-macos-any/machine/_types.h diff --git a/lib/libc/include/aarch64-macos-gnu/machine/endian.h b/lib/libc/include/any-macos-any/machine/endian.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/machine/endian.h rename to lib/libc/include/any-macos-any/machine/endian.h diff --git a/lib/libc/include/aarch64-macos-gnu/machine/limits.h b/lib/libc/include/any-macos-any/machine/limits.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/machine/limits.h rename to lib/libc/include/any-macos-any/machine/limits.h diff --git a/lib/libc/include/aarch64-macos-gnu/machine/param.h b/lib/libc/include/any-macos-any/machine/param.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/machine/param.h rename to lib/libc/include/any-macos-any/machine/param.h diff --git a/lib/libc/include/aarch64-macos-gnu/machine/signal.h b/lib/libc/include/any-macos-any/machine/signal.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/machine/signal.h rename to lib/libc/include/any-macos-any/machine/signal.h diff --git a/lib/libc/include/aarch64-macos-gnu/machine/types.h b/lib/libc/include/any-macos-any/machine/types.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/machine/types.h rename to lib/libc/include/any-macos-any/machine/types.h diff --git a/lib/libc/include/aarch64-macos-gnu/malloc/_malloc.h b/lib/libc/include/any-macos-any/malloc/_malloc.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/malloc/_malloc.h rename to lib/libc/include/any-macos-any/malloc/_malloc.h diff --git a/lib/libc/include/aarch64-macos-gnu/malloc/malloc.h b/lib/libc/include/any-macos-any/malloc/malloc.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/malloc/malloc.h rename to lib/libc/include/any-macos-any/malloc/malloc.h diff --git a/lib/libc/include/aarch64-macos-gnu/math.h b/lib/libc/include/any-macos-any/math.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/math.h rename to lib/libc/include/any-macos-any/math.h diff --git a/lib/libc/include/aarch64-macos-gnu/net/if.h b/lib/libc/include/any-macos-any/net/if.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/net/if.h rename to lib/libc/include/any-macos-any/net/if.h diff --git a/lib/libc/include/aarch64-macos-gnu/net/if_var.h b/lib/libc/include/any-macos-any/net/if_var.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/net/if_var.h rename to lib/libc/include/any-macos-any/net/if_var.h diff --git a/lib/libc/include/aarch64-macos-gnu/net/route.h b/lib/libc/include/any-macos-any/net/route.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/net/route.h rename to lib/libc/include/any-macos-any/net/route.h diff --git a/lib/libc/include/aarch64-macos-gnu/netinet/in.h b/lib/libc/include/any-macos-any/netinet/in.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/netinet/in.h rename to lib/libc/include/any-macos-any/netinet/in.h diff --git a/lib/libc/include/aarch64-macos-gnu/netinet/tcp.h b/lib/libc/include/any-macos-any/netinet/tcp.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/netinet/tcp.h rename to lib/libc/include/any-macos-any/netinet/tcp.h diff --git a/lib/libc/include/aarch64-macos-gnu/netinet6/in6.h b/lib/libc/include/any-macos-any/netinet6/in6.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/netinet6/in6.h rename to lib/libc/include/any-macos-any/netinet6/in6.h diff --git a/lib/libc/include/aarch64-macos-gnu/objc/objc-api.h b/lib/libc/include/any-macos-any/objc/objc-api.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/objc/objc-api.h rename to lib/libc/include/any-macos-any/objc/objc-api.h diff --git a/lib/libc/include/aarch64-macos-gnu/objc/runtime.h b/lib/libc/include/any-macos-any/objc/runtime.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/objc/runtime.h rename to lib/libc/include/any-macos-any/objc/runtime.h diff --git a/lib/libc/include/aarch64-macos-gnu/os/base.h b/lib/libc/include/any-macos-any/os/base.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/os/base.h rename to lib/libc/include/any-macos-any/os/base.h diff --git a/lib/libc/include/aarch64-macos-gnu/os/clock.h b/lib/libc/include/any-macos-any/os/clock.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/os/clock.h rename to lib/libc/include/any-macos-any/os/clock.h diff --git a/lib/libc/include/aarch64-macos-gnu/os/object.h b/lib/libc/include/any-macos-any/os/object.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/os/object.h rename to lib/libc/include/any-macos-any/os/object.h diff --git a/lib/libc/include/aarch64-macos-gnu/os/workgroup.h b/lib/libc/include/any-macos-any/os/workgroup.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/os/workgroup.h rename to lib/libc/include/any-macos-any/os/workgroup.h diff --git a/lib/libc/include/aarch64-macos-gnu/os/workgroup_base.h b/lib/libc/include/any-macos-any/os/workgroup_base.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/os/workgroup_base.h rename to lib/libc/include/any-macos-any/os/workgroup_base.h diff --git a/lib/libc/include/aarch64-macos-gnu/os/workgroup_interval.h b/lib/libc/include/any-macos-any/os/workgroup_interval.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/os/workgroup_interval.h rename to lib/libc/include/any-macos-any/os/workgroup_interval.h diff --git a/lib/libc/include/aarch64-macos-gnu/os/workgroup_object.h b/lib/libc/include/any-macos-any/os/workgroup_object.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/os/workgroup_object.h rename to lib/libc/include/any-macos-any/os/workgroup_object.h diff --git a/lib/libc/include/aarch64-macos-gnu/os/workgroup_parallel.h b/lib/libc/include/any-macos-any/os/workgroup_parallel.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/os/workgroup_parallel.h rename to lib/libc/include/any-macos-any/os/workgroup_parallel.h diff --git a/lib/libc/include/aarch64-macos-gnu/pthread.h b/lib/libc/include/any-macos-any/pthread.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/pthread.h rename to lib/libc/include/any-macos-any/pthread.h diff --git a/lib/libc/include/aarch64-macos-gnu/pthread/sched.h b/lib/libc/include/any-macos-any/pthread/sched.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/pthread/sched.h rename to lib/libc/include/any-macos-any/pthread/sched.h diff --git a/lib/libc/include/aarch64-macos-gnu/sched.h b/lib/libc/include/any-macos-any/sched.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sched.h rename to lib/libc/include/any-macos-any/sched.h diff --git a/lib/libc/include/aarch64-macos-gnu/signal.h b/lib/libc/include/any-macos-any/signal.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/signal.h rename to lib/libc/include/any-macos-any/signal.h diff --git a/lib/libc/include/aarch64-macos-gnu/simd/common.h b/lib/libc/include/any-macos-any/simd/common.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/simd/common.h rename to lib/libc/include/any-macos-any/simd/common.h diff --git a/lib/libc/include/aarch64-macos-gnu/simd/conversion.h b/lib/libc/include/any-macos-any/simd/conversion.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/simd/conversion.h rename to lib/libc/include/any-macos-any/simd/conversion.h diff --git a/lib/libc/include/aarch64-macos-gnu/simd/logic.h b/lib/libc/include/any-macos-any/simd/logic.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/simd/logic.h rename to lib/libc/include/any-macos-any/simd/logic.h diff --git a/lib/libc/include/aarch64-macos-gnu/simd/math.h b/lib/libc/include/any-macos-any/simd/math.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/simd/math.h rename to lib/libc/include/any-macos-any/simd/math.h diff --git a/lib/libc/include/aarch64-macos-gnu/simd/packed.h b/lib/libc/include/any-macos-any/simd/packed.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/simd/packed.h rename to lib/libc/include/any-macos-any/simd/packed.h diff --git a/lib/libc/include/aarch64-macos-gnu/simd/quaternion.h b/lib/libc/include/any-macos-any/simd/quaternion.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/simd/quaternion.h rename to lib/libc/include/any-macos-any/simd/quaternion.h diff --git a/lib/libc/include/aarch64-macos-gnu/spawn.h b/lib/libc/include/any-macos-any/spawn.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/spawn.h rename to lib/libc/include/any-macos-any/spawn.h diff --git a/lib/libc/include/aarch64-macos-gnu/stdio.h b/lib/libc/include/any-macos-any/stdio.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/stdio.h rename to lib/libc/include/any-macos-any/stdio.h diff --git a/lib/libc/include/aarch64-macos-gnu/stdlib.h b/lib/libc/include/any-macos-any/stdlib.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/stdlib.h rename to lib/libc/include/any-macos-any/stdlib.h diff --git a/lib/libc/include/aarch64-macos-gnu/string.h b/lib/libc/include/any-macos-any/string.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/string.h rename to lib/libc/include/any-macos-any/string.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/_pthread/_pthread_attr_t.h b/lib/libc/include/any-macos-any/sys/_pthread/_pthread_attr_t.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/_pthread/_pthread_attr_t.h rename to lib/libc/include/any-macos-any/sys/_pthread/_pthread_attr_t.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/_pthread/_pthread_cond_t.h b/lib/libc/include/any-macos-any/sys/_pthread/_pthread_cond_t.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/_pthread/_pthread_cond_t.h rename to lib/libc/include/any-macos-any/sys/_pthread/_pthread_cond_t.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/_pthread/_pthread_condattr_t.h b/lib/libc/include/any-macos-any/sys/_pthread/_pthread_condattr_t.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/_pthread/_pthread_condattr_t.h rename to lib/libc/include/any-macos-any/sys/_pthread/_pthread_condattr_t.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/_pthread/_pthread_rwlock_t.h b/lib/libc/include/any-macos-any/sys/_pthread/_pthread_rwlock_t.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/_pthread/_pthread_rwlock_t.h rename to lib/libc/include/any-macos-any/sys/_pthread/_pthread_rwlock_t.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/_pthread/_pthread_rwlockattr_t.h b/lib/libc/include/any-macos-any/sys/_pthread/_pthread_rwlockattr_t.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/_pthread/_pthread_rwlockattr_t.h rename to lib/libc/include/any-macos-any/sys/_pthread/_pthread_rwlockattr_t.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/_pthread/_pthread_t.h b/lib/libc/include/any-macos-any/sys/_pthread/_pthread_t.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/_pthread/_pthread_t.h rename to lib/libc/include/any-macos-any/sys/_pthread/_pthread_t.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/_pthread/_pthread_types.h b/lib/libc/include/any-macos-any/sys/_pthread/_pthread_types.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/_pthread/_pthread_types.h rename to lib/libc/include/any-macos-any/sys/_pthread/_pthread_types.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/_select.h b/lib/libc/include/any-macos-any/sys/_select.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/_select.h rename to lib/libc/include/any-macos-any/sys/_select.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/_symbol_aliasing.h b/lib/libc/include/any-macos-any/sys/_symbol_aliasing.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/_symbol_aliasing.h rename to lib/libc/include/any-macos-any/sys/_symbol_aliasing.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/_types/_fd_def.h b/lib/libc/include/any-macos-any/sys/_types/_fd_def.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/_types/_fd_def.h rename to lib/libc/include/any-macos-any/sys/_types/_fd_def.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/_types/_int8_t.h b/lib/libc/include/any-macos-any/sys/_types/_int8_t.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/_types/_int8_t.h rename to lib/libc/include/any-macos-any/sys/_types/_int8_t.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/_types/_ucontext.h b/lib/libc/include/any-macos-any/sys/_types/_ucontext.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/_types/_ucontext.h rename to lib/libc/include/any-macos-any/sys/_types/_ucontext.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/acl.h b/lib/libc/include/any-macos-any/sys/acl.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/acl.h rename to lib/libc/include/any-macos-any/sys/acl.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/attr.h b/lib/libc/include/any-macos-any/sys/attr.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/attr.h rename to lib/libc/include/any-macos-any/sys/attr.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/cdefs.h b/lib/libc/include/any-macos-any/sys/cdefs.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/cdefs.h rename to lib/libc/include/any-macos-any/sys/cdefs.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/event.h b/lib/libc/include/any-macos-any/sys/event.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/event.h rename to lib/libc/include/any-macos-any/sys/event.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/fcntl.h b/lib/libc/include/any-macos-any/sys/fcntl.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/fcntl.h rename to lib/libc/include/any-macos-any/sys/fcntl.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/ioccom.h b/lib/libc/include/any-macos-any/sys/ioccom.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/ioccom.h rename to lib/libc/include/any-macos-any/sys/ioccom.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/kauth.h b/lib/libc/include/any-macos-any/sys/kauth.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/kauth.h rename to lib/libc/include/any-macos-any/sys/kauth.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/kern_control.h b/lib/libc/include/any-macos-any/sys/kern_control.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/kern_control.h rename to lib/libc/include/any-macos-any/sys/kern_control.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/mman.h b/lib/libc/include/any-macos-any/sys/mman.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/mman.h rename to lib/libc/include/any-macos-any/sys/mman.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/mount.h b/lib/libc/include/any-macos-any/sys/mount.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/mount.h rename to lib/libc/include/any-macos-any/sys/mount.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/param.h b/lib/libc/include/any-macos-any/sys/param.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/param.h rename to lib/libc/include/any-macos-any/sys/param.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/proc.h b/lib/libc/include/any-macos-any/sys/proc.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/proc.h rename to lib/libc/include/any-macos-any/sys/proc.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/proc_info.h b/lib/libc/include/any-macos-any/sys/proc_info.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/proc_info.h rename to lib/libc/include/any-macos-any/sys/proc_info.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/random.h b/lib/libc/include/any-macos-any/sys/random.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/random.h rename to lib/libc/include/any-macos-any/sys/random.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/resource.h b/lib/libc/include/any-macos-any/sys/resource.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/resource.h rename to lib/libc/include/any-macos-any/sys/resource.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/shm.h b/lib/libc/include/any-macos-any/sys/shm.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/shm.h rename to lib/libc/include/any-macos-any/sys/shm.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/socket.h b/lib/libc/include/any-macos-any/sys/socket.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/socket.h rename to lib/libc/include/any-macos-any/sys/socket.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/sockio.h b/lib/libc/include/any-macos-any/sys/sockio.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/sockio.h rename to lib/libc/include/any-macos-any/sys/sockio.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/spawn.h b/lib/libc/include/any-macos-any/sys/spawn.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/spawn.h rename to lib/libc/include/any-macos-any/sys/spawn.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/stat.h b/lib/libc/include/any-macos-any/sys/stat.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/stat.h rename to lib/libc/include/any-macos-any/sys/stat.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/sysctl.h b/lib/libc/include/any-macos-any/sys/sysctl.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/sysctl.h rename to lib/libc/include/any-macos-any/sys/sysctl.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/syslimits.h b/lib/libc/include/any-macos-any/sys/syslimits.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/syslimits.h rename to lib/libc/include/any-macos-any/sys/syslimits.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/ucontext.h b/lib/libc/include/any-macos-any/sys/ucontext.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/ucontext.h rename to lib/libc/include/any-macos-any/sys/ucontext.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/uio.h b/lib/libc/include/any-macos-any/sys/uio.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/uio.h rename to lib/libc/include/any-macos-any/sys/uio.h diff --git a/lib/libc/include/aarch64-macos-gnu/sys/un.h b/lib/libc/include/any-macos-any/sys/un.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/sys/un.h rename to lib/libc/include/any-macos-any/sys/un.h diff --git a/lib/libc/include/aarch64-macos-gnu/ucontext.h b/lib/libc/include/any-macos-any/ucontext.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/ucontext.h rename to lib/libc/include/any-macos-any/ucontext.h diff --git a/lib/libc/include/aarch64-macos-gnu/xlocale/_inttypes.h b/lib/libc/include/any-macos-any/xlocale/_inttypes.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/xlocale/_inttypes.h rename to lib/libc/include/any-macos-any/xlocale/_inttypes.h diff --git a/lib/libc/include/aarch64-macos-gnu/xlocale/_wchar.h b/lib/libc/include/any-macos-any/xlocale/_wchar.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/xlocale/_wchar.h rename to lib/libc/include/any-macos-any/xlocale/_wchar.h diff --git a/lib/libc/include/aarch64-macos-gnu/xpc/availability.h b/lib/libc/include/any-macos-any/xpc/availability.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/xpc/availability.h rename to lib/libc/include/any-macos-any/xpc/availability.h diff --git a/lib/libc/include/aarch64-macos-gnu/xpc/base.h b/lib/libc/include/any-macos-any/xpc/base.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/xpc/base.h rename to lib/libc/include/any-macos-any/xpc/base.h diff --git a/lib/libc/include/aarch64-macos-gnu/xpc/connection.h b/lib/libc/include/any-macos-any/xpc/connection.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/xpc/connection.h rename to lib/libc/include/any-macos-any/xpc/connection.h diff --git a/lib/libc/include/aarch64-macos-gnu/xpc/xpc.h b/lib/libc/include/any-macos-any/xpc/xpc.h similarity index 100% rename from lib/libc/include/aarch64-macos-gnu/xpc/xpc.h rename to lib/libc/include/any-macos-any/xpc/xpc.h diff --git a/lib/libc/include/x86_64-macos-gnu/Availability.h b/lib/libc/include/x86_64-macos-gnu/Availability.h deleted file mode 100644 index bdfd794d89..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/Availability.h +++ /dev/null @@ -1,605 +0,0 @@ -/* - * Copyright (c) 2007-2016 by Apple Inc.. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - -#ifndef __AVAILABILITY__ -#define __AVAILABILITY__ - /* - These macros are for use in OS header files. They enable function prototypes - and Objective-C methods to be tagged with the OS version in which they - were first available; and, if applicable, the OS version in which they - became deprecated. - - The desktop Mac OS X and iOS each have different version numbers. - The __OSX_AVAILABLE_STARTING() macro allows you to specify both the desktop - and iOS version numbers. For instance: - __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0) - means the function/method was first available on Mac OS X 10.2 on the desktop - and first available in iOS 2.0 on the iPhone. - - If a function is available on one platform, but not the other a _NA (not - applicable) parameter is used. For instance: - __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_NA) - means that the function/method was first available on Mac OS X 10.3, and it - currently not implemented on the iPhone. - - At some point, a function/method may be deprecated. That means Apple - recommends applications stop using the function, either because there is a - better replacement or the functionality is being phased out. Deprecated - functions/methods can be tagged with a __OSX_AVAILABLE_BUT_DEPRECATED() - macro which specifies the OS version where the function became available - as well as the OS version in which it became deprecated. For instance: - __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_0,__MAC_10_5,__IPHONE_NA,__IPHONE_NA) - means that the function/method was introduced in Mac OS X 10.0, then - became deprecated beginning in Mac OS X 10.5. On iOS the function - has never been available. - - For these macros to function properly, a program must specify the OS version range - it is targeting. The min OS version is specified as an option to the compiler: - -mmacosx-version-min=10.x when building for Mac OS X, and -miphoneos-version-min=y.z - when building for the iPhone. The upper bound for the OS version is rarely needed, - but it can be set on the command line via: -D__MAC_OS_X_VERSION_MAX_ALLOWED=10x0 for - Mac OS X and __IPHONE_OS_VERSION_MAX_ALLOWED = y0z00 for iOS. - - Examples: - - A function available in Mac OS X 10.5 and later, but not on the phone: - - extern void mymacfunc() __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA); - - - An Objective-C method in Mac OS X 10.5 and later, but not on the phone: - - @interface MyClass : NSObject - -(void) mymacmethod __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA); - @end - - - An enum available on the phone, but not available on Mac OS X: - - #if __IPHONE_OS_VERSION_MIN_REQUIRED - enum { myEnum = 1 }; - #endif - Note: this works when targeting the Mac OS X platform because - __IPHONE_OS_VERSION_MIN_REQUIRED is undefined which evaluates to zero. - - - An enum with values added in different iPhoneOS versions: - - enum { - myX = 1, // Usable on iPhoneOS 2.1 and later - myY = 2, // Usable on iPhoneOS 3.0 and later - myZ = 3, // Usable on iPhoneOS 3.0 and later - ... - Note: you do not want to use #if with enumeration values - when a client needs to see all values at compile time - and use runtime logic to only use the viable values. - - - It is also possible to use the *_VERSION_MIN_REQUIRED in source code to make one - source base that can be compiled to target a range of OS versions. It is best - to not use the _MAC_* and __IPHONE_* macros for comparisons, but rather their values. - That is because you might get compiled on an old OS that does not define a later - OS version macro, and in the C preprocessor undefined values evaluate to zero - in expresssions, which could cause the #if expression to evaluate in an unexpected - way. - - #ifdef __MAC_OS_X_VERSION_MIN_REQUIRED - // code only compiled when targeting Mac OS X and not iPhone - // note use of 1050 instead of __MAC_10_5 - #if __MAC_OS_X_VERSION_MIN_REQUIRED < 1050 - // code in here might run on pre-Leopard OS - #else - // code here can assume Leopard or later - #endif - #endif - - -*/ - -/* - * __API_TO_BE_DEPRECATED is used as a version number in API that will be deprecated - * in an upcoming release. This soft deprecation is an intermediate step before formal - * deprecation to notify developers about the API before compiler warnings are generated. - * You can find all places in your code that use soft deprecated API by redefining the - * value of this macro to your current minimum deployment target, for example: - * (macOS) - * clang -D__API_TO_BE_DEPRECATED=10.12 - * (iOS) - * clang -D__API_TO_BE_DEPRECATED=11.0 - */ - -#ifndef __API_TO_BE_DEPRECATED -#define __API_TO_BE_DEPRECATED 100000 -#endif - -#ifndef __MAC_10_0 -#define __MAC_10_0 1000 -#define __MAC_10_1 1010 -#define __MAC_10_2 1020 -#define __MAC_10_3 1030 -#define __MAC_10_4 1040 -#define __MAC_10_5 1050 -#define __MAC_10_6 1060 -#define __MAC_10_7 1070 -#define __MAC_10_8 1080 -#define __MAC_10_9 1090 -#define __MAC_10_10 101000 -#define __MAC_10_10_2 101002 -#define __MAC_10_10_3 101003 -#define __MAC_10_11 101100 -#define __MAC_10_11_2 101102 -#define __MAC_10_11_3 101103 -#define __MAC_10_11_4 101104 -#define __MAC_10_12 101200 -#define __MAC_10_12_1 101201 -#define __MAC_10_12_2 101202 -#define __MAC_10_12_4 101204 -#define __MAC_10_13 101300 -#define __MAC_10_13_1 101301 -#define __MAC_10_13_2 101302 -#define __MAC_10_13_4 101304 -#define __MAC_10_14 101400 -#define __MAC_10_14_1 101401 -#define __MAC_10_14_4 101404 -#define __MAC_10_15 101500 -#define __MAC_10_15_1 101501 -#define __MAC_10_15_4 101504 -/* __MAC_NA is not defined to a value but is uses as a token by macros to indicate that the API is unavailable */ - -#define __IPHONE_2_0 20000 -#define __IPHONE_2_1 20100 -#define __IPHONE_2_2 20200 -#define __IPHONE_3_0 30000 -#define __IPHONE_3_1 30100 -#define __IPHONE_3_2 30200 -#define __IPHONE_4_0 40000 -#define __IPHONE_4_1 40100 -#define __IPHONE_4_2 40200 -#define __IPHONE_4_3 40300 -#define __IPHONE_5_0 50000 -#define __IPHONE_5_1 50100 -#define __IPHONE_6_0 60000 -#define __IPHONE_6_1 60100 -#define __IPHONE_7_0 70000 -#define __IPHONE_7_1 70100 -#define __IPHONE_8_0 80000 -#define __IPHONE_8_1 80100 -#define __IPHONE_8_2 80200 -#define __IPHONE_8_3 80300 -#define __IPHONE_8_4 80400 -#define __IPHONE_9_0 90000 -#define __IPHONE_9_1 90100 -#define __IPHONE_9_2 90200 -#define __IPHONE_9_3 90300 -#define __IPHONE_10_0 100000 -#define __IPHONE_10_1 100100 -#define __IPHONE_10_2 100200 -#define __IPHONE_10_3 100300 -#define __IPHONE_11_0 110000 -#define __IPHONE_11_1 110100 -#define __IPHONE_11_2 110200 -#define __IPHONE_11_3 110300 -#define __IPHONE_11_4 110400 -#define __IPHONE_12_0 120000 -#define __IPHONE_12_1 120100 -#define __IPHONE_12_2 120200 -#define __IPHONE_12_3 120300 -#define __IPHONE_13_0 130000 -#define __IPHONE_13_1 130100 -#define __IPHONE_13_2 130200 -#define __IPHONE_13_3 130300 -#define __IPHONE_13_4 130400 -#define __IPHONE_13_5 130500 -#define __IPHONE_13_6 130600 -/* __IPHONE_NA is not defined to a value but is uses as a token by macros to indicate that the API is unavailable */ - -#define __TVOS_9_0 90000 -#define __TVOS_9_1 90100 -#define __TVOS_9_2 90200 -#define __TVOS_10_0 100000 -#define __TVOS_10_0_1 100001 -#define __TVOS_10_1 100100 -#define __TVOS_10_2 100200 -#define __TVOS_11_0 110000 -#define __TVOS_11_1 110100 -#define __TVOS_11_2 110200 -#define __TVOS_11_3 110300 -#define __TVOS_11_4 110400 -#define __TVOS_12_0 120000 -#define __TVOS_12_1 120100 -#define __TVOS_12_2 120200 -#define __TVOS_12_3 120300 -#define __TVOS_13_0 130000 -#define __TVOS_13_2 130200 -#define __TVOS_13_3 130300 -#define __TVOS_13_4 130400 - -#define __WATCHOS_1_0 10000 -#define __WATCHOS_2_0 20000 -#define __WATCHOS_2_1 20100 -#define __WATCHOS_2_2 20200 -#define __WATCHOS_3_0 30000 -#define __WATCHOS_3_1 30100 -#define __WATCHOS_3_1_1 30101 -#define __WATCHOS_3_2 30200 -#define __WATCHOS_4_0 40000 -#define __WATCHOS_4_1 40100 -#define __WATCHOS_4_2 40200 -#define __WATCHOS_4_3 40300 -#define __WATCHOS_5_0 50000 -#define __WATCHOS_5_1 50100 -#define __WATCHOS_5_2 50200 -#define __WATCHOS_6_0 60000 -#define __WATCHOS_6_1 60100 -#define __WATCHOS_6_2 60200 - -#define __DRIVERKIT_19_0 190000 -#endif /* __MAC_10_0 */ - -#include - -#ifdef __IPHONE_OS_VERSION_MIN_REQUIRED - #define __OSX_AVAILABLE_STARTING(_osx, _ios) __AVAILABILITY_INTERNAL##_ios - #define __OSX_AVAILABLE_BUT_DEPRECATED(_osxIntro, _osxDep, _iosIntro, _iosDep) \ - __AVAILABILITY_INTERNAL##_iosIntro##_DEP##_iosDep - #define __OSX_AVAILABLE_BUT_DEPRECATED_MSG(_osxIntro, _osxDep, _iosIntro, _iosDep, _msg) \ - __AVAILABILITY_INTERNAL##_iosIntro##_DEP##_iosDep##_MSG(_msg) - -#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) - - #if defined(__has_builtin) - #if __has_builtin(__is_target_arch) - #if __has_builtin(__is_target_vendor) - #if __has_builtin(__is_target_os) - #if __has_builtin(__is_target_environment) - #if __has_builtin(__is_target_variant_os) - #if __has_builtin(__is_target_variant_environment) - #if (__is_target_arch(x86_64) && __is_target_vendor(apple) && ((__is_target_os(ios) && __is_target_environment(macabi)) || (__is_target_variant_os(ios) && __is_target_variant_environment(macabi)))) - #define __OSX_AVAILABLE_STARTING(_osx, _ios) __AVAILABILITY_INTERNAL##_osx __AVAILABILITY_INTERNAL##_ios - #define __OSX_AVAILABLE_BUT_DEPRECATED(_osxIntro, _osxDep, _iosIntro, _iosDep) \ - __AVAILABILITY_INTERNAL##_osxIntro##_DEP##_osxDep __AVAILABILITY_INTERNAL##_iosIntro##_DEP##_iosDep - #define __OSX_AVAILABLE_BUT_DEPRECATED_MSG(_osxIntro, _osxDep, _iosIntro, _iosDep, _msg) \ - __AVAILABILITY_INTERNAL##_osxIntro##_DEP##_osxDep##_MSG(_msg) __AVAILABILITY_INTERNAL##_iosIntro##_DEP##_iosDep##_MSG(_msg) - #endif /* # if __is_target_arch... */ - #endif /* #if __has_builtin(__is_target_variant_environment) */ - #endif /* #if __has_builtin(__is_target_variant_os) */ - #endif /* #if __has_builtin(__is_target_environment) */ - #endif /* #if __has_builtin(__is_target_os) */ - #endif /* #if __has_builtin(__is_target_vendor) */ - #endif /* #if __has_builtin(__is_target_arch) */ - #endif /* #if defined(__has_builtin) */ - - #ifndef __OSX_AVAILABLE_STARTING - #if defined(__has_attribute) && defined(__has_feature) - #if __has_attribute(availability) - #define __OSX_AVAILABLE_STARTING(_osx, _ios) __AVAILABILITY_INTERNAL##_osx - #define __OSX_AVAILABLE_BUT_DEPRECATED(_osxIntro, _osxDep, _iosIntro, _iosDep) \ - __AVAILABILITY_INTERNAL##_osxIntro##_DEP##_osxDep - #define __OSX_AVAILABLE_BUT_DEPRECATED_MSG(_osxIntro, _osxDep, _iosIntro, _iosDep, _msg) \ - __AVAILABILITY_INTERNAL##_osxIntro##_DEP##_osxDep##_MSG(_msg) - #else - #define __OSX_AVAILABLE_STARTING(_osx, _ios) - #define __OSX_AVAILABLE_BUT_DEPRECATED(_osxIntro, _osxDep, _iosIntro, _iosDep) - #define __OSX_AVAILABLE_BUT_DEPRECATED_MSG(_osxIntro, _osxDep, _iosIntro, _iosDep, _msg) - #endif - #else - #define __OSX_AVAILABLE_STARTING(_osx, _ios) - #define __OSX_AVAILABLE_BUT_DEPRECATED(_osxIntro, _osxDep, _iosIntro, _iosDep) - #define __OSX_AVAILABLE_BUT_DEPRECATED_MSG(_osxIntro, _osxDep, _iosIntro, _iosDep, _msg) - #endif -#endif /* __OSX_AVAILABLE_STARTING */ - -#else - #define __OSX_AVAILABLE_STARTING(_osx, _ios) - #define __OSX_AVAILABLE_BUT_DEPRECATED(_osxIntro, _osxDep, _iosIntro, _iosDep) - #define __OSX_AVAILABLE_BUT_DEPRECATED_MSG(_osxIntro, _osxDep, _iosIntro, _iosDep, _msg) -#endif - - -#if defined(__has_feature) - #if __has_feature(attribute_availability_with_message) - #define __OS_AVAILABILITY(_target, _availability) __attribute__((availability(_target,_availability))) - #define __OS_AVAILABILITY_MSG(_target, _availability, _msg) __attribute__((availability(_target,_availability,message=_msg))) - #elif __has_feature(attribute_availability) - #define __OS_AVAILABILITY(_target, _availability) __attribute__((availability(_target,_availability))) - #define __OS_AVAILABILITY_MSG(_target, _availability, _msg) __attribute__((availability(_target,_availability))) - #else - #define __OS_AVAILABILITY(_target, _availability) - #define __OS_AVAILABILITY_MSG(_target, _availability, _msg) - #endif -#else - #define __OS_AVAILABILITY(_target, _availability) - #define __OS_AVAILABILITY_MSG(_target, _availability, _msg) -#endif - - -/* for use to document app extension usage */ -#if defined(__has_feature) - #if __has_feature(attribute_availability_app_extension) - #define __OSX_EXTENSION_UNAVAILABLE(_msg) __OS_AVAILABILITY_MSG(macosx_app_extension,unavailable,_msg) - #define __IOS_EXTENSION_UNAVAILABLE(_msg) __OS_AVAILABILITY_MSG(ios_app_extension,unavailable,_msg) - #else - #define __OSX_EXTENSION_UNAVAILABLE(_msg) - #define __IOS_EXTENSION_UNAVAILABLE(_msg) - #endif -#else - #define __OSX_EXTENSION_UNAVAILABLE(_msg) - #define __IOS_EXTENSION_UNAVAILABLE(_msg) -#endif - -#define __OS_EXTENSION_UNAVAILABLE(_msg) __OSX_EXTENSION_UNAVAILABLE(_msg) __IOS_EXTENSION_UNAVAILABLE(_msg) - - - -/* for use marking APIs available info for Mac OSX */ -#if defined(__has_attribute) - #if __has_attribute(availability) - #define __OSX_UNAVAILABLE __OS_AVAILABILITY(macosx,unavailable) - #define __OSX_AVAILABLE(_vers) __OS_AVAILABILITY(macosx,introduced=_vers) - #define __OSX_DEPRECATED(_start, _dep, _msg) __OSX_AVAILABLE(_start) __OS_AVAILABILITY_MSG(macosx,deprecated=_dep,_msg) - #endif -#endif - -#ifndef __OSX_UNAVAILABLE - #define __OSX_UNAVAILABLE -#endif - -#ifndef __OSX_AVAILABLE - #define __OSX_AVAILABLE(_vers) -#endif - -#ifndef __OSX_DEPRECATED - #define __OSX_DEPRECATED(_start, _dep, _msg) -#endif - - -/* for use marking APIs available info for iOS */ -#if defined(__has_attribute) - #if __has_attribute(availability) - #define __IOS_UNAVAILABLE __OS_AVAILABILITY(ios,unavailable) - #define __IOS_PROHIBITED __OS_AVAILABILITY(ios,unavailable) - #define __IOS_AVAILABLE(_vers) __OS_AVAILABILITY(ios,introduced=_vers) - #define __IOS_DEPRECATED(_start, _dep, _msg) __IOS_AVAILABLE(_start) __OS_AVAILABILITY_MSG(ios,deprecated=_dep,_msg) - #endif -#endif - -#ifndef __IOS_UNAVAILABLE - #define __IOS_UNAVAILABLE -#endif - -#ifndef __IOS_PROHIBITED - #define __IOS_PROHIBITED -#endif - -#ifndef __IOS_AVAILABLE - #define __IOS_AVAILABLE(_vers) -#endif - -#ifndef __IOS_DEPRECATED - #define __IOS_DEPRECATED(_start, _dep, _msg) -#endif - - -/* for use marking APIs available info for tvOS */ -#if defined(__has_feature) - #if __has_feature(attribute_availability_tvos) - #define __TVOS_UNAVAILABLE __OS_AVAILABILITY(tvos,unavailable) - #define __TVOS_PROHIBITED __OS_AVAILABILITY(tvos,unavailable) - #define __TVOS_AVAILABLE(_vers) __OS_AVAILABILITY(tvos,introduced=_vers) - #define __TVOS_DEPRECATED(_start, _dep, _msg) __TVOS_AVAILABLE(_start) __OS_AVAILABILITY_MSG(tvos,deprecated=_dep,_msg) - #endif -#endif - -#ifndef __TVOS_UNAVAILABLE - #define __TVOS_UNAVAILABLE -#endif - -#ifndef __TVOS_PROHIBITED - #define __TVOS_PROHIBITED -#endif - -#ifndef __TVOS_AVAILABLE - #define __TVOS_AVAILABLE(_vers) -#endif - -#ifndef __TVOS_DEPRECATED - #define __TVOS_DEPRECATED(_start, _dep, _msg) -#endif - - -/* for use marking APIs available info for Watch OS */ -#if defined(__has_feature) - #if __has_feature(attribute_availability_watchos) - #define __WATCHOS_UNAVAILABLE __OS_AVAILABILITY(watchos,unavailable) - #define __WATCHOS_PROHIBITED __OS_AVAILABILITY(watchos,unavailable) - #define __WATCHOS_AVAILABLE(_vers) __OS_AVAILABILITY(watchos,introduced=_vers) - #define __WATCHOS_DEPRECATED(_start, _dep, _msg) __WATCHOS_AVAILABLE(_start) __OS_AVAILABILITY_MSG(watchos,deprecated=_dep,_msg) - #endif -#endif - -#ifndef __WATCHOS_UNAVAILABLE - #define __WATCHOS_UNAVAILABLE -#endif - -#ifndef __WATCHOS_PROHIBITED - #define __WATCHOS_PROHIBITED -#endif - -#ifndef __WATCHOS_AVAILABLE - #define __WATCHOS_AVAILABLE(_vers) -#endif - -#ifndef __WATCHOS_DEPRECATED - #define __WATCHOS_DEPRECATED(_start, _dep, _msg) -#endif - - -/* for use marking APIs unavailable for swift */ -#if defined(__has_feature) - #if __has_feature(attribute_availability_swift) - #define __SWIFT_UNAVAILABLE __OS_AVAILABILITY(swift,unavailable) - #define __SWIFT_UNAVAILABLE_MSG(_msg) __OS_AVAILABILITY_MSG(swift,unavailable,_msg) - #endif -#endif - -#ifndef __SWIFT_UNAVAILABLE - #define __SWIFT_UNAVAILABLE -#endif - -#ifndef __SWIFT_UNAVAILABLE_MSG - #define __SWIFT_UNAVAILABLE_MSG(_msg) -#endif - -/* - Macros for defining which versions/platform a given symbol can be used. - - @see http://clang.llvm.org/docs/AttributeReference.html#availability - - * Note that these macros are only compatible with clang compilers that - * support the following target selection options: - * - * -mmacosx-version-min - * -miphoneos-version-min - * -mwatchos-version-min - * -mtvos-version-min - */ - -#if defined(__has_feature) && defined(__has_attribute) - #if __has_attribute(availability) - - /* - * API Introductions - * - * Use to specify the release that a particular API became available. - * - * Platform names: - * macos, ios, tvos, watchos - * - * Examples: - * __API_AVAILABLE(macos(10.10)) - * __API_AVAILABLE(macos(10.9), ios(10.0)) - * __API_AVAILABLE(macos(10.4), ios(8.0), watchos(2.0), tvos(10.0)) - * __API_AVAILABLE(driverkit(19.0)) - */ - #define __API_AVAILABLE(...) __API_AVAILABLE_GET_MACRO(__VA_ARGS__,__API_AVAILABLE7, __API_AVAILABLE6, __API_AVAILABLE5, __API_AVAILABLE4, __API_AVAILABLE3, __API_AVAILABLE2, __API_AVAILABLE1, 0)(__VA_ARGS__) - - #define __API_AVAILABLE_BEGIN(...) _Pragma("clang attribute push") __API_AVAILABLE_BEGIN_GET_MACRO(__VA_ARGS__,__API_AVAILABLE_BEGIN7, __API_AVAILABLE_BEGIN6, __API_AVAILABLE_BEGIN5, __API_AVAILABLE_BEGIN4, __API_AVAILABLE_BEGIN3, __API_AVAILABLE_BEGIN2, __API_AVAILABLE_BEGIN1, 0)(__VA_ARGS__) - #define __API_AVAILABLE_END _Pragma("clang attribute pop") - - /* - * API Deprecations - * - * Use to specify the release that a particular API became unavailable. - * - * Platform names: - * macos, ios, tvos, watchos - * - * Examples: - * - * __API_DEPRECATED("No longer supported", macos(10.4, 10.8)) - * __API_DEPRECATED("No longer supported", macos(10.4, 10.8), ios(2.0, 3.0), watchos(2.0, 3.0), tvos(9.0, 10.0)) - * - * __API_DEPRECATED_WITH_REPLACEMENT("-setName:", tvos(10.0, 10.4), ios(9.0, 10.0)) - * __API_DEPRECATED_WITH_REPLACEMENT("SomeClassName", macos(10.4, 10.6), watchos(2.0, 3.0)) - */ - #define __API_DEPRECATED(...) __API_DEPRECATED_MSG_GET_MACRO(__VA_ARGS__,__API_DEPRECATED_MSG8,__API_DEPRECATED_MSG7,__API_DEPRECATED_MSG6,__API_DEPRECATED_MSG5,__API_DEPRECATED_MSG4,__API_DEPRECATED_MSG3,__API_DEPRECATED_MSG2,__API_DEPRECATED_MSG1, 0)(__VA_ARGS__) - #define __API_DEPRECATED_WITH_REPLACEMENT(...) __API_DEPRECATED_REP_GET_MACRO(__VA_ARGS__,__API_DEPRECATED_REP8,__API_DEPRECATED_REP7,__API_DEPRECATED_REP6,__API_DEPRECATED_REP5,__API_DEPRECATED_REP4,__API_DEPRECATED_REP3,__API_DEPRECATED_REP2,__API_DEPRECATED_REP1, 0)(__VA_ARGS__) - - #define __API_DEPRECATED_BEGIN(...) _Pragma("clang attribute push") __API_DEPRECATED_BEGIN_MSG_GET_MACRO(__VA_ARGS__,__API_DEPRECATED_BEGIN_MSG8,__API_DEPRECATED_BEGIN_MSG7, __API_DEPRECATED_BEGIN_MSG6, __API_DEPRECATED_BEGIN_MSG5, __API_DEPRECATED_BEGIN_MSG4, __API_DEPRECATED_BEGIN_MSG3, __API_DEPRECATED_BEGIN_MSG2, __API_DEPRECATED_BEGIN_MSG1, 0)(__VA_ARGS__) - #define __API_DEPRECATED_END _Pragma("clang attribute pop") - - #define __API_DEPRECATED_WITH_REPLACEMENT_BEGIN(...) _Pragma("clang attribute push") __API_DEPRECATED_BEGIN_REP_GET_MACRO(__VA_ARGS__,__API_DEPRECATED_BEGIN_REP8,__API_DEPRECATED_BEGIN_REP7, __API_DEPRECATED_BEGIN_REP6, __API_DEPRECATED_BEGIN_REP5, __API_DEPRECATED_BEGIN_REP4, __API_DEPRECATED_BEGIN_REP3, __API_DEPRECATED_BEGIN_REP2, __API_DEPRECATED_BEGIN_REP1, 0)(__VA_ARGS__) - #define __API_DEPRECATED_WITH_REPLACEMENT_END _Pragma("clang attribute pop") - - /* - * API Unavailability - * Use to specify that an API is unavailable for a particular platform. - * - * Example: - * __API_UNAVAILABLE(macos) - * __API_UNAVAILABLE(watchos, tvos) - */ - #define __API_UNAVAILABLE(...) __API_UNAVAILABLE_GET_MACRO(__VA_ARGS__,__API_UNAVAILABLE7,__API_UNAVAILABLE6,__API_UNAVAILABLE5,__API_UNAVAILABLE4,__API_UNAVAILABLE3,__API_UNAVAILABLE2,__API_UNAVAILABLE1, 0)(__VA_ARGS__) - - #define __API_UNAVAILABLE_BEGIN(...) _Pragma("clang attribute push") __API_UNAVAILABLE_BEGIN_GET_MACRO(__VA_ARGS__,__API_UNAVAILABLE_BEGIN7,__API_UNAVAILABLE_BEGIN6, __API_UNAVAILABLE_BEGIN5, __API_UNAVAILABLE_BEGIN4, __API_UNAVAILABLE_BEGIN3, __API_UNAVAILABLE_BEGIN2, __API_UNAVAILABLE_BEGIN1, 0)(__VA_ARGS__) - #define __API_UNAVAILABLE_END _Pragma("clang attribute pop") - #else - - /* - * Evaluate to nothing for compilers that don't support availability. - */ - - #define __API_AVAILABLE(...) - #define __API_AVAILABLE_BEGIN(...) - #define __API_AVAILABLE_END - #define __API_DEPRECATED(...) - #define __API_DEPRECATED_WITH_REPLACEMENT(...) - #define __API_DEPRECATED_BEGIN(...) - #define __API_DEPRECATED_END - #define __API_DEPRECATED_WITH_REPLACEMENT_BEGIN(...) - #define __API_DEPRECATED_WITH_REPLACEMENT_END - #define __API_UNAVAILABLE(...) - #define __API_UNAVAILABLE_BEGIN(...) - #define __API_UNAVAILABLE_END - #endif /* __has_attribute(availability) */ -#else - - /* - * Evaluate to nothing for compilers that don't support clang language extensions. - */ - - #define __API_AVAILABLE(...) - #define __API_AVAILABLE_BEGIN(...) - #define __API_AVAILABLE_END - #define __API_DEPRECATED(...) - #define __API_DEPRECATED_WITH_REPLACEMENT(...) - #define __API_DEPRECATED_BEGIN(...) - #define __API_DEPRECATED_END - #define __API_DEPRECATED_WITH_REPLACEMENT_BEGIN(...) - #define __API_DEPRECATED_WITH_REPLACEMENT_END - #define __API_UNAVAILABLE(...) - #define __API_UNAVAILABLE_BEGIN(...) - #define __API_UNAVAILABLE_END -#endif /* #if defined(__has_feature) && defined(__has_attribute) */ - -#if __has_include() - #include -#endif - -/* - * If SPI decorations have not been defined elsewhere, disable them. - */ - -#ifndef __SPI_AVAILABLE - #define __SPI_AVAILABLE(...) -#endif - -#ifndef __SPI_DEPRECATED - #define __SPI_DEPRECATED(...) -#endif - -#ifndef __SPI_DEPRECATED_WITH_REPLACEMENT - #define __SPI_DEPRECATED_WITH_REPLACEMENT(...) -#endif - -#endif /* __AVAILABILITY__ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/AvailabilityInternal.h b/lib/libc/include/x86_64-macos-gnu/AvailabilityInternal.h index 11e6d1ed17..6a35a16782 100644 --- a/lib/libc/include/x86_64-macos-gnu/AvailabilityInternal.h +++ b/lib/libc/include/x86_64-macos-gnu/AvailabilityInternal.h @@ -45,6 +45,9 @@ #ifdef __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ /* compiler sets __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ when -miphoneos-version-min is used */ #define __IPHONE_OS_VERSION_MIN_REQUIRED __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ + /* set to 1 when RC_FALLBACK_PLATFORM=iphoneos */ + #elif 0 + #define __IPHONE_OS_VERSION_MIN_REQUIRED __IPHONE_14_0 #endif #endif /* __IPHONE_OS_VERSION_MIN_REQUIRED */ @@ -52,7 +55,7 @@ #ifdef __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ /* compiler sets __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ when -mtvos-version-min is used */ #define __TV_OS_VERSION_MIN_REQUIRED __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ - #define __TV_OS_VERSION_MAX_ALLOWED __TVOS_13_0 + #define __TV_OS_VERSION_MAX_ALLOWED __TVOS_14_5 /* for compatibility with existing code. New code should use platform specific checks */ #define __IPHONE_OS_VERSION_MIN_REQUIRED 90000 #endif @@ -62,7 +65,7 @@ #ifdef __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ /* compiler sets __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ when -mwatchos-version-min is used */ #define __WATCH_OS_VERSION_MIN_REQUIRED __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ - #define __WATCH_OS_VERSION_MAX_ALLOWED 60000 + #define __WATCH_OS_VERSION_MAX_ALLOWED __WATCHOS_7_4 /* for compatibility with existing code. New code should use platform specific checks */ #define __IPHONE_OS_VERSION_MIN_REQUIRED 90000 #endif @@ -72,7 +75,7 @@ #ifdef __ENVIRONMENT_BRIDGE_OS_VERSION_MIN_REQUIRED__ #define __BRIDGE_OS_VERSION_MIN_REQUIRED __ENVIRONMENT_BRIDGE_OS_VERSION_MIN_REQUIRED__ - #define __BRIDGE_OS_VERSION_MAX_ALLOWED 20000 + #define __BRIDGE_OS_VERSION_MAX_ALLOWED 50300 /* for compatibility with existing code. New code should use platform specific checks */ #define __IPHONE_OS_VERSION_MIN_REQUIRED 110000 #endif @@ -87,14 +90,14 @@ #ifdef __MAC_OS_X_VERSION_MIN_REQUIRED /* make sure a default max version is set */ #ifndef __MAC_OS_X_VERSION_MAX_ALLOWED - #define __MAC_OS_X_VERSION_MAX_ALLOWED __MAC_10_15 + #define __MAC_OS_X_VERSION_MAX_ALLOWED __MAC_11_3 #endif #endif /* __MAC_OS_X_VERSION_MIN_REQUIRED */ #ifdef __IPHONE_OS_VERSION_MIN_REQUIRED /* make sure a default max version is set */ #ifndef __IPHONE_OS_VERSION_MAX_ALLOWED - #define __IPHONE_OS_VERSION_MAX_ALLOWED __IPHONE_13_0 + #define __IPHONE_OS_VERSION_MAX_ALLOWED __IPHONE_14_5 #endif /* make sure a valid min is set */ #if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_2_0 @@ -2887,7 +2890,7 @@ #if __has_builtin(__is_target_environment) #if __has_builtin(__is_target_variant_os) #if __has_builtin(__is_target_variant_environment) - #if (__is_target_arch(x86_64) && __is_target_vendor(apple) && __is_target_os(ios) && __is_target_environment(macabi)) + #if ((__is_target_arch(x86_64) || __is_target_arch(arm64) || __is_target_arch(arm64e)) && __is_target_vendor(apple) && __is_target_os(ios) && __is_target_environment(macabi)) #define __AVAILABILITY_INTERNAL__IPHONE_COMPAT_VERSION __attribute__((availability(ios,introduced=4.0))) #define __AVAILABILITY_INTERNAL__IPHONE_COMPAT_VERSION_DEP__IPHONE_COMPAT_VERSION __attribute__((availability(ios,unavailable))) #define __AVAILABILITY_INTERNAL__IPHONE_COMPAT_VERSION_DEP__IPHONE_COMPAT_VERSION_MSG(_msg) __attribute__((availability(ios,unavailable))) @@ -4643,7 +4646,7 @@ /* * Swift compiler version - * Allows for project-agnostic “epochs” for frameworks imported into Swift via the Clang importer, like #if _compiler_version for Swift + * Allows for project-agnostic "epochs" for frameworks imported into Swift via the Clang importer, like #if _compiler_version for Swift * Example: * * #if __swift_compiler_version_at_least(800, 2, 20) diff --git a/lib/libc/include/x86_64-macos-gnu/AvailabilityMacros.h b/lib/libc/include/x86_64-macos-gnu/AvailabilityMacros.h index 9cc7100ffe..74537c5bd8 100644 --- a/lib/libc/include/x86_64-macos-gnu/AvailabilityMacros.h +++ b/lib/libc/include/x86_64-macos-gnu/AvailabilityMacros.h @@ -117,9 +117,11 @@ #define MAC_OS_X_VERSION_10_14_1 101401 #define MAC_OS_X_VERSION_10_14_4 101404 #define MAC_OS_X_VERSION_10_15 101500 -#define MAC_OS_X_VERSION_10_15_1 101501 +#define MAC_OS_VERSION_11_0 110000 +#define MAC_OS_VERSION_11_1 110100 +#define MAC_OS_VERSION_11_3 110300 -/* +/* * If min OS not specified, assume 10.4 for intel * Note: compiler driver may set _ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED_ based on MACOSX_DEPLOYMENT_TARGET environment variable */ @@ -144,10 +146,10 @@ * if max OS not specified, assume larger of (10.15, min) */ #ifndef MAC_OS_X_VERSION_MAX_ALLOWED - #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_15 + #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_VERSION_11_3 #define MAC_OS_X_VERSION_MAX_ALLOWED MAC_OS_X_VERSION_MIN_REQUIRED #else - #define MAC_OS_X_VERSION_MAX_ALLOWED MAC_OS_X_VERSION_10_15 + #define MAC_OS_X_VERSION_MAX_ALLOWED MAC_OS_VERSION_11_3 #endif #endif diff --git a/lib/libc/include/x86_64-macos-gnu/AvailabilityVersions.h b/lib/libc/include/x86_64-macos-gnu/AvailabilityVersions.h new file mode 100644 index 0000000000..591e541d7f --- /dev/null +++ b/lib/libc/include/x86_64-macos-gnu/AvailabilityVersions.h @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2019 by Apple Inc.. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef __AVAILABILITY_VERSIONS__ +#define __AVAILABILITY_VERSIONS__ + +#define __MAC_10_0 1000 +#define __MAC_10_1 1010 +#define __MAC_10_2 1020 +#define __MAC_10_3 1030 +#define __MAC_10_4 1040 +#define __MAC_10_5 1050 +#define __MAC_10_6 1060 +#define __MAC_10_7 1070 +#define __MAC_10_8 1080 +#define __MAC_10_9 1090 +#define __MAC_10_10 101000 +#define __MAC_10_10_2 101002 +#define __MAC_10_10_3 101003 +#define __MAC_10_11 101100 +#define __MAC_10_11_2 101102 +#define __MAC_10_11_3 101103 +#define __MAC_10_11_4 101104 +#define __MAC_10_12 101200 +#define __MAC_10_12_1 101201 +#define __MAC_10_12_2 101202 +#define __MAC_10_12_4 101204 +#define __MAC_10_13 101300 +#define __MAC_10_13_1 101301 +#define __MAC_10_13_2 101302 +#define __MAC_10_13_4 101304 +#define __MAC_10_14 101400 +#define __MAC_10_14_1 101401 +#define __MAC_10_14_4 101404 +#define __MAC_10_14_6 101406 +#define __MAC_10_15 101500 +#define __MAC_10_15_1 101501 +#define __MAC_10_15_4 101504 +#define __MAC_10_16 101600 +#define __MAC_11_0 110000 +#define __MAC_11_1 110100 +#define __MAC_11_3 110300 +/* __MAC_NA is not defined to a value but is used as a token by macros to indicate that the API is unavailable */ + +#define __IPHONE_2_0 20000 +#define __IPHONE_2_1 20100 +#define __IPHONE_2_2 20200 +#define __IPHONE_3_0 30000 +#define __IPHONE_3_1 30100 +#define __IPHONE_3_2 30200 +#define __IPHONE_4_0 40000 +#define __IPHONE_4_1 40100 +#define __IPHONE_4_2 40200 +#define __IPHONE_4_3 40300 +#define __IPHONE_5_0 50000 +#define __IPHONE_5_1 50100 +#define __IPHONE_6_0 60000 +#define __IPHONE_6_1 60100 +#define __IPHONE_7_0 70000 +#define __IPHONE_7_1 70100 +#define __IPHONE_8_0 80000 +#define __IPHONE_8_1 80100 +#define __IPHONE_8_2 80200 +#define __IPHONE_8_3 80300 +#define __IPHONE_8_4 80400 +#define __IPHONE_9_0 90000 +#define __IPHONE_9_1 90100 +#define __IPHONE_9_2 90200 +#define __IPHONE_9_3 90300 +#define __IPHONE_10_0 100000 +#define __IPHONE_10_1 100100 +#define __IPHONE_10_2 100200 +#define __IPHONE_10_3 100300 +#define __IPHONE_11_0 110000 +#define __IPHONE_11_1 110100 +#define __IPHONE_11_2 110200 +#define __IPHONE_11_3 110300 +#define __IPHONE_11_4 110400 +#define __IPHONE_12_0 120000 +#define __IPHONE_12_1 120100 +#define __IPHONE_12_2 120200 +#define __IPHONE_12_3 120300 +#define __IPHONE_12_4 120400 +#define __IPHONE_13_0 130000 +#define __IPHONE_13_1 130100 +#define __IPHONE_13_2 130200 +#define __IPHONE_13_3 130300 +#define __IPHONE_13_4 130400 +#define __IPHONE_13_5 130500 +#define __IPHONE_13_6 130600 +#define __IPHONE_13_7 130700 +#define __IPHONE_14_0 140000 +#define __IPHONE_14_1 140100 +#define __IPHONE_14_2 140200 +#define __IPHONE_14_3 140300 +#define __IPHONE_14_5 140500 +/* __IPHONE_NA is not defined to a value but is used as a token by macros to indicate that the API is unavailable */ + +#define __TVOS_9_0 90000 +#define __TVOS_9_1 90100 +#define __TVOS_9_2 90200 +#define __TVOS_10_0 100000 +#define __TVOS_10_0_1 100001 +#define __TVOS_10_1 100100 +#define __TVOS_10_2 100200 +#define __TVOS_11_0 110000 +#define __TVOS_11_1 110100 +#define __TVOS_11_2 110200 +#define __TVOS_11_3 110300 +#define __TVOS_11_4 110400 +#define __TVOS_12_0 120000 +#define __TVOS_12_1 120100 +#define __TVOS_12_2 120200 +#define __TVOS_12_3 120300 +#define __TVOS_12_4 120400 +#define __TVOS_13_0 130000 +#define __TVOS_13_2 130200 +#define __TVOS_13_3 130300 +#define __TVOS_13_4 130400 +#define __TVOS_14_0 140000 +#define __TVOS_14_1 140100 +#define __TVOS_14_2 140200 +#define __TVOS_14_3 140300 +#define __TVOS_14_5 140500 + +#define __WATCHOS_1_0 10000 +#define __WATCHOS_2_0 20000 +#define __WATCHOS_2_1 20100 +#define __WATCHOS_2_2 20200 +#define __WATCHOS_3_0 30000 +#define __WATCHOS_3_1 30100 +#define __WATCHOS_3_1_1 30101 +#define __WATCHOS_3_2 30200 +#define __WATCHOS_4_0 40000 +#define __WATCHOS_4_1 40100 +#define __WATCHOS_4_2 40200 +#define __WATCHOS_4_3 40300 +#define __WATCHOS_5_0 50000 +#define __WATCHOS_5_1 50100 +#define __WATCHOS_5_2 50200 +#define __WATCHOS_5_3 50300 +#define __WATCHOS_6_0 60000 +#define __WATCHOS_6_1 60100 +#define __WATCHOS_6_2 60200 +#define __WATCHOS_7_0 70000 +#define __WATCHOS_7_1 70100 +#define __WATCHOS_7_2 70200 +#define __WATCHOS_7_3 70300 +#define __WATCHOS_7_4 70400 + +/* + * Set up standard Mac OS X versions + */ + +#if (!defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || defined(_DARWIN_C_SOURCE) + +#define MAC_OS_X_VERSION_10_0 1000 +#define MAC_OS_X_VERSION_10_1 1010 +#define MAC_OS_X_VERSION_10_2 1020 +#define MAC_OS_X_VERSION_10_3 1030 +#define MAC_OS_X_VERSION_10_4 1040 +#define MAC_OS_X_VERSION_10_5 1050 +#define MAC_OS_X_VERSION_10_6 1060 +#define MAC_OS_X_VERSION_10_7 1070 +#define MAC_OS_X_VERSION_10_8 1080 +#define MAC_OS_X_VERSION_10_9 1090 +#define MAC_OS_X_VERSION_10_10 101000 +#define MAC_OS_X_VERSION_10_10_2 101002 +#define MAC_OS_X_VERSION_10_10_3 101003 +#define MAC_OS_X_VERSION_10_11 101100 +#define MAC_OS_X_VERSION_10_11_2 101102 +#define MAC_OS_X_VERSION_10_11_3 101103 +#define MAC_OS_X_VERSION_10_11_4 101104 +#define MAC_OS_X_VERSION_10_12 101200 +#define MAC_OS_X_VERSION_10_12_1 101201 +#define MAC_OS_X_VERSION_10_12_2 101202 +#define MAC_OS_X_VERSION_10_12_4 101204 +#define MAC_OS_X_VERSION_10_13 101300 +#define MAC_OS_X_VERSION_10_13_1 101301 +#define MAC_OS_X_VERSION_10_13_2 101302 +#define MAC_OS_X_VERSION_10_13_4 101304 +#define MAC_OS_X_VERSION_10_14 101400 +#define MAC_OS_X_VERSION_10_14_1 101401 +#define MAC_OS_X_VERSION_10_14_4 101404 +#define MAC_OS_X_VERSION_10_14_6 101406 +#define MAC_OS_X_VERSION_10_15 101500 +#define MAC_OS_X_VERSION_10_15_1 101501 +#define MAC_OS_X_VERSION_10_16 101600 +#define MAC_OS_VERSION_11_0 110000 + +#endif /* #if (!defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || defined(_DARWIN_C_SOURCE) */ + +#define __DRIVERKIT_19_0 190000 +#define __DRIVERKIT_20_0 200000 + +#endif /* __AVAILABILITY_VERSIONS__ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/TargetConditionals.h b/lib/libc/include/x86_64-macos-gnu/TargetConditionals.h deleted file mode 100644 index 896956f33d..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/TargetConditionals.h +++ /dev/null @@ -1,502 +0,0 @@ -/* - * Copyright (c) 2000-2014 by Apple Inc.. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - -/* - File: TargetConditionals.h - - Contains: Autoconfiguration of TARGET_ conditionals for Mac OS X and iPhone - - Note: TargetConditionals.h in 3.4 Universal Interfaces works - with all compilers. This header only recognizes compilers - known to run on Mac OS X. - -*/ - -#ifndef __TARGETCONDITIONALS__ -#define __TARGETCONDITIONALS__ - -/**************************************************************************************************** - - TARGET_CPU_* - These conditionals specify which microprocessor instruction set is being - generated. At most one of these is true, the rest are false. - - TARGET_CPU_PPC - Compiler is generating PowerPC instructions for 32-bit mode - TARGET_CPU_PPC64 - Compiler is generating PowerPC instructions for 64-bit mode - TARGET_CPU_68K - Compiler is generating 680x0 instructions - TARGET_CPU_X86 - Compiler is generating x86 instructions for 32-bit mode - TARGET_CPU_X86_64 - Compiler is generating x86 instructions for 64-bit mode - TARGET_CPU_ARM - Compiler is generating ARM instructions for 32-bit mode - TARGET_CPU_ARM64 - Compiler is generating ARM instructions for 64-bit mode - TARGET_CPU_MIPS - Compiler is generating MIPS instructions - TARGET_CPU_SPARC - Compiler is generating Sparc instructions - TARGET_CPU_ALPHA - Compiler is generating Dec Alpha instructions - - - TARGET_OS_* - These conditionals specify in which Operating System the generated code will - run. Indention is used to show which conditionals are evolutionary subclasses. - - The MAC/WIN32/UNIX conditionals are mutually exclusive. - The IOS/TV/WATCH conditionals are mutually exclusive. - - - TARGET_OS_WIN32 - Generated code will run under 32-bit Windows - TARGET_OS_UNIX - Generated code will run under some Unix (not OSX) - TARGET_OS_MAC - Generated code will run under Mac OS X variant - TARGET_OS_OSX - Generated code will run under OS X devices - TARGET_OS_IPHONE - Generated code for firmware, devices, or simulator - TARGET_OS_IOS - Generated code will run under iOS - TARGET_OS_TV - Generated code will run under Apple TV OS - TARGET_OS_WATCH - Generated code will run under Apple Watch OS - TARGET_OS_BRIDGE - Generated code will run under Bridge devices - TARGET_OS_MACCATALYST - Generated code will run under macOS - TARGET_OS_SIMULATOR - Generated code will run under a simulator - - TARGET_OS_EMBEDDED - DEPRECATED: Use TARGET_OS_IPHONE and/or TARGET_OS_SIMULATOR instead - TARGET_IPHONE_SIMULATOR - DEPRECATED: Same as TARGET_OS_SIMULATOR - TARGET_OS_NANO - DEPRECATED: Same as TARGET_OS_WATCH - - +----------------------------------------------------------------+ - | TARGET_OS_MAC | - | +---+ +-----------------------------------------------------+ | - | | | | TARGET_OS_IPHONE | | - | |OSX| | +-----+ +----+ +-------+ +--------+ +-------------+ | | - | | | | | IOS | | TV | | WATCH | | BRIDGE | | MACCATALYST | | | - | | | | +-----+ +----+ +-------+ +--------+ +-------------+ | | - | +---+ +-----------------------------------------------------+ | - +----------------------------------------------------------------+ - - TARGET_RT_* - These conditionals specify in which runtime the generated code will - run. This is needed when the OS and CPU support more than one runtime - (e.g. Mac OS X supports CFM and mach-o). - - TARGET_RT_LITTLE_ENDIAN - Generated code uses little endian format for integers - TARGET_RT_BIG_ENDIAN - Generated code uses big endian format for integers - TARGET_RT_64_BIT - Generated code uses 64-bit pointers - TARGET_RT_MAC_CFM - TARGET_OS_MAC is true and CFM68K or PowerPC CFM (TVectors) are used - TARGET_RT_MAC_MACHO - TARGET_OS_MAC is true and Mach-O/dlyd runtime is used - - -****************************************************************************************************/ - - /* - * TARGET_OS conditionals can be enabled via clang preprocessor extensions: - * - * __is_target_arch - * __is_target_vendor - * __is_target_os - * __is_target_environment - * - * “-target=x86_64-apple-ios12-macabi” - * TARGET_OS_MAC=1 - * TARGET_OS_IPHONE=1 - * TARGET_OS_IOS=1 - * TARGET_OS_MACCATALYST=1 - * - * “-target=x86_64-apple-ios12-simulator” - * TARGET_OS_MAC=1 - * TARGET_OS_IPHONE=1 - * TARGET_OS_IOS=1 - * TARGET_OS_SIMULATOR=1 - * - * DYNAMIC_TARGETS_ENABLED indicates that the core TARGET_OS macros were enabled via clang preprocessor extensions. - * If this value is not set, the macro enablements will fall back to the static behavior. - * It is disabled by default. - */ - -#if defined(__has_builtin) - #if __has_builtin(__is_target_arch) - #if __has_builtin(__is_target_vendor) - #if __has_builtin(__is_target_os) - #if __has_builtin(__is_target_environment) - - /* “-target=x86_64-apple-ios12-macabi” */ - #if __is_target_arch(x86_64) && __is_target_vendor(apple) && __is_target_os(ios) && __is_target_environment(macabi) - #define TARGET_OS_OSX 0 - #define TARGET_OS_IPHONE 1 - #define TARGET_OS_IOS 1 - #define TARGET_OS_WATCH 0 - - #define TARGET_OS_TV 0 - #define TARGET_OS_SIMULATOR 0 - #define TARGET_OS_EMBEDDED 0 - #define TARGET_OS_RTKIT 0 - #define TARGET_OS_MACCATALYST 1 - #define TARGET_OS_MACCATALYST 1 - #ifndef TARGET_OS_UIKITFORMAC - #define TARGET_OS_UIKITFORMAC 1 - #endif - #define TARGET_OS_DRIVERKIT 0 - #define DYNAMIC_TARGETS_ENABLED 1 - #endif - - /* “-target=x86_64-apple-ios12-simulator” */ - #if __is_target_arch(x86_64) && __is_target_vendor(apple) && __is_target_os(ios) && __is_target_environment(simulator) - #define TARGET_OS_OSX 0 - #define TARGET_OS_IPHONE 1 - #define TARGET_OS_IOS 1 - #define TARGET_OS_WATCH 0 - - #define TARGET_OS_TV 0 - #define TARGET_OS_SIMULATOR 1 - #define TARGET_OS_EMBEDDED 0 - #define TARGET_OS_RTKIT 0 - #define TARGET_OS_MACCATALYST 0 - #define TARGET_OS_MACCATALYST 0 - #ifndef TARGET_OS_UIKITFORMAC - #define TARGET_OS_UIKITFORMAC 0 - #endif - #define TARGET_OS_DRIVERKIT 0 - #define DYNAMIC_TARGETS_ENABLED 1 - #endif - - /* -target=x86_64-apple-driverkit19.0 */ - #if __is_target_arch(x86_64) && __is_target_vendor(apple) && __is_target_os(driverkit) - #define TARGET_OS_OSX 0 - #define TARGET_OS_IPHONE 0 - #define TARGET_OS_IOS 0 - #define TARGET_OS_WATCH 0 - - #define TARGET_OS_TV 0 - #define TARGET_OS_SIMULATOR 0 - #define TARGET_OS_EMBEDDED 0 - #define TARGET_OS_RTKIT 0 - #define TARGET_OS_MACCATALYST 0 - #define TARGET_OS_MACCATALYST 0 - #ifndef TARGET_OS_UIKITFORMAC - #define TARGET_OS_UIKITFORMAC 0 - #endif - #define TARGET_OS_DRIVERKIT 1 - #define DYNAMIC_TARGETS_ENABLED 1 - #endif - - #endif /* #if __has_builtin(__is_target_environment) */ - #endif /* #if __has_builtin(__is_target_os) */ - #endif /* #if __has_builtin(__is_target_vendor) */ - #endif /* #if __has_builtin(__is_target_arch) */ -#endif /* #if defined(__has_builtin) */ - - -#ifndef DYNAMIC_TARGETS_ENABLED - #define DYNAMIC_TARGETS_ENABLED 0 -#endif /* DYNAMIC_TARGETS_ENABLED */ - -/* - * gcc based compiler used on Mac OS X - */ -#if defined(__GNUC__) && ( defined(__APPLE_CPP__) || defined(__APPLE_CC__) || defined(__MACOS_CLASSIC__) ) - #define TARGET_OS_MAC 1 - #define TARGET_OS_WIN32 0 - #define TARGET_OS_UNIX 0 - - #if !DYNAMIC_TARGETS_ENABLED - #define TARGET_OS_OSX 1 - #define TARGET_OS_IPHONE 0 - #define TARGET_OS_IOS 0 - #define TARGET_OS_WATCH 0 - - #define TARGET_OS_TV 0 - #define TARGET_OS_MACCATALYST 0 - #define TARGET_OS_MACCATALYST 0 - #ifndef TARGET_OS_UIKITFORMAC - #define TARGET_OS_UIKITFORMAC 0 - #endif - #define TARGET_OS_SIMULATOR 0 - #define TARGET_OS_EMBEDDED 0 - #define TARGET_OS_RTKIT 0 - #define TARGET_OS_DRIVERKIT 0 - #endif - - #define TARGET_IPHONE_SIMULATOR TARGET_OS_SIMULATOR /* deprecated */ - #define TARGET_OS_NANO TARGET_OS_WATCH /* deprecated */ - #define TARGET_ABI_USES_IOS_VALUES (TARGET_OS_IPHONE && !TARGET_OS_MACCATALYST) - #if defined(__ppc__) - #define TARGET_CPU_PPC 1 - #define TARGET_CPU_PPC64 0 - #define TARGET_CPU_68K 0 - #define TARGET_CPU_X86 0 - #define TARGET_CPU_X86_64 0 - #define TARGET_CPU_ARM 0 - #define TARGET_CPU_ARM64 0 - #define TARGET_CPU_MIPS 0 - #define TARGET_CPU_SPARC 0 - #define TARGET_CPU_ALPHA 0 - #define TARGET_RT_LITTLE_ENDIAN 0 - #define TARGET_RT_BIG_ENDIAN 1 - #define TARGET_RT_64_BIT 0 - #ifdef __MACOS_CLASSIC__ - #define TARGET_RT_MAC_CFM 1 - #define TARGET_RT_MAC_MACHO 0 - #else - #define TARGET_RT_MAC_CFM 0 - #define TARGET_RT_MAC_MACHO 1 - #endif - #elif defined(__ppc64__) - #define TARGET_CPU_PPC 0 - #define TARGET_CPU_PPC64 1 - #define TARGET_CPU_68K 0 - #define TARGET_CPU_X86 0 - #define TARGET_CPU_X86_64 0 - #define TARGET_CPU_ARM 0 - #define TARGET_CPU_ARM64 0 - #define TARGET_CPU_MIPS 0 - #define TARGET_CPU_SPARC 0 - #define TARGET_CPU_ALPHA 0 - #define TARGET_RT_LITTLE_ENDIAN 0 - #define TARGET_RT_BIG_ENDIAN 1 - #define TARGET_RT_64_BIT 1 - #define TARGET_RT_MAC_CFM 0 - #define TARGET_RT_MAC_MACHO 1 - #elif defined(__i386__) - #define TARGET_CPU_PPC 0 - #define TARGET_CPU_PPC64 0 - #define TARGET_CPU_68K 0 - #define TARGET_CPU_X86 1 - #define TARGET_CPU_X86_64 0 - #define TARGET_CPU_ARM 0 - #define TARGET_CPU_ARM64 0 - #define TARGET_CPU_MIPS 0 - #define TARGET_CPU_SPARC 0 - #define TARGET_CPU_ALPHA 0 - #define TARGET_RT_MAC_CFM 0 - #define TARGET_RT_MAC_MACHO 1 - #define TARGET_RT_LITTLE_ENDIAN 1 - #define TARGET_RT_BIG_ENDIAN 0 - #define TARGET_RT_64_BIT 0 - #elif defined(__x86_64__) - #define TARGET_CPU_PPC 0 - #define TARGET_CPU_PPC64 0 - #define TARGET_CPU_68K 0 - #define TARGET_CPU_X86 0 - #define TARGET_CPU_X86_64 1 - #define TARGET_CPU_ARM 0 - #define TARGET_CPU_ARM64 0 - #define TARGET_CPU_MIPS 0 - #define TARGET_CPU_SPARC 0 - #define TARGET_CPU_ALPHA 0 - #define TARGET_RT_MAC_CFM 0 - #define TARGET_RT_MAC_MACHO 1 - #define TARGET_RT_LITTLE_ENDIAN 1 - #define TARGET_RT_BIG_ENDIAN 0 - #define TARGET_RT_64_BIT 1 - #elif defined(__arm__) - #define TARGET_CPU_PPC 0 - #define TARGET_CPU_PPC64 0 - #define TARGET_CPU_68K 0 - #define TARGET_CPU_X86 0 - #define TARGET_CPU_X86_64 0 - #define TARGET_CPU_ARM 1 - #define TARGET_CPU_ARM64 0 - #define TARGET_CPU_MIPS 0 - #define TARGET_CPU_SPARC 0 - #define TARGET_CPU_ALPHA 0 - #define TARGET_RT_MAC_CFM 0 - #define TARGET_RT_MAC_MACHO 1 - #define TARGET_RT_LITTLE_ENDIAN 1 - #define TARGET_RT_BIG_ENDIAN 0 - #define TARGET_RT_64_BIT 0 - #elif defined(__arm64__) - #define TARGET_CPU_PPC 0 - #define TARGET_CPU_PPC64 0 - #define TARGET_CPU_68K 0 - #define TARGET_CPU_X86 0 - #define TARGET_CPU_X86_64 0 - #define TARGET_CPU_ARM 0 - #define TARGET_CPU_ARM64 1 - #define TARGET_CPU_MIPS 0 - #define TARGET_CPU_SPARC 0 - #define TARGET_CPU_ALPHA 0 - #define TARGET_RT_MAC_CFM 0 - #define TARGET_RT_MAC_MACHO 1 - #define TARGET_RT_LITTLE_ENDIAN 1 - #define TARGET_RT_BIG_ENDIAN 0 - #if __LP64__ - #define TARGET_RT_64_BIT 1 - #else - #define TARGET_RT_64_BIT 0 - #endif - #else - #error unrecognized GNU C compiler - #endif - - - -/* - * CodeWarrior compiler from Metrowerks/Motorola - */ -#elif defined(__MWERKS__) - #define TARGET_OS_MAC 1 - #define TARGET_OS_WIN32 0 - #define TARGET_OS_UNIX 0 - #define TARGET_OS_EMBEDDED 0 - #if defined(__POWERPC__) - #define TARGET_CPU_PPC 1 - #define TARGET_CPU_PPC64 0 - #define TARGET_CPU_68K 0 - #define TARGET_CPU_X86 0 - #define TARGET_CPU_MIPS 0 - #define TARGET_CPU_SPARC 0 - #define TARGET_CPU_ALPHA 0 - #define TARGET_RT_LITTLE_ENDIAN 0 - #define TARGET_RT_BIG_ENDIAN 1 - #elif defined(__INTEL__) - #define TARGET_CPU_PPC 0 - #define TARGET_CPU_PPC64 0 - #define TARGET_CPU_68K 0 - #define TARGET_CPU_X86 1 - #define TARGET_CPU_MIPS 0 - #define TARGET_CPU_SPARC 0 - #define TARGET_CPU_ALPHA 0 - #define TARGET_RT_LITTLE_ENDIAN 1 - #define TARGET_RT_BIG_ENDIAN 0 - #else - #error unknown Metrowerks CPU type - #endif - #define TARGET_RT_64_BIT 0 - #ifdef __MACH__ - #define TARGET_RT_MAC_CFM 0 - #define TARGET_RT_MAC_MACHO 1 - #else - #define TARGET_RT_MAC_CFM 1 - #define TARGET_RT_MAC_MACHO 0 - #endif - -/* - * unknown compiler - */ -#else - #if defined(TARGET_CPU_PPC) && TARGET_CPU_PPC - #define TARGET_CPU_PPC64 0 - #define TARGET_CPU_68K 0 - #define TARGET_CPU_X86 0 - #define TARGET_CPU_X86_64 0 - #define TARGET_CPU_ARM 0 - #define TARGET_CPU_ARM64 0 - #define TARGET_CPU_MIPS 0 - #define TARGET_CPU_SPARC 0 - #define TARGET_CPU_ALPHA 0 - #elif defined(TARGET_CPU_PPC64) && TARGET_CPU_PPC64 - #define TARGET_CPU_PPC 0 - #define TARGET_CPU_68K 0 - #define TARGET_CPU_X86 0 - #define TARGET_CPU_X86_64 0 - #define TARGET_CPU_ARM 0 - #define TARGET_CPU_ARM64 0 - #define TARGET_CPU_MIPS 0 - #define TARGET_CPU_SPARC 0 - #define TARGET_CPU_ALPHA 0 - #elif defined(TARGET_CPU_X86) && TARGET_CPU_X86 - #define TARGET_CPU_PPC 0 - #define TARGET_CPU_PPC64 0 - #define TARGET_CPU_X86_64 0 - #define TARGET_CPU_68K 0 - #define TARGET_CPU_ARM 0 - #define TARGET_CPU_ARM64 0 - #define TARGET_CPU_MIPS 0 - #define TARGET_CPU_SPARC 0 - #define TARGET_CPU_ALPHA 0 - #elif defined(TARGET_CPU_X86_64) && TARGET_CPU_X86_64 - #define TARGET_CPU_PPC 0 - #define TARGET_CPU_PPC64 0 - #define TARGET_CPU_X86 0 - #define TARGET_CPU_68K 0 - #define TARGET_CPU_ARM 0 - #define TARGET_CPU_ARM64 0 - #define TARGET_CPU_MIPS 0 - #define TARGET_CPU_SPARC 0 - #define TARGET_CPU_ALPHA 0 - #elif defined(TARGET_CPU_ARM) && TARGET_CPU_ARM - #define TARGET_CPU_PPC 0 - #define TARGET_CPU_PPC64 0 - #define TARGET_CPU_X86 0 - #define TARGET_CPU_X86_64 0 - #define TARGET_CPU_68K 0 - #define TARGET_CPU_ARM64 0 - #define TARGET_CPU_MIPS 0 - #define TARGET_CPU_SPARC 0 - #define TARGET_CPU_ALPHA 0 - #elif defined(TARGET_CPU_ARM64) && TARGET_CPU_ARM64 - #define TARGET_CPU_PPC 0 - #define TARGET_CPU_PPC64 0 - #define TARGET_CPU_X86 0 - #define TARGET_CPU_X86_64 0 - #define TARGET_CPU_68K 0 - #define TARGET_CPU_ARM 0 - #define TARGET_CPU_MIPS 0 - #define TARGET_CPU_SPARC 0 - #define TARGET_CPU_ALPHA 0 - #else - /* - NOTE: If your compiler errors out here then support for your compiler - has not yet been added to TargetConditionals.h. - - TargetConditionals.h is designed to be plug-and-play. It auto detects - which compiler is being run and configures the TARGET_ conditionals - appropriately. - - The short term work around is to set the TARGET_CPU_ and TARGET_OS_ - on the command line to the compiler (e.g. -DTARGET_CPU_MIPS=1 -DTARGET_OS_UNIX=1) - - The long term solution is to add a new case to this file which - auto detects your compiler and sets up the TARGET_ conditionals. - Then submit the changes to Apple Computer. - */ - #error TargetConditionals.h: unknown compiler (see comment above) - #define TARGET_CPU_PPC 0 - #define TARGET_CPU_68K 0 - #define TARGET_CPU_X86 0 - #define TARGET_CPU_ARM 0 - #define TARGET_CPU_ARM64 0 - #define TARGET_CPU_MIPS 0 - #define TARGET_CPU_SPARC 0 - #define TARGET_CPU_ALPHA 0 - #endif - #define TARGET_OS_MAC 1 - #define TARGET_OS_WIN32 0 - #define TARGET_OS_UNIX 0 - #define TARGET_OS_EMBEDDED 0 - #if TARGET_CPU_PPC || TARGET_CPU_PPC64 - #define TARGET_RT_BIG_ENDIAN 1 - #define TARGET_RT_LITTLE_ENDIAN 0 - #else - #define TARGET_RT_BIG_ENDIAN 0 - #define TARGET_RT_LITTLE_ENDIAN 1 - #endif - #if TARGET_CPU_PPC64 || TARGET_CPU_X86_64 - #define TARGET_RT_64_BIT 1 - #else - #define TARGET_RT_64_BIT 0 - #endif - #ifdef __MACH__ - #define TARGET_RT_MAC_MACHO 1 - #define TARGET_RT_MAC_CFM 0 - #else - #define TARGET_RT_MAC_MACHO 0 - #define TARGET_RT_MAC_CFM 1 - #endif - -#endif - -#endif /* __TARGETCONDITIONALS__ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/_ctermid.h b/lib/libc/include/x86_64-macos-gnu/_ctermid.h deleted file mode 100644 index b941ea10d4..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/_ctermid.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2000, 2002-2006, 2008-2010, 2012 Apple Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - -#ifndef _CTERMID_H_ -#define _CTERMID_H_ -char *ctermid(char *); -#endif \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/bsm/audit.h b/lib/libc/include/x86_64-macos-gnu/bsm/audit.h deleted file mode 100644 index e65ccbfab6..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/bsm/audit.h +++ /dev/null @@ -1,378 +0,0 @@ -/*- - * Copyright (c) 2005-2009 Apple Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of Apple Inc. ("Apple") nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $P4: //depot/projects/trustedbsd/openbsm/sys/bsm/audit.h#10 $ - */ - -#ifndef _BSM_AUDIT_H -#define _BSM_AUDIT_H - -#include -#include - -#define AUDIT_RECORD_MAGIC 0x828a0f1b -#define MAX_AUDIT_RECORDS 20 -#define MAXAUDITDATA (0x8000 - 1) -#define MAX_AUDIT_RECORD_SIZE MAXAUDITDATA -#define MIN_AUDIT_FILE_SIZE (512 * 1024) - -/* - * Minimum noumber of free blocks on the filesystem containing the audit - * log necessary to avoid a hard log rotation. DO NOT SET THIS VALUE TO 0 - * as the kernel does an unsigned compare, plus we want to leave a few blocks - * free so userspace can terminate the log, etc. - */ -#define AUDIT_HARD_LIMIT_FREE_BLOCKS 4 - -/* - * Triggers for the audit daemon. - */ -#define AUDIT_TRIGGER_MIN 1 -#define AUDIT_TRIGGER_LOW_SPACE 1 /* Below low watermark. */ -#define AUDIT_TRIGGER_ROTATE_KERNEL 2 /* Kernel requests rotate. */ -#define AUDIT_TRIGGER_READ_FILE 3 /* Re-read config file. */ -#define AUDIT_TRIGGER_CLOSE_AND_DIE 4 /* Terminate audit. */ -#define AUDIT_TRIGGER_NO_SPACE 5 /* Below min free space. */ -#define AUDIT_TRIGGER_ROTATE_USER 6 /* User requests rotate. */ -#define AUDIT_TRIGGER_INITIALIZE 7 /* User initialize of auditd. */ -#define AUDIT_TRIGGER_EXPIRE_TRAILS 8 /* User expiration of trails. */ -#define AUDIT_TRIGGER_MAX 8 - -/* - * The special device filename (FreeBSD). - */ -#define AUDITDEV_FILENAME "audit" -#define AUDIT_TRIGGER_FILE ("/dev/" AUDITDEV_FILENAME) - -/* - * Pre-defined audit IDs - */ -#define AU_DEFAUDITID (uid_t)(-1) -#define AU_DEFAUDITSID 0 -#define AU_ASSIGN_ASID -1 - -/* - * IPC types. - */ -#define AT_IPC_MSG ((unsigned char)1) /* Message IPC id. */ -#define AT_IPC_SEM ((unsigned char)2) /* Semaphore IPC id. */ -#define AT_IPC_SHM ((unsigned char)3) /* Shared mem IPC id. */ - -/* - * Audit conditions. - */ -#define AUC_UNSET 0 -#define AUC_AUDITING 1 -#define AUC_NOAUDIT 2 -#define AUC_DISABLED -1 - -/* - * auditon(2) commands. - */ -#define A_OLDGETPOLICY 2 -#define A_OLDSETPOLICY 3 -#define A_GETKMASK 4 -#define A_SETKMASK 5 -#define A_OLDGETQCTRL 6 -#define A_OLDSETQCTRL 7 -#define A_GETCWD 8 -#define A_GETCAR 9 -#define A_GETSTAT 12 -#define A_SETSTAT 13 -#define A_SETUMASK 14 -#define A_SETSMASK 15 -#define A_OLDGETCOND 20 -#define A_OLDSETCOND 21 -#define A_GETCLASS 22 -#define A_SETCLASS 23 -#define A_GETPINFO 24 -#define A_SETPMASK 25 -#define A_SETFSIZE 26 -#define A_GETFSIZE 27 -#define A_GETPINFO_ADDR 28 -#define A_GETKAUDIT 29 -#define A_SETKAUDIT 30 -#define A_SENDTRIGGER 31 -#define A_GETSINFO_ADDR 32 -#define A_GETPOLICY 33 -#define A_SETPOLICY 34 -#define A_GETQCTRL 35 -#define A_SETQCTRL 36 -#define A_GETCOND 37 -#define A_SETCOND 38 -#define A_GETSFLAGS 39 -#define A_SETSFLAGS 40 -#define A_GETCTLMODE 41 -#define A_SETCTLMODE 42 -#define A_GETEXPAFTER 43 -#define A_SETEXPAFTER 44 - -/* - * Audit policy controls. - */ -#define AUDIT_CNT 0x0001 -#define AUDIT_AHLT 0x0002 -#define AUDIT_ARGV 0x0004 -#define AUDIT_ARGE 0x0008 -#define AUDIT_SEQ 0x0010 -#define AUDIT_WINDATA 0x0020 -#define AUDIT_USER 0x0040 -#define AUDIT_GROUP 0x0080 -#define AUDIT_TRAIL 0x0100 -#define AUDIT_PATH 0x0200 -#define AUDIT_SCNT 0x0400 -#define AUDIT_PUBLIC 0x0800 -#define AUDIT_ZONENAME 0x1000 -#define AUDIT_PERZONE 0x2000 - -/* - * Default audit queue control parameters. - */ -#define AQ_HIWATER 100 -#define AQ_MAXHIGH 10000 -#define AQ_LOWATER 10 -#define AQ_BUFSZ MAXAUDITDATA -#define AQ_MAXBUFSZ 1048576 - -/* - * Default minimum percentage free space on file system. - */ -#define AU_FS_MINFREE 20 - -/* - * Type definitions used indicating the length of variable length addresses - * in tokens containing addresses, such as header fields. - */ -#define AU_IPv4 4 -#define AU_IPv6 16 - -/* - * Reserved audit class mask indicating which classes are unable to have - * events added or removed by unentitled processes. - */ -#define AU_CLASS_MASK_RESERVED 0x10000000 - -/* - * Audit control modes - */ -#define AUDIT_CTLMODE_NORMAL ((unsigned char)1) -#define AUDIT_CTLMODE_EXTERNAL ((unsigned char)2) - -/* - * Audit file expire_after op modes - */ -#define AUDIT_EXPIRE_OP_AND ((unsigned char)0) -#define AUDIT_EXPIRE_OP_OR ((unsigned char)1) - -__BEGIN_DECLS - -typedef uid_t au_id_t; -typedef pid_t au_asid_t; -typedef u_int16_t au_event_t; -typedef u_int16_t au_emod_t; -typedef u_int32_t au_class_t; -typedef u_int64_t au_asflgs_t __attribute__ ((aligned(8))); -typedef unsigned char au_ctlmode_t; - -struct au_tid { - dev_t port; - u_int32_t machine; -}; -typedef struct au_tid au_tid_t; - -struct au_tid_addr { - dev_t at_port; - u_int32_t at_type; - u_int32_t at_addr[4]; -}; -typedef struct au_tid_addr au_tid_addr_t; - -struct au_mask { - unsigned int am_success; /* Success bits. */ - unsigned int am_failure; /* Failure bits. */ -}; -typedef struct au_mask au_mask_t; - -struct auditinfo { - au_id_t ai_auid; /* Audit user ID. */ - au_mask_t ai_mask; /* Audit masks. */ - au_tid_t ai_termid; /* Terminal ID. */ - au_asid_t ai_asid; /* Audit session ID. */ -}; -typedef struct auditinfo auditinfo_t; - -struct auditinfo_addr { - au_id_t ai_auid; /* Audit user ID. */ - au_mask_t ai_mask; /* Audit masks. */ - au_tid_addr_t ai_termid; /* Terminal ID. */ - au_asid_t ai_asid; /* Audit session ID. */ - au_asflgs_t ai_flags; /* Audit session flags. */ -}; -typedef struct auditinfo_addr auditinfo_addr_t; - -struct auditpinfo { - pid_t ap_pid; /* ID of target process. */ - au_id_t ap_auid; /* Audit user ID. */ - au_mask_t ap_mask; /* Audit masks. */ - au_tid_t ap_termid; /* Terminal ID. */ - au_asid_t ap_asid; /* Audit session ID. */ -}; -typedef struct auditpinfo auditpinfo_t; - -struct auditpinfo_addr { - pid_t ap_pid; /* ID of target process. */ - au_id_t ap_auid; /* Audit user ID. */ - au_mask_t ap_mask; /* Audit masks. */ - au_tid_addr_t ap_termid; /* Terminal ID. */ - au_asid_t ap_asid; /* Audit session ID. */ - au_asflgs_t ap_flags; /* Audit session flags. */ -}; -typedef struct auditpinfo_addr auditpinfo_addr_t; - -struct au_session { - auditinfo_addr_t *as_aia_p; /* Ptr to full audit info. */ - au_mask_t as_mask; /* Process Audit Masks. */ -}; -typedef struct au_session au_session_t; - -struct au_expire_after { - time_t age; /* Age after which trail files should be expired */ - size_t size; /* Aggregate trail size when files should be expired */ - unsigned char op_type; /* Operator used with the above values to determine when files should be expired */ -}; -typedef struct au_expire_after au_expire_after_t; - -/* - * Contents of token_t are opaque outside of libbsm. - */ -typedef struct au_token token_t; - -/* - * Kernel audit queue control parameters: - * Default: Maximum: - * aq_hiwater: AQ_HIWATER (100) AQ_MAXHIGH (10000) - * aq_lowater: AQ_LOWATER (10) - -/* - * getaudit()/setaudit() are deprecated and have been replaced with - * wrappers to the getaudit_addr()/setaudit_addr() syscalls above. - */ - -int getaudit(struct auditinfo *) -__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_0, __MAC_10_8, - __IPHONE_2_0, __IPHONE_6_0); -int setaudit(const struct auditinfo *) -__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_0, __MAC_10_8, - __IPHONE_2_0, __IPHONE_6_0); -#else - -int getaudit(struct auditinfo *); -int setaudit(const struct auditinfo *); -#endif /* !__APPLE__ */ - -#ifdef __APPLE_API_PRIVATE -#include -mach_port_name_t audit_session_self(void); -au_asid_t audit_session_join(mach_port_name_t port); -int audit_session_port(au_asid_t asid, mach_port_name_t *portname); -#endif /* __APPLE_API_PRIVATE */ - -#endif /* defined(_KERNEL) || defined(KERNEL) */ - -__END_DECLS - -#endif /* !_BSM_AUDIT_H */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/dispatch/block.h b/lib/libc/include/x86_64-macos-gnu/dispatch/block.h deleted file mode 100644 index 5a28f48ce4..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/dispatch/block.h +++ /dev/null @@ -1,428 +0,0 @@ -/* - * Copyright (c) 2014 Apple Inc. All rights reserved. - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -#ifndef __DISPATCH_BLOCK__ -#define __DISPATCH_BLOCK__ - -#ifndef __DISPATCH_INDIRECT__ -#error "Please #include instead of this file directly." -#include // for HeaderDoc -#endif - -#ifdef __BLOCKS__ - -/*! - * @group Dispatch block objects - */ - -DISPATCH_ASSUME_NONNULL_BEGIN - -__BEGIN_DECLS - -/*! - * @typedef dispatch_block_flags_t - * Flags to pass to the dispatch_block_create* functions. - * - * @const DISPATCH_BLOCK_BARRIER - * Flag indicating that a dispatch block object should act as a barrier block - * when submitted to a DISPATCH_QUEUE_CONCURRENT queue. - * See dispatch_barrier_async() for details. - * This flag has no effect when the dispatch block object is invoked directly. - * - * @const DISPATCH_BLOCK_DETACHED - * Flag indicating that a dispatch block object should execute disassociated - * from current execution context attributes such as os_activity_t - * and properties of the current IPC request (if any). With regard to QoS class, - * the behavior is the same as for DISPATCH_BLOCK_NO_QOS. If invoked directly, - * the block object will remove the other attributes from the calling thread for - * the duration of the block body (before applying attributes assigned to the - * block object, if any). If submitted to a queue, the block object will be - * executed with the attributes of the queue (or any attributes specifically - * assigned to the block object). - * - * @const DISPATCH_BLOCK_ASSIGN_CURRENT - * Flag indicating that a dispatch block object should be assigned the execution - * context attributes that are current at the time the block object is created. - * This applies to attributes such as QOS class, os_activity_t and properties of - * the current IPC request (if any). If invoked directly, the block object will - * apply these attributes to the calling thread for the duration of the block - * body. If the block object is submitted to a queue, this flag replaces the - * default behavior of associating the submitted block instance with the - * execution context attributes that are current at the time of submission. - * If a specific QOS class is assigned with DISPATCH_BLOCK_NO_QOS_CLASS or - * dispatch_block_create_with_qos_class(), that QOS class takes precedence over - * the QOS class assignment indicated by this flag. - * - * @const DISPATCH_BLOCK_NO_QOS_CLASS - * Flag indicating that a dispatch block object should be not be assigned a QOS - * class. If invoked directly, the block object will be executed with the QOS - * class of the calling thread. If the block object is submitted to a queue, - * this replaces the default behavior of associating the submitted block - * instance with the QOS class current at the time of submission. - * This flag is ignored if a specific QOS class is assigned with - * dispatch_block_create_with_qos_class(). - * - * @const DISPATCH_BLOCK_INHERIT_QOS_CLASS - * Flag indicating that execution of a dispatch block object submitted to a - * queue should prefer the QOS class assigned to the queue over the QOS class - * assigned to the block (resp. associated with the block at the time of - * submission). The latter will only be used if the queue in question does not - * have an assigned QOS class, as long as doing so does not result in a QOS - * class lower than the QOS class inherited from the queue's target queue. - * This flag is the default when a dispatch block object is submitted to a queue - * for asynchronous execution and has no effect when the dispatch block object - * is invoked directly. It is ignored if DISPATCH_BLOCK_ENFORCE_QOS_CLASS is - * also passed. - * - * @const DISPATCH_BLOCK_ENFORCE_QOS_CLASS - * Flag indicating that execution of a dispatch block object submitted to a - * queue should prefer the QOS class assigned to the block (resp. associated - * with the block at the time of submission) over the QOS class assigned to the - * queue, as long as doing so will not result in a lower QOS class. - * This flag is the default when a dispatch block object is submitted to a queue - * for synchronous execution or when the dispatch block object is invoked - * directly. - */ -DISPATCH_OPTIONS(dispatch_block_flags, unsigned long, - DISPATCH_BLOCK_BARRIER - DISPATCH_ENUM_API_AVAILABLE(macos(10.10), ios(8.0)) = 0x1, - DISPATCH_BLOCK_DETACHED - DISPATCH_ENUM_API_AVAILABLE(macos(10.10), ios(8.0)) = 0x2, - DISPATCH_BLOCK_ASSIGN_CURRENT - DISPATCH_ENUM_API_AVAILABLE(macos(10.10), ios(8.0)) = 0x4, - DISPATCH_BLOCK_NO_QOS_CLASS - DISPATCH_ENUM_API_AVAILABLE(macos(10.10), ios(8.0)) = 0x8, - DISPATCH_BLOCK_INHERIT_QOS_CLASS - DISPATCH_ENUM_API_AVAILABLE(macos(10.10), ios(8.0)) = 0x10, - DISPATCH_BLOCK_ENFORCE_QOS_CLASS - DISPATCH_ENUM_API_AVAILABLE(macos(10.10), ios(8.0)) = 0x20, -); - -/*! - * @function dispatch_block_create - * - * @abstract - * Create a new dispatch block object on the heap from an existing block and - * the given flags. - * - * @discussion - * The provided block is Block_copy'ed to the heap and retained by the newly - * created dispatch block object. - * - * The returned dispatch block object is intended to be submitted to a dispatch - * queue with dispatch_async() and related functions, but may also be invoked - * directly. Both operations can be performed an arbitrary number of times but - * only the first completed execution of a dispatch block object can be waited - * on with dispatch_block_wait() or observed with dispatch_block_notify(). - * - * If the returned dispatch block object is submitted to a dispatch queue, the - * submitted block instance will be associated with the QOS class current at the - * time of submission, unless one of the following flags assigned a specific QOS - * class (or no QOS class) at the time of block creation: - * - DISPATCH_BLOCK_ASSIGN_CURRENT - * - DISPATCH_BLOCK_NO_QOS_CLASS - * - DISPATCH_BLOCK_DETACHED - * The QOS class the block object will be executed with also depends on the QOS - * class assigned to the queue and which of the following flags was specified or - * defaulted to: - * - DISPATCH_BLOCK_INHERIT_QOS_CLASS (default for asynchronous execution) - * - DISPATCH_BLOCK_ENFORCE_QOS_CLASS (default for synchronous execution) - * See description of dispatch_block_flags_t for details. - * - * If the returned dispatch block object is submitted directly to a serial queue - * and is configured to execute with a specific QOS class, the system will make - * a best effort to apply the necessary QOS overrides to ensure that blocks - * submitted earlier to the serial queue are executed at that same QOS class or - * higher. - * - * @param flags - * Configuration flags for the block object. - * Passing a value that is not a bitwise OR of flags from dispatch_block_flags_t - * results in NULL being returned. - * - * @param block - * The block to create the dispatch block object from. - * - * @result - * The newly created dispatch block object, or NULL. - * When not building with Objective-C ARC, must be released with a -[release] - * message or the Block_release() function. - */ -API_AVAILABLE(macos(10.10), ios(8.0)) -DISPATCH_EXPORT DISPATCH_NONNULL2 DISPATCH_RETURNS_RETAINED_BLOCK -DISPATCH_WARN_RESULT DISPATCH_NOTHROW -dispatch_block_t -dispatch_block_create(dispatch_block_flags_t flags, dispatch_block_t block); - -/*! - * @function dispatch_block_create_with_qos_class - * - * @abstract - * Create a new dispatch block object on the heap from an existing block and - * the given flags, and assign it the specified QOS class and relative priority. - * - * @discussion - * The provided block is Block_copy'ed to the heap and retained by the newly - * created dispatch block object. - * - * The returned dispatch block object is intended to be submitted to a dispatch - * queue with dispatch_async() and related functions, but may also be invoked - * directly. Both operations can be performed an arbitrary number of times but - * only the first completed execution of a dispatch block object can be waited - * on with dispatch_block_wait() or observed with dispatch_block_notify(). - * - * If invoked directly, the returned dispatch block object will be executed with - * the assigned QOS class as long as that does not result in a lower QOS class - * than what is current on the calling thread. - * - * If the returned dispatch block object is submitted to a dispatch queue, the - * QOS class it will be executed with depends on the QOS class assigned to the - * block, the QOS class assigned to the queue and which of the following flags - * was specified or defaulted to: - * - DISPATCH_BLOCK_INHERIT_QOS_CLASS: default for asynchronous execution - * - DISPATCH_BLOCK_ENFORCE_QOS_CLASS: default for synchronous execution - * See description of dispatch_block_flags_t for details. - * - * If the returned dispatch block object is submitted directly to a serial queue - * and is configured to execute with a specific QOS class, the system will make - * a best effort to apply the necessary QOS overrides to ensure that blocks - * submitted earlier to the serial queue are executed at that same QOS class or - * higher. - * - * @param flags - * Configuration flags for the new block object. - * Passing a value that is not a bitwise OR of flags from dispatch_block_flags_t - * results in NULL being returned. - * - * @param qos_class - * A QOS class value: - * - QOS_CLASS_USER_INTERACTIVE - * - QOS_CLASS_USER_INITIATED - * - QOS_CLASS_DEFAULT - * - QOS_CLASS_UTILITY - * - QOS_CLASS_BACKGROUND - * - QOS_CLASS_UNSPECIFIED - * Passing QOS_CLASS_UNSPECIFIED is equivalent to specifying the - * DISPATCH_BLOCK_NO_QOS_CLASS flag. Passing any other value results in NULL - * being returned. - * - * @param relative_priority - * A relative priority within the QOS class. This value is a negative - * offset from the maximum supported scheduler priority for the given class. - * Passing a value greater than zero or less than QOS_MIN_RELATIVE_PRIORITY - * results in NULL being returned. - * - * @param block - * The block to create the dispatch block object from. - * - * @result - * The newly created dispatch block object, or NULL. - * When not building with Objective-C ARC, must be released with a -[release] - * message or the Block_release() function. - */ -API_AVAILABLE(macos(10.10), ios(8.0)) -DISPATCH_EXPORT DISPATCH_NONNULL4 DISPATCH_RETURNS_RETAINED_BLOCK -DISPATCH_WARN_RESULT DISPATCH_NOTHROW -dispatch_block_t -dispatch_block_create_with_qos_class(dispatch_block_flags_t flags, - dispatch_qos_class_t qos_class, int relative_priority, - dispatch_block_t block); - -/*! - * @function dispatch_block_perform - * - * @abstract - * Create, synchronously execute and release a dispatch block object from the - * specified block and flags. - * - * @discussion - * Behaves identically to the sequence - * - * dispatch_block_t b = dispatch_block_create(flags, block); - * b(); - * Block_release(b); - * - * but may be implemented more efficiently internally by not requiring a copy - * to the heap of the specified block or the allocation of a new block object. - * - * @param flags - * Configuration flags for the temporary block object. - * The result of passing a value that is not a bitwise OR of flags from - * dispatch_block_flags_t is undefined. - * - * @param block - * The block to create the temporary block object from. - */ -API_AVAILABLE(macos(10.10), ios(8.0)) -DISPATCH_EXPORT DISPATCH_NONNULL2 DISPATCH_NOTHROW -void -dispatch_block_perform(dispatch_block_flags_t flags, - DISPATCH_NOESCAPE dispatch_block_t block); - -/*! - * @function dispatch_block_wait - * - * @abstract - * Wait synchronously until execution of the specified dispatch block object has - * completed or until the specified timeout has elapsed. - * - * @discussion - * This function will return immediately if execution of the block object has - * already completed. - * - * It is not possible to wait for multiple executions of the same block object - * with this interface; use dispatch_group_wait() for that purpose. A single - * dispatch block object may either be waited on once and executed once, - * or it may be executed any number of times. The behavior of any other - * combination is undefined. Submission to a dispatch queue counts as an - * execution, even if cancellation (dispatch_block_cancel) means the block's - * code never runs. - * - * The result of calling this function from multiple threads simultaneously - * with the same dispatch block object is undefined, but note that doing so - * would violate the rules described in the previous paragraph. - * - * If this function returns indicating that the specified timeout has elapsed, - * then that invocation does not count as the one allowed wait. - * - * If at the time this function is called, the specified dispatch block object - * has been submitted directly to a serial queue, the system will make a best - * effort to apply the necessary QOS overrides to ensure that the block and any - * blocks submitted earlier to that serial queue are executed at the QOS class - * (or higher) of the thread calling dispatch_block_wait(). - * - * @param block - * The dispatch block object to wait on. - * The result of passing NULL or a block object not returned by one of the - * dispatch_block_create* functions is undefined. - * - * @param timeout - * When to timeout (see dispatch_time). As a convenience, there are the - * DISPATCH_TIME_NOW and DISPATCH_TIME_FOREVER constants. - * - * @result - * Returns zero on success (the dispatch block object completed within the - * specified timeout) or non-zero on error (i.e. timed out). - */ -API_AVAILABLE(macos(10.10), ios(8.0)) -DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NOTHROW -long -dispatch_block_wait(dispatch_block_t block, dispatch_time_t timeout); - -/*! - * @function dispatch_block_notify - * - * @abstract - * Schedule a notification block to be submitted to a queue when the execution - * of a specified dispatch block object has completed. - * - * @discussion - * This function will submit the notification block immediately if execution of - * the observed block object has already completed. - * - * It is not possible to be notified of multiple executions of the same block - * object with this interface, use dispatch_group_notify() for that purpose. - * - * A single dispatch block object may either be observed one or more times - * and executed once, or it may be executed any number of times. The behavior - * of any other combination is undefined. Submission to a dispatch queue - * counts as an execution, even if cancellation (dispatch_block_cancel) means - * the block's code never runs. - * - * If multiple notification blocks are scheduled for a single block object, - * there is no defined order in which the notification blocks will be submitted - * to their associated queues. - * - * @param block - * The dispatch block object to observe. - * The result of passing NULL or a block object not returned by one of the - * dispatch_block_create* functions is undefined. - * - * @param queue - * The queue to which the supplied notification block will be submitted when - * the observed block completes. - * - * @param notification_block - * The notification block to submit when the observed block object completes. - */ -API_AVAILABLE(macos(10.10), ios(8.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -void -dispatch_block_notify(dispatch_block_t block, dispatch_queue_t queue, - dispatch_block_t notification_block); - -/*! - * @function dispatch_block_cancel - * - * @abstract - * Asynchronously cancel the specified dispatch block object. - * - * @discussion - * Cancellation causes any future execution of the dispatch block object to - * return immediately, but does not affect any execution of the block object - * that is already in progress. - * - * Release of any resources associated with the block object will be delayed - * until execution of the block object is next attempted (or any execution - * already in progress completes). - * - * NOTE: care needs to be taken to ensure that a block object that may be - * canceled does not capture any resources that require execution of the - * block body in order to be released (e.g. memory allocated with - * malloc(3) that the block body calls free(3) on). Such resources will - * be leaked if the block body is never executed due to cancellation. - * - * @param block - * The dispatch block object to cancel. - * The result of passing NULL or a block object not returned by one of the - * dispatch_block_create* functions is undefined. - */ -API_AVAILABLE(macos(10.10), ios(8.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -void -dispatch_block_cancel(dispatch_block_t block); - -/*! - * @function dispatch_block_testcancel - * - * @abstract - * Tests whether the given dispatch block object has been canceled. - * - * @param block - * The dispatch block object to test. - * The result of passing NULL or a block object not returned by one of the - * dispatch_block_create* functions is undefined. - * - * @result - * Non-zero if canceled and zero if not canceled. - */ -API_AVAILABLE(macos(10.10), ios(8.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_PURE -DISPATCH_NOTHROW -long -dispatch_block_testcancel(dispatch_block_t block); - -__END_DECLS - -DISPATCH_ASSUME_NONNULL_END - -#endif // __BLOCKS__ - -#endif // __DISPATCH_BLOCK__ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/dispatch/dispatch.h b/lib/libc/include/x86_64-macos-gnu/dispatch/dispatch.h deleted file mode 100644 index 7d5356aab6..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/dispatch/dispatch.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2008-2013 Apple Inc. All rights reserved. - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -#ifndef __DISPATCH_PUBLIC__ -#define __DISPATCH_PUBLIC__ - -#ifdef __APPLE__ -#include -#include -#include -#include -#elif defined(_WIN32) -#include -#elif defined(__unix__) -#include -#endif - -#include -#include -#include -#include -#include -#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) -#include -#endif -#include - -#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__has_feature) -#if __has_feature(modules) -#if !defined(__arm__) -#include // for off_t (to match Glibc.modulemap) -#endif -#endif -#endif - -#define DISPATCH_API_VERSION 20181008 - -#ifndef __DISPATCH_INDIRECT__ -#define __DISPATCH_INDIRECT__ -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#undef __DISPATCH_INDIRECT__ - -#endif \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/dispatch/group.h b/lib/libc/include/x86_64-macos-gnu/dispatch/group.h deleted file mode 100644 index bb9bad30e3..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/dispatch/group.h +++ /dev/null @@ -1,279 +0,0 @@ -/* - * Copyright (c) 2008-2013 Apple Inc. All rights reserved. - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -#ifndef __DISPATCH_GROUP__ -#define __DISPATCH_GROUP__ - -#ifndef __DISPATCH_INDIRECT__ -#error "Please #include instead of this file directly." -#include // for HeaderDoc -#endif - -DISPATCH_ASSUME_NONNULL_BEGIN - -/*! - * @typedef dispatch_group_t - * @abstract - * A group of blocks submitted to queues for asynchronous invocation. - */ -DISPATCH_DECL(dispatch_group); - -__BEGIN_DECLS - -/*! - * @function dispatch_group_create - * - * @abstract - * Creates new group with which blocks may be associated. - * - * @discussion - * This function creates a new group with which blocks may be associated. - * The dispatch group may be used to wait for the completion of the blocks it - * references. The group object memory is freed with dispatch_release(). - * - * @result - * The newly created group, or NULL on failure. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_MALLOC DISPATCH_RETURNS_RETAINED DISPATCH_WARN_RESULT -DISPATCH_NOTHROW -dispatch_group_t -dispatch_group_create(void); - -/*! - * @function dispatch_group_async - * - * @abstract - * Submits a block to a dispatch queue and associates the block with the given - * dispatch group. - * - * @discussion - * Submits a block to a dispatch queue and associates the block with the given - * dispatch group. The dispatch group may be used to wait for the completion - * of the blocks it references. - * - * @param group - * A dispatch group to associate with the submitted block. - * The result of passing NULL in this parameter is undefined. - * - * @param queue - * The dispatch queue to which the block will be submitted for asynchronous - * invocation. - * - * @param block - * The block to perform asynchronously. - */ -#ifdef __BLOCKS__ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -void -dispatch_group_async(dispatch_group_t group, - dispatch_queue_t queue, - dispatch_block_t block); -#endif /* __BLOCKS__ */ - -/*! - * @function dispatch_group_async_f - * - * @abstract - * Submits a function to a dispatch queue and associates the block with the - * given dispatch group. - * - * @discussion - * See dispatch_group_async() for details. - * - * @param group - * A dispatch group to associate with the submitted function. - * The result of passing NULL in this parameter is undefined. - * - * @param queue - * The dispatch queue to which the function will be submitted for asynchronous - * invocation. - * - * @param context - * The application-defined context parameter to pass to the function. - * - * @param work - * The application-defined function to invoke on the target queue. The first - * parameter passed to this function is the context provided to - * dispatch_group_async_f(). - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NONNULL2 DISPATCH_NONNULL4 -DISPATCH_NOTHROW -void -dispatch_group_async_f(dispatch_group_t group, - dispatch_queue_t queue, - void *_Nullable context, - dispatch_function_t work); - -/*! - * @function dispatch_group_wait - * - * @abstract - * Wait synchronously until all the blocks associated with a group have - * completed or until the specified timeout has elapsed. - * - * @discussion - * This function waits for the completion of the blocks associated with the - * given dispatch group, and returns after all blocks have completed or when - * the specified timeout has elapsed. - * - * This function will return immediately if there are no blocks associated - * with the dispatch group (i.e. the group is empty). - * - * The result of calling this function from multiple threads simultaneously - * with the same dispatch group is undefined. - * - * After the successful return of this function, the dispatch group is empty. - * It may either be released with dispatch_release() or re-used for additional - * blocks. See dispatch_group_async() for more information. - * - * @param group - * The dispatch group to wait on. - * The result of passing NULL in this parameter is undefined. - * - * @param timeout - * When to timeout (see dispatch_time). As a convenience, there are the - * DISPATCH_TIME_NOW and DISPATCH_TIME_FOREVER constants. - * - * @result - * Returns zero on success (all blocks associated with the group completed - * within the specified timeout) or non-zero on error (i.e. timed out). - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -long -dispatch_group_wait(dispatch_group_t group, dispatch_time_t timeout); - -/*! - * @function dispatch_group_notify - * - * @abstract - * Schedule a block to be submitted to a queue when all the blocks associated - * with a group have completed. - * - * @discussion - * This function schedules a notification block to be submitted to the specified - * queue once all blocks associated with the dispatch group have completed. - * - * If no blocks are associated with the dispatch group (i.e. the group is empty) - * then the notification block will be submitted immediately. - * - * The group will be empty at the time the notification block is submitted to - * the target queue. The group may either be released with dispatch_release() - * or reused for additional operations. - * See dispatch_group_async() for more information. - * - * @param group - * The dispatch group to observe. - * The result of passing NULL in this parameter is undefined. - * - * @param queue - * The queue to which the supplied block will be submitted when the group - * completes. - * - * @param block - * The block to submit when the group completes. - */ -#ifdef __BLOCKS__ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -void -dispatch_group_notify(dispatch_group_t group, - dispatch_queue_t queue, - dispatch_block_t block); -#endif /* __BLOCKS__ */ - -/*! - * @function dispatch_group_notify_f - * - * @abstract - * Schedule a function to be submitted to a queue when all the blocks - * associated with a group have completed. - * - * @discussion - * See dispatch_group_notify() for details. - * - * @param group - * The dispatch group to observe. - * The result of passing NULL in this parameter is undefined. - * - * @param context - * The application-defined context parameter to pass to the function. - * - * @param work - * The application-defined function to invoke on the target queue. The first - * parameter passed to this function is the context provided to - * dispatch_group_notify_f(). - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NONNULL2 DISPATCH_NONNULL4 -DISPATCH_NOTHROW -void -dispatch_group_notify_f(dispatch_group_t group, - dispatch_queue_t queue, - void *_Nullable context, - dispatch_function_t work); - -/*! - * @function dispatch_group_enter - * - * @abstract - * Manually indicate a block has entered the group - * - * @discussion - * Calling this function indicates another block has joined the group through - * a means other than dispatch_group_async(). Calls to this function must be - * balanced with dispatch_group_leave(). - * - * @param group - * The dispatch group to update. - * The result of passing NULL in this parameter is undefined. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -void -dispatch_group_enter(dispatch_group_t group); - -/*! - * @function dispatch_group_leave - * - * @abstract - * Manually indicate a block in the group has completed - * - * @discussion - * Calling this function indicates block has completed and left the dispatch - * group by a means other than dispatch_group_async(). - * - * @param group - * The dispatch group to update. - * The result of passing NULL in this parameter is undefined. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -void -dispatch_group_leave(dispatch_group_t group); - -__END_DECLS - -DISPATCH_ASSUME_NONNULL_END - -#endif \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/dispatch/object.h b/lib/libc/include/x86_64-macos-gnu/dispatch/object.h deleted file mode 100644 index 3d89eb1fe6..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/dispatch/object.h +++ /dev/null @@ -1,606 +0,0 @@ -/* - * Copyright (c) 2008-2012 Apple Inc. All rights reserved. - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -#ifndef __DISPATCH_OBJECT__ -#define __DISPATCH_OBJECT__ - -#ifndef __DISPATCH_INDIRECT__ -#error "Please #include instead of this file directly." -#include // for HeaderDoc -#endif - -#if __has_include() -#include -#endif - -DISPATCH_ASSUME_NONNULL_BEGIN - -/*! - * @typedef dispatch_object_t - * - * @abstract - * Abstract base type for all dispatch objects. - * The details of the type definition are language-specific. - * - * @discussion - * Dispatch objects are reference counted via calls to dispatch_retain() and - * dispatch_release(). - */ - -#if OS_OBJECT_USE_OBJC -/* - * By default, dispatch objects are declared as Objective-C types when building - * with an Objective-C compiler. This allows them to participate in ARC, in RR - * management by the Blocks runtime and in leaks checking by the static - * analyzer, and enables them to be added to Cocoa collections. - * See for details. - */ -OS_OBJECT_DECL_CLASS(dispatch_object); - -#if OS_OBJECT_SWIFT3 -#define DISPATCH_DECL(name) OS_OBJECT_DECL_SUBCLASS_SWIFT(name, dispatch_object) -#define DISPATCH_DECL_SUBCLASS(name, base) OS_OBJECT_DECL_SUBCLASS_SWIFT(name, base) -#else // OS_OBJECT_SWIFT3 -#define DISPATCH_DECL(name) OS_OBJECT_DECL_SUBCLASS(name, dispatch_object) -#define DISPATCH_DECL_SUBCLASS(name, base) OS_OBJECT_DECL_SUBCLASS(name, base) - -DISPATCH_INLINE DISPATCH_ALWAYS_INLINE DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -void -_dispatch_object_validate(dispatch_object_t object) -{ - void *isa = *(void *volatile*)(OS_OBJECT_BRIDGE void*)object; - (void)isa; -} -#endif // OS_OBJECT_SWIFT3 - -#define DISPATCH_GLOBAL_OBJECT(type, object) ((OS_OBJECT_BRIDGE type)&(object)) -#define DISPATCH_RETURNS_RETAINED OS_OBJECT_RETURNS_RETAINED -#elif defined(__cplusplus) && !defined(__DISPATCH_BUILDING_DISPATCH__) -/* - * Dispatch objects are NOT C++ objects. Nevertheless, we can at least keep C++ - * aware of type compatibility. - */ -typedef struct dispatch_object_s { -private: - dispatch_object_s(); - ~dispatch_object_s(); - dispatch_object_s(const dispatch_object_s &); - void operator=(const dispatch_object_s &); -} *dispatch_object_t; -#define DISPATCH_DECL(name) \ - typedef struct name##_s : public dispatch_object_s {} *name##_t -#define DISPATCH_DECL_SUBCLASS(name, base) \ - typedef struct name##_s : public base##_s {} *name##_t -#define DISPATCH_GLOBAL_OBJECT(type, object) (static_cast(&(object))) -#define DISPATCH_RETURNS_RETAINED -#else /* Plain C */ -typedef union { - struct _os_object_s *_os_obj; - struct dispatch_object_s *_do; - struct dispatch_queue_s *_dq; - struct dispatch_queue_attr_s *_dqa; - struct dispatch_group_s *_dg; - struct dispatch_source_s *_ds; - struct dispatch_channel_s *_dch; - struct dispatch_mach_s *_dm; - struct dispatch_mach_msg_s *_dmsg; - struct dispatch_semaphore_s *_dsema; - struct dispatch_data_s *_ddata; - struct dispatch_io_s *_dchannel; -} dispatch_object_t DISPATCH_TRANSPARENT_UNION; -#define DISPATCH_DECL(name) typedef struct name##_s *name##_t -#define DISPATCH_DECL_SUBCLASS(name, base) typedef base##_t name##_t -#define DISPATCH_GLOBAL_OBJECT(type, object) ((type)&(object)) -#define DISPATCH_RETURNS_RETAINED -#endif - -#if OS_OBJECT_SWIFT3 && OS_OBJECT_USE_OBJC -#define DISPATCH_SOURCE_TYPE_DECL(name) \ - DISPATCH_EXPORT struct dispatch_source_type_s \ - _dispatch_source_type_##name; \ - OS_OBJECT_DECL_PROTOCOL(dispatch_source_##name, ); \ - OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL( \ - dispatch_source, dispatch_source_##name) -#define DISPATCH_SOURCE_DECL(name) \ - DISPATCH_DECL(name); \ - OS_OBJECT_DECL_PROTOCOL(name, ); \ - OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL(name, name) -#ifndef DISPATCH_DATA_DECL -#define DISPATCH_DATA_DECL(name) OS_OBJECT_DECL_SWIFT(name) -#endif // DISPATCH_DATA_DECL -#else -#define DISPATCH_SOURCE_DECL(name) \ - DISPATCH_DECL(name); -#define DISPATCH_DATA_DECL(name) DISPATCH_DECL(name) -#define DISPATCH_SOURCE_TYPE_DECL(name) \ - DISPATCH_EXPORT const struct dispatch_source_type_s \ - _dispatch_source_type_##name -#endif - -#ifdef __BLOCKS__ -/*! - * @typedef dispatch_block_t - * - * @abstract - * The type of blocks submitted to dispatch queues, which take no arguments - * and have no return value. - * - * @discussion - * When not building with Objective-C ARC, a block object allocated on or - * copied to the heap must be released with a -[release] message or the - * Block_release() function. - * - * The declaration of a block literal allocates storage on the stack. - * Therefore, this is an invalid construct: - * - * dispatch_block_t block; - * if (x) { - * block = ^{ printf("true\n"); }; - * } else { - * block = ^{ printf("false\n"); }; - * } - * block(); // unsafe!!! - * - * - * What is happening behind the scenes: - * - * if (x) { - * struct Block __tmp_1 = ...; // setup details - * block = &__tmp_1; - * } else { - * struct Block __tmp_2 = ...; // setup details - * block = &__tmp_2; - * } - * - * - * As the example demonstrates, the address of a stack variable is escaping the - * scope in which it is allocated. That is a classic C bug. - * - * Instead, the block literal must be copied to the heap with the Block_copy() - * function or by sending it a -[copy] message. - */ -typedef void (^dispatch_block_t)(void); -#endif // __BLOCKS__ - -__BEGIN_DECLS - -/*! - * @typedef dispatch_qos_class_t - * Alias for qos_class_t type. - */ -#if __has_include() -typedef qos_class_t dispatch_qos_class_t; -#else -typedef unsigned int dispatch_qos_class_t; -#endif - -/*! - * @function dispatch_retain - * - * @abstract - * Increment the reference count of a dispatch object. - * - * @discussion - * Calls to dispatch_retain() must be balanced with calls to - * dispatch_release(). - * - * @param object - * The object to retain. - * The result of passing NULL in this parameter is undefined. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -DISPATCH_SWIFT_UNAVAILABLE("Can't be used with ARC") -void -dispatch_retain(dispatch_object_t object); -#if OS_OBJECT_USE_OBJC_RETAIN_RELEASE -#undef dispatch_retain -#define dispatch_retain(object) \ - __extension__({ dispatch_object_t _o = (object); \ - _dispatch_object_validate(_o); (void)[_o retain]; }) -#endif - -/*! - * @function dispatch_release - * - * @abstract - * Decrement the reference count of a dispatch object. - * - * @discussion - * A dispatch object is asynchronously deallocated once all references are - * released (i.e. the reference count becomes zero). The system does not - * guarantee that a given client is the last or only reference to a given - * object. - * - * @param object - * The object to release. - * The result of passing NULL in this parameter is undefined. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -DISPATCH_SWIFT_UNAVAILABLE("Can't be used with ARC") -void -dispatch_release(dispatch_object_t object); -#if OS_OBJECT_USE_OBJC_RETAIN_RELEASE -#undef dispatch_release -#define dispatch_release(object) \ - __extension__({ dispatch_object_t _o = (object); \ - _dispatch_object_validate(_o); [_o release]; }) -#endif - -/*! - * @function dispatch_get_context - * - * @abstract - * Returns the application defined context of the object. - * - * @param object - * The result of passing NULL in this parameter is undefined. - * - * @result - * The context of the object; may be NULL. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_PURE DISPATCH_WARN_RESULT -DISPATCH_NOTHROW -void *_Nullable -dispatch_get_context(dispatch_object_t object); - -/*! - * @function dispatch_set_context - * - * @abstract - * Associates an application defined context with the object. - * - * @param object - * The result of passing NULL in this parameter is undefined. - * - * @param context - * The new client defined context for the object. This may be NULL. - * - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NOTHROW -void -dispatch_set_context(dispatch_object_t object, void *_Nullable context); - -/*! - * @function dispatch_set_finalizer_f - * - * @abstract - * Set the finalizer function for a dispatch object. - * - * @param object - * The dispatch object to modify. - * The result of passing NULL in this parameter is undefined. - * - * @param finalizer - * The finalizer function pointer. - * - * @discussion - * A dispatch object's finalizer will be invoked on the object's target queue - * after all references to the object have been released. This finalizer may be - * used by the application to release any resources associated with the object, - * such as freeing the object's context. - * The context parameter passed to the finalizer function is the current - * context of the dispatch object at the time the finalizer call is made. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NOTHROW -void -dispatch_set_finalizer_f(dispatch_object_t object, - dispatch_function_t _Nullable finalizer); - -/*! - * @function dispatch_activate - * - * @abstract - * Activates the specified dispatch object. - * - * @discussion - * Dispatch objects such as queues and sources may be created in an inactive - * state. Objects in this state have to be activated before any blocks - * associated with them will be invoked. - * - * The target queue of inactive objects can be changed using - * dispatch_set_target_queue(). Change of target queue is no longer permitted - * once an initially inactive object has been activated. - * - * Calling dispatch_activate() on an active object has no effect. - * Releasing the last reference count on an inactive object is undefined. - * - * @param object - * The object to be activated. - * The result of passing NULL in this parameter is undefined. - */ -API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -void -dispatch_activate(dispatch_object_t object); - -/*! - * @function dispatch_suspend - * - * @abstract - * Suspends the invocation of blocks on a dispatch object. - * - * @discussion - * A suspended object will not invoke any blocks associated with it. The - * suspension of an object will occur after any running block associated with - * the object completes. - * - * Calls to dispatch_suspend() must be balanced with calls - * to dispatch_resume(). - * - * @param object - * The object to be suspended. - * The result of passing NULL in this parameter is undefined. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -void -dispatch_suspend(dispatch_object_t object); - -/*! - * @function dispatch_resume - * - * @abstract - * Resumes the invocation of blocks on a dispatch object. - * - * @discussion - * Dispatch objects can be suspended with dispatch_suspend(), which increments - * an internal suspension count. dispatch_resume() is the inverse operation, - * and consumes suspension counts. When the last suspension count is consumed, - * blocks associated with the object will be invoked again. - * - * For backward compatibility reasons, dispatch_resume() on an inactive and not - * otherwise suspended dispatch source object has the same effect as calling - * dispatch_activate(). For new code, using dispatch_activate() is preferred. - * - * If the specified object has zero suspension count and is not an inactive - * source, this function will result in an assertion and the process being - * terminated. - * - * @param object - * The object to be resumed. - * The result of passing NULL in this parameter is undefined. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -void -dispatch_resume(dispatch_object_t object); - -/*! - * @function dispatch_set_qos_class_floor - * - * @abstract - * Sets the QOS class floor on a dispatch queue, source or workloop. - * - * @discussion - * The QOS class of workitems submitted to this object asynchronously will be - * elevated to at least the specified QOS class floor. The QOS of the workitem - * will be used if higher than the floor even when the workitem has been created - * without "ENFORCE" semantics. - * - * Setting the QOS class floor is equivalent to the QOS effects of configuring - * a queue whose target queue has a QoS class set to the same value. - * - * @param object - * A dispatch queue, workloop, or source to configure. - * The object must be inactive. - * - * Passing another object type or an object that has been activated is undefined - * and will cause the process to be terminated. - * - * @param qos_class - * A QOS class value: - * - QOS_CLASS_USER_INTERACTIVE - * - QOS_CLASS_USER_INITIATED - * - QOS_CLASS_DEFAULT - * - QOS_CLASS_UTILITY - * - QOS_CLASS_BACKGROUND - * Passing any other value is undefined. - * - * @param relative_priority - * A relative priority within the QOS class. This value is a negative - * offset from the maximum supported scheduler priority for the given class. - * Passing a value greater than zero or less than QOS_MIN_RELATIVE_PRIORITY - * is undefined. - */ -API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0)) -DISPATCH_EXPORT DISPATCH_NOTHROW -void -dispatch_set_qos_class_floor(dispatch_object_t object, - dispatch_qos_class_t qos_class, int relative_priority); - -#ifdef __BLOCKS__ -/*! - * @function dispatch_wait - * - * @abstract - * Wait synchronously for an object or until the specified timeout has elapsed. - * - * @discussion - * Type-generic macro that maps to dispatch_block_wait, dispatch_group_wait or - * dispatch_semaphore_wait, depending on the type of the first argument. - * See documentation for these functions for more details. - * This function is unavailable for any other object type. - * - * @param object - * The object to wait on. - * The result of passing NULL in this parameter is undefined. - * - * @param timeout - * When to timeout (see dispatch_time). As a convenience, there are the - * DISPATCH_TIME_NOW and DISPATCH_TIME_FOREVER constants. - * - * @result - * Returns zero on success or non-zero on error (i.e. timed out). - */ -DISPATCH_UNAVAILABLE -DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NOTHROW -long -dispatch_wait(void *object, dispatch_time_t timeout); -#if __has_extension(c_generic_selections) -#define dispatch_wait(object, timeout) \ - _Generic((object), \ - dispatch_block_t:dispatch_block_wait, \ - dispatch_group_t:dispatch_group_wait, \ - dispatch_semaphore_t:dispatch_semaphore_wait \ - )((object),(timeout)) -#endif - -/*! - * @function dispatch_notify - * - * @abstract - * Schedule a notification block to be submitted to a queue when the execution - * of a specified object has completed. - * - * @discussion - * Type-generic macro that maps to dispatch_block_notify or - * dispatch_group_notify, depending on the type of the first argument. - * See documentation for these functions for more details. - * This function is unavailable for any other object type. - * - * @param object - * The object to observe. - * The result of passing NULL in this parameter is undefined. - * - * @param queue - * The queue to which the supplied notification block will be submitted when - * the observed object completes. - * - * @param notification_block - * The block to submit when the observed object completes. - */ -DISPATCH_UNAVAILABLE -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -void -dispatch_notify(void *object, dispatch_object_t queue, - dispatch_block_t notification_block); -#if __has_extension(c_generic_selections) -#define dispatch_notify(object, queue, notification_block) \ - _Generic((object), \ - dispatch_block_t:dispatch_block_notify, \ - dispatch_group_t:dispatch_group_notify \ - )((object),(queue), (notification_block)) -#endif - -/*! - * @function dispatch_cancel - * - * @abstract - * Cancel the specified object. - * - * @discussion - * Type-generic macro that maps to dispatch_block_cancel or - * dispatch_source_cancel, depending on the type of the first argument. - * See documentation for these functions for more details. - * This function is unavailable for any other object type. - * - * @param object - * The object to cancel. - * The result of passing NULL in this parameter is undefined. - */ -DISPATCH_UNAVAILABLE -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -void -dispatch_cancel(void *object); -#if __has_extension(c_generic_selections) -#define dispatch_cancel(object) \ - _Generic((object), \ - dispatch_block_t:dispatch_block_cancel, \ - dispatch_source_t:dispatch_source_cancel \ - )((object)) -#endif - -/*! - * @function dispatch_testcancel - * - * @abstract - * Test whether the specified object has been canceled - * - * @discussion - * Type-generic macro that maps to dispatch_block_testcancel or - * dispatch_source_testcancel, depending on the type of the first argument. - * See documentation for these functions for more details. - * This function is unavailable for any other object type. - * - * @param object - * The object to test. - * The result of passing NULL in this parameter is undefined. - * - * @result - * Non-zero if canceled and zero if not canceled. - */ -DISPATCH_UNAVAILABLE -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_PURE -DISPATCH_NOTHROW -long -dispatch_testcancel(void *object); -#if __has_extension(c_generic_selections) -#define dispatch_testcancel(object) \ - _Generic((object), \ - dispatch_block_t:dispatch_block_testcancel, \ - dispatch_source_t:dispatch_source_testcancel \ - )((object)) -#endif -#endif // __BLOCKS__ - -/*! - * @function dispatch_debug - * - * @abstract - * Programmatically log debug information about a dispatch object. - * - * @discussion - * Programmatically log debug information about a dispatch object. By default, - * the log output is sent to syslog at notice level. In the debug version of - * the library, the log output is sent to a file in /var/tmp. - * The log output destination can be configured via the LIBDISPATCH_LOG - * environment variable, valid values are: YES, NO, syslog, stderr, file. - * - * This function is deprecated and will be removed in a future release. - * Objective-C callers may use -debugDescription instead. - * - * @param object - * The object to introspect. - * - * @param message - * The message to log above and beyond the introspection. - */ -API_DEPRECATED("unsupported interface", macos(10.6,10.9), ios(4.0,6.0)) -DISPATCH_EXPORT DISPATCH_NONNULL2 DISPATCH_NOTHROW DISPATCH_COLD -__attribute__((__format__(printf,2,3))) -void -dispatch_debug(dispatch_object_t object, const char *message, ...); - -API_DEPRECATED("unsupported interface", macos(10.6,10.9), ios(4.0,6.0)) -DISPATCH_EXPORT DISPATCH_NONNULL2 DISPATCH_NOTHROW DISPATCH_COLD -__attribute__((__format__(printf,2,0))) -void -dispatch_debugv(dispatch_object_t object, const char *message, va_list ap); - -__END_DECLS - -DISPATCH_ASSUME_NONNULL_END - -#endif \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/dispatch/queue.h b/lib/libc/include/x86_64-macos-gnu/dispatch/queue.h deleted file mode 100644 index f644b0266d..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/dispatch/queue.h +++ /dev/null @@ -1,1674 +0,0 @@ -/* - * Copyright (c) 2008-2014 Apple Inc. All rights reserved. - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -#ifndef __DISPATCH_QUEUE__ -#define __DISPATCH_QUEUE__ - -#ifndef __DISPATCH_INDIRECT__ -#error "Please #include instead of this file directly." -#include // for HeaderDoc -#endif - -DISPATCH_ASSUME_NONNULL_BEGIN - -/*! - * @header - * - * Dispatch is an abstract model for expressing concurrency via simple but - * powerful API. - * - * At the core, dispatch provides serial FIFO queues to which blocks may be - * submitted. Blocks submitted to these dispatch queues are invoked on a pool - * of threads fully managed by the system. No guarantee is made regarding - * which thread a block will be invoked on; however, it is guaranteed that only - * one block submitted to the FIFO dispatch queue will be invoked at a time. - * - * When multiple queues have blocks to be processed, the system is free to - * allocate additional threads to invoke the blocks concurrently. When the - * queues become empty, these threads are automatically released. - */ - -/*! - * @typedef dispatch_queue_t - * - * @abstract - * Dispatch queues invoke workitems submitted to them. - * - * @discussion - * Dispatch queues come in many flavors, the most common one being the dispatch - * serial queue (See dispatch_queue_serial_t). - * - * The system manages a pool of threads which process dispatch queues and invoke - * workitems submitted to them. - * - * Conceptually a dispatch queue may have its own thread of execution, and - * interaction between queues is highly asynchronous. - * - * Dispatch queues are reference counted via calls to dispatch_retain() and - * dispatch_release(). Pending workitems submitted to a queue also hold a - * reference to the queue until they have finished. Once all references to a - * queue have been released, the queue will be deallocated by the system. - */ -DISPATCH_DECL(dispatch_queue); - -/*! - * @typedef dispatch_queue_global_t - * - * @abstract - * Dispatch global concurrent queues are an abstraction around the system thread - * pool which invokes workitems that are submitted to dispatch queues. - * - * @discussion - * Dispatch global concurrent queues provide buckets of priorities on top of the - * thread pool the system manages. The system will decide how many threads - * to allocate to this pool depending on demand and system load. In particular, - * the system tries to maintain a good level of concurrency for this resource, - * and will create new threads when too many existing worker threads block in - * system calls. - * - * The global concurrent queues are a shared resource and as such it is the - * responsiblity of every user of this resource to not submit an unbounded - * amount of work to this pool, especially work that may block, as this can - * cause the system to spawn very large numbers of threads (aka. thread - * explosion). - * - * Work items submitted to the global concurrent queues have no ordering - * guarantee with respect to the order of submission, and workitems submitted - * to these queues may be invoked concurrently. - * - * Dispatch global concurrent queues are well-known global objects that are - * returned by dispatch_get_global_queue(). These objects cannot be modified. - * Calls to dispatch_suspend(), dispatch_resume(), dispatch_set_context(), etc., - * will have no effect when used with queues of this type. - */ -DISPATCH_DECL_SUBCLASS(dispatch_queue_global, dispatch_queue); - -/*! - * @typedef dispatch_queue_serial_t - * - * @abstract - * Dispatch serial queues invoke workitems submitted to them serially in FIFO - * order. - * - * @discussion - * Dispatch serial queues are lightweight objects to which workitems may be - * submitted to be invoked in FIFO order. A serial queue will only invoke one - * workitem at a time, but independent serial queues may each invoke their work - * items concurrently with respect to each other. - * - * Serial queues can target each other (See dispatch_set_target_queue()). The - * serial queue at the bottom of a queue hierarchy provides an exclusion - * context: at most one workitem submitted to any of the queues in such - * a hiearchy will run at any given time. - * - * Such hierarchies provide a natural construct to organize an application - * subsystem around. - * - * Serial queues are created by passing a dispatch queue attribute derived from - * DISPATCH_QUEUE_SERIAL to dispatch_queue_create_with_target(). - */ -DISPATCH_DECL_SUBCLASS(dispatch_queue_serial, dispatch_queue); - -/*! - * @typedef dispatch_queue_main_t - * - * @abstract - * The type of the default queue that is bound to the main thread. - * - * @discussion - * The main queue is a serial queue (See dispatch_queue_serial_t) which is bound - * to the main thread of an application. - * - * In order to invoke workitems submitted to the main queue, the application - * must call dispatch_main(), NSApplicationMain(), or use a CFRunLoop on the - * main thread. - * - * The main queue is a well known global object that is made automatically on - * behalf of the main thread during process initialization and is returned by - * dispatch_get_main_queue(). This object cannot be modified. Calls to - * dispatch_suspend(), dispatch_resume(), dispatch_set_context(), etc., will - * have no effect when used on the main queue. - */ -DISPATCH_DECL_SUBCLASS(dispatch_queue_main, dispatch_queue_serial); - -/*! - * @typedef dispatch_queue_concurrent_t - * - * @abstract - * Dispatch concurrent queues invoke workitems submitted to them concurrently, - * and admit a notion of barrier workitems. - * - * @discussion - * Dispatch concurrent queues are lightweight objects to which regular and - * barrier workitems may be submited. Barrier workitems are invoked in - * exclusion of any other kind of workitem in FIFO order. - * - * Regular workitems can be invoked concurrently for the same concurrent queue, - * in any order. However, regular workitems will not be invoked before any - * barrier workitem submited ahead of them has been invoked. - * - * In other words, if a serial queue is equivalent to a mutex in the Dispatch - * world, a concurrent queue is equivalent to a reader-writer lock, where - * regular items are readers and barriers are writers. - * - * Concurrent queues are created by passing a dispatch queue attribute derived - * from DISPATCH_QUEUE_CONCURRENT to dispatch_queue_create_with_target(). - * - * Caveat: - * Dispatch concurrent queues at this time do not implement priority inversion - * avoidance when lower priority regular workitems (readers) are being invoked - * and are preventing a higher priority barrier (writer) from being invoked. - */ -DISPATCH_DECL_SUBCLASS(dispatch_queue_concurrent, dispatch_queue); - -__BEGIN_DECLS - -/*! - * @function dispatch_async - * - * @abstract - * Submits a block for asynchronous execution on a dispatch queue. - * - * @discussion - * The dispatch_async() function is the fundamental mechanism for submitting - * blocks to a dispatch queue. - * - * Calls to dispatch_async() always return immediately after the block has - * been submitted, and never wait for the block to be invoked. - * - * The target queue determines whether the block will be invoked serially or - * concurrently with respect to other blocks submitted to that same queue. - * Serial queues are processed concurrently with respect to each other. - * - * @param queue - * The target dispatch queue to which the block is submitted. - * The system will hold a reference on the target queue until the block - * has finished. - * The result of passing NULL in this parameter is undefined. - * - * @param block - * The block to submit to the target dispatch queue. This function performs - * Block_copy() and Block_release() on behalf of callers. - * The result of passing NULL in this parameter is undefined. - */ -#ifdef __BLOCKS__ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -void -dispatch_async(dispatch_queue_t queue, dispatch_block_t block); -#endif - -/*! - * @function dispatch_async_f - * - * @abstract - * Submits a function for asynchronous execution on a dispatch queue. - * - * @discussion - * See dispatch_async() for details. - * - * @param queue - * The target dispatch queue to which the function is submitted. - * The system will hold a reference on the target queue until the function - * has returned. - * The result of passing NULL in this parameter is undefined. - * - * @param context - * The application-defined context parameter to pass to the function. - * - * @param work - * The application-defined function to invoke on the target queue. The first - * parameter passed to this function is the context provided to - * dispatch_async_f(). - * The result of passing NULL in this parameter is undefined. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NONNULL3 DISPATCH_NOTHROW -void -dispatch_async_f(dispatch_queue_t queue, - void *_Nullable context, dispatch_function_t work); - -/*! - * @function dispatch_sync - * - * @abstract - * Submits a block for synchronous execution on a dispatch queue. - * - * @discussion - * Submits a workitem to a dispatch queue like dispatch_async(), however - * dispatch_sync() will not return until the workitem has finished. - * - * Work items submitted to a queue with dispatch_sync() do not observe certain - * queue attributes of that queue when invoked (such as autorelease frequency - * and QOS class). - * - * Calls to dispatch_sync() targeting the current queue will result - * in dead-lock. Use of dispatch_sync() is also subject to the same - * multi-party dead-lock problems that may result from the use of a mutex. - * Use of dispatch_async() is preferred. - * - * Unlike dispatch_async(), no retain is performed on the target queue. Because - * calls to this function are synchronous, the dispatch_sync() "borrows" the - * reference of the caller. - * - * As an optimization, dispatch_sync() invokes the workitem on the thread which - * submitted the workitem, except when the passed queue is the main queue or - * a queue targetting it (See dispatch_queue_main_t, - * dispatch_set_target_queue()). - * - * @param queue - * The target dispatch queue to which the block is submitted. - * The result of passing NULL in this parameter is undefined. - * - * @param block - * The block to be invoked on the target dispatch queue. - * The result of passing NULL in this parameter is undefined. - */ -#ifdef __BLOCKS__ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -void -dispatch_sync(dispatch_queue_t queue, DISPATCH_NOESCAPE dispatch_block_t block); -#endif - -/*! - * @function dispatch_sync_f - * - * @abstract - * Submits a function for synchronous execution on a dispatch queue. - * - * @discussion - * See dispatch_sync() for details. - * - * @param queue - * The target dispatch queue to which the function is submitted. - * The result of passing NULL in this parameter is undefined. - * - * @param context - * The application-defined context parameter to pass to the function. - * - * @param work - * The application-defined function to invoke on the target queue. The first - * parameter passed to this function is the context provided to - * dispatch_sync_f(). - * The result of passing NULL in this parameter is undefined. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NONNULL3 DISPATCH_NOTHROW -void -dispatch_sync_f(dispatch_queue_t queue, - void *_Nullable context, dispatch_function_t work); - -/*! - * @function dispatch_async_and_wait - * - * @abstract - * Submits a block for synchronous execution on a dispatch queue. - * - * @discussion - * Submits a workitem to a dispatch queue like dispatch_async(), however - * dispatch_async_and_wait() will not return until the workitem has finished. - * - * Like functions of the dispatch_sync family, dispatch_async_and_wait() is - * subject to dead-lock (See dispatch_sync() for details). - * - * However, dispatch_async_and_wait() differs from functions of the - * dispatch_sync family in two fundamental ways: how it respects queue - * attributes and how it chooses the execution context invoking the workitem. - * - * Differences with dispatch_sync() - * - * Work items submitted to a queue with dispatch_async_and_wait() observe all - * queue attributes of that queue when invoked (inluding autorelease frequency - * or QOS class). - * - * When the runtime has brought up a thread to invoke the asynchronous workitems - * already submitted to the specified queue, that servicing thread will also be - * used to execute synchronous work submitted to the queue with - * dispatch_async_and_wait(). - * - * However, if the runtime has not brought up a thread to service the specified - * queue (because it has no workitems enqueued, or only synchronous workitems), - * then dispatch_async_and_wait() will invoke the workitem on the calling thread, - * similar to the behaviour of functions in the dispatch_sync family. - * - * As an exception, if the queue the work is submitted to doesn't target - * a global concurrent queue (for example because it targets the main queue), - * then the workitem will never be invoked by the thread calling - * dispatch_async_and_wait(). - * - * In other words, dispatch_async_and_wait() is similar to submitting - * a dispatch_block_create()d workitem to a queue and then waiting on it, as - * shown in the code example below. However, dispatch_async_and_wait() is - * significantly more efficient when a new thread is not required to execute - * the workitem (as it will use the stack of the submitting thread instead of - * requiring heap allocations). - * - * - * dispatch_block_t b = dispatch_block_create(0, block); - * dispatch_async(queue, b); - * dispatch_block_wait(b, DISPATCH_TIME_FOREVER); - * Block_release(b); - * - * - * @param queue - * The target dispatch queue to which the block is submitted. - * The result of passing NULL in this parameter is undefined. - * - * @param block - * The block to be invoked on the target dispatch queue. - * The result of passing NULL in this parameter is undefined. - */ -#ifdef __BLOCKS__ -API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -void -dispatch_async_and_wait(dispatch_queue_t queue, - DISPATCH_NOESCAPE dispatch_block_t block); -#endif - -/*! - * @function dispatch_async_and_wait_f - * - * @abstract - * Submits a function for synchronous execution on a dispatch queue. - * - * @discussion - * See dispatch_async_and_wait() for details. - * - * @param queue - * The target dispatch queue to which the function is submitted. - * The result of passing NULL in this parameter is undefined. - * - * @param context - * The application-defined context parameter to pass to the function. - * - * @param work - * The application-defined function to invoke on the target queue. The first - * parameter passed to this function is the context provided to - * dispatch_async_and_wait_f(). - * The result of passing NULL in this parameter is undefined. - */ -API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0)) -DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NONNULL3 DISPATCH_NOTHROW -void -dispatch_async_and_wait_f(dispatch_queue_t queue, - void *_Nullable context, dispatch_function_t work); - - -#if defined(__APPLE__) && \ - (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && \ - __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0) || \ - (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && \ - __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_9) -#define DISPATCH_APPLY_AUTO_AVAILABLE 0 -#define DISPATCH_APPLY_QUEUE_ARG_NULLABILITY _Nonnull -#else -#define DISPATCH_APPLY_AUTO_AVAILABLE 1 -#define DISPATCH_APPLY_QUEUE_ARG_NULLABILITY _Nullable -#endif - -/*! - * @constant DISPATCH_APPLY_AUTO - * - * @abstract - * Constant to pass to dispatch_apply() or dispatch_apply_f() to request that - * the system automatically use worker threads that match the configuration of - * the current thread as closely as possible. - * - * @discussion - * When submitting a block for parallel invocation, passing this constant as the - * queue argument will automatically use the global concurrent queue that - * matches the Quality of Service of the caller most closely. - * - * No assumptions should be made about which global concurrent queue will - * actually be used. - * - * Using this constant deploys backward to macOS 10.9, iOS 7.0 and any tvOS or - * watchOS version. - */ -#if DISPATCH_APPLY_AUTO_AVAILABLE -#define DISPATCH_APPLY_AUTO ((dispatch_queue_t _Nonnull)0) -#endif - -/*! - * @function dispatch_apply - * - * @abstract - * Submits a block to a dispatch queue for parallel invocation. - * - * @discussion - * Submits a block to a dispatch queue for parallel invocation. This function - * waits for the task block to complete before returning. If the specified queue - * is concurrent, the block may be invoked concurrently, and it must therefore - * be reentrant safe. - * - * Each invocation of the block will be passed the current index of iteration. - * - * @param iterations - * The number of iterations to perform. - * - * @param queue - * The dispatch queue to which the block is submitted. - * The preferred value to pass is DISPATCH_APPLY_AUTO to automatically use - * a queue appropriate for the calling thread. - * - * @param block - * The block to be invoked the specified number of iterations. - * The result of passing NULL in this parameter is undefined. - */ -#ifdef __BLOCKS__ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL3 DISPATCH_NOTHROW -void -dispatch_apply(size_t iterations, - dispatch_queue_t DISPATCH_APPLY_QUEUE_ARG_NULLABILITY queue, - DISPATCH_NOESCAPE void (^block)(size_t)); -#endif - -/*! - * @function dispatch_apply_f - * - * @abstract - * Submits a function to a dispatch queue for parallel invocation. - * - * @discussion - * See dispatch_apply() for details. - * - * @param iterations - * The number of iterations to perform. - * - * @param queue - * The dispatch queue to which the function is submitted. - * The preferred value to pass is DISPATCH_APPLY_AUTO to automatically use - * a queue appropriate for the calling thread. - * - * @param context - * The application-defined context parameter to pass to the function. - * - * @param work - * The application-defined function to invoke on the specified queue. The first - * parameter passed to this function is the context provided to - * dispatch_apply_f(). The second parameter passed to this function is the - * current index of iteration. - * The result of passing NULL in this parameter is undefined. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL4 DISPATCH_NOTHROW -void -dispatch_apply_f(size_t iterations, - dispatch_queue_t DISPATCH_APPLY_QUEUE_ARG_NULLABILITY queue, - void *_Nullable context, void (*work)(void *_Nullable, size_t)); - -/*! - * @function dispatch_get_current_queue - * - * @abstract - * Returns the queue on which the currently executing block is running. - * - * @discussion - * Returns the queue on which the currently executing block is running. - * - * When dispatch_get_current_queue() is called outside of the context of a - * submitted block, it will return the default concurrent queue. - * - * Recommended for debugging and logging purposes only: - * The code must not make any assumptions about the queue returned, unless it - * is one of the global queues or a queue the code has itself created. - * The code must not assume that synchronous execution onto a queue is safe - * from deadlock if that queue is not the one returned by - * dispatch_get_current_queue(). - * - * When dispatch_get_current_queue() is called on the main thread, it may - * or may not return the same value as dispatch_get_main_queue(). Comparing - * the two is not a valid way to test whether code is executing on the - * main thread (see dispatch_assert_queue() and dispatch_assert_queue_not()). - * - * This function is deprecated and will be removed in a future release. - * - * @result - * Returns the current queue. - */ -API_DEPRECATED("unsupported interface", macos(10.6,10.9), ios(4.0,6.0)) -DISPATCH_EXPORT DISPATCH_PURE DISPATCH_WARN_RESULT DISPATCH_NOTHROW -dispatch_queue_t -dispatch_get_current_queue(void); - -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT -struct dispatch_queue_s _dispatch_main_q; - -/*! - * @function dispatch_get_main_queue - * - * @abstract - * Returns the default queue that is bound to the main thread. - * - * @discussion - * In order to invoke blocks submitted to the main queue, the application must - * call dispatch_main(), NSApplicationMain(), or use a CFRunLoop on the main - * thread. - * - * The main queue is meant to be used in application context to interact with - * the main thread and the main runloop. - * - * Because the main queue doesn't behave entirely like a regular serial queue, - * it may have unwanted side-effects when used in processes that are not UI apps - * (daemons). For such processes, the main queue should be avoided. - * - * @see dispatch_queue_main_t - * - * @result - * Returns the main queue. This queue is created automatically on behalf of - * the main thread before main() is called. - */ -DISPATCH_INLINE DISPATCH_ALWAYS_INLINE DISPATCH_CONST DISPATCH_NOTHROW -dispatch_queue_main_t -dispatch_get_main_queue(void) -{ - return DISPATCH_GLOBAL_OBJECT(dispatch_queue_main_t, _dispatch_main_q); -} - -/*! - * @typedef dispatch_queue_priority_t - * Type of dispatch_queue_priority - * - * @constant DISPATCH_QUEUE_PRIORITY_HIGH - * Items dispatched to the queue will run at high priority, - * i.e. the queue will be scheduled for execution before - * any default priority or low priority queue. - * - * @constant DISPATCH_QUEUE_PRIORITY_DEFAULT - * Items dispatched to the queue will run at the default - * priority, i.e. the queue will be scheduled for execution - * after all high priority queues have been scheduled, but - * before any low priority queues have been scheduled. - * - * @constant DISPATCH_QUEUE_PRIORITY_LOW - * Items dispatched to the queue will run at low priority, - * i.e. the queue will be scheduled for execution after all - * default priority and high priority queues have been - * scheduled. - * - * @constant DISPATCH_QUEUE_PRIORITY_BACKGROUND - * Items dispatched to the queue will run at background priority, i.e. the queue - * will be scheduled for execution after all higher priority queues have been - * scheduled and the system will run items on this queue on a thread with - * background status as per setpriority(2) (i.e. disk I/O is throttled and the - * thread's scheduling priority is set to lowest value). - */ -#define DISPATCH_QUEUE_PRIORITY_HIGH 2 -#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 -#define DISPATCH_QUEUE_PRIORITY_LOW (-2) -#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN - -typedef long dispatch_queue_priority_t; - -/*! - * @function dispatch_get_global_queue - * - * @abstract - * Returns a well-known global concurrent queue of a given quality of service - * class. - * - * @discussion - * See dispatch_queue_global_t. - * - * @param identifier - * A quality of service class defined in qos_class_t or a priority defined in - * dispatch_queue_priority_t. - * - * It is recommended to use quality of service class values to identify the - * well-known global concurrent queues: - * - QOS_CLASS_USER_INTERACTIVE - * - QOS_CLASS_USER_INITIATED - * - QOS_CLASS_DEFAULT - * - QOS_CLASS_UTILITY - * - QOS_CLASS_BACKGROUND - * - * The global concurrent queues may still be identified by their priority, - * which map to the following QOS classes: - * - DISPATCH_QUEUE_PRIORITY_HIGH: QOS_CLASS_USER_INITIATED - * - DISPATCH_QUEUE_PRIORITY_DEFAULT: QOS_CLASS_DEFAULT - * - DISPATCH_QUEUE_PRIORITY_LOW: QOS_CLASS_UTILITY - * - DISPATCH_QUEUE_PRIORITY_BACKGROUND: QOS_CLASS_BACKGROUND - * - * @param flags - * Reserved for future use. Passing any value other than zero may result in - * a NULL return value. - * - * @result - * Returns the requested global queue or NULL if the requested global queue - * does not exist. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_CONST DISPATCH_WARN_RESULT DISPATCH_NOTHROW -dispatch_queue_global_t -dispatch_get_global_queue(long identifier, unsigned long flags); - -/*! - * @typedef dispatch_queue_attr_t - * - * @abstract - * Attribute for dispatch queues. - */ -DISPATCH_DECL(dispatch_queue_attr); - -/*! - * @const DISPATCH_QUEUE_SERIAL - * - * @discussion - * An attribute that can be used to create a dispatch queue that invokes blocks - * serially in FIFO order. - * - * See dispatch_queue_serial_t. - */ -#define DISPATCH_QUEUE_SERIAL NULL - -/*! - * @const DISPATCH_QUEUE_SERIAL_INACTIVE - * - * @discussion - * An attribute that can be used to create a dispatch queue that invokes blocks - * serially in FIFO order, and that is initially inactive. - * - * See dispatch_queue_attr_make_initially_inactive(). - */ -#define DISPATCH_QUEUE_SERIAL_INACTIVE \ - dispatch_queue_attr_make_initially_inactive(DISPATCH_QUEUE_SERIAL) - -/*! - * @const DISPATCH_QUEUE_CONCURRENT - * - * @discussion - * An attribute that can be used to create a dispatch queue that may invoke - * blocks concurrently and supports barrier blocks submitted with the dispatch - * barrier API. - * - * See dispatch_queue_concurrent_t. - */ -#define DISPATCH_QUEUE_CONCURRENT \ - DISPATCH_GLOBAL_OBJECT(dispatch_queue_attr_t, \ - _dispatch_queue_attr_concurrent) -API_AVAILABLE(macos(10.7), ios(4.3)) -DISPATCH_EXPORT -struct dispatch_queue_attr_s _dispatch_queue_attr_concurrent; - -/*! - * @const DISPATCH_QUEUE_CONCURRENT_INACTIVE - * - * @discussion - * An attribute that can be used to create a dispatch queue that may invoke - * blocks concurrently and supports barrier blocks submitted with the dispatch - * barrier API, and that is initially inactive. - * - * See dispatch_queue_attr_make_initially_inactive(). - */ -#define DISPATCH_QUEUE_CONCURRENT_INACTIVE \ - dispatch_queue_attr_make_initially_inactive(DISPATCH_QUEUE_CONCURRENT) - -/*! - * @function dispatch_queue_attr_make_initially_inactive - * - * @abstract - * Returns an attribute value which may be provided to dispatch_queue_create() - * or dispatch_queue_create_with_target(), in order to make the created queue - * initially inactive. - * - * @discussion - * Dispatch queues may be created in an inactive state. Queues in this state - * have to be activated before any blocks associated with them will be invoked. - * - * A queue in inactive state cannot be deallocated, dispatch_activate() must be - * called before the last reference to a queue created with this attribute is - * released. - * - * The target queue of a queue in inactive state can be changed using - * dispatch_set_target_queue(). Change of target queue is no longer permitted - * once an initially inactive queue has been activated. - * - * @param attr - * A queue attribute value to be combined with the initially inactive attribute. - * - * @return - * Returns an attribute value which may be provided to dispatch_queue_create() - * and dispatch_queue_create_with_target(). - * The new value combines the attributes specified by the 'attr' parameter with - * the initially inactive attribute. - */ -API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0)) -DISPATCH_EXPORT DISPATCH_WARN_RESULT DISPATCH_PURE DISPATCH_NOTHROW -dispatch_queue_attr_t -dispatch_queue_attr_make_initially_inactive( - dispatch_queue_attr_t _Nullable attr); - -/*! - * @const DISPATCH_QUEUE_SERIAL_WITH_AUTORELEASE_POOL - * - * @discussion - * A dispatch queue created with this attribute invokes blocks serially in FIFO - * order, and surrounds execution of any block submitted asynchronously to it - * with the equivalent of a individual Objective-C @autoreleasepool - * scope. - * - * See dispatch_queue_attr_make_with_autorelease_frequency(). - */ -#define DISPATCH_QUEUE_SERIAL_WITH_AUTORELEASE_POOL \ - dispatch_queue_attr_make_with_autorelease_frequency(\ - DISPATCH_QUEUE_SERIAL, DISPATCH_AUTORELEASE_FREQUENCY_WORK_ITEM) - -/*! - * @const DISPATCH_QUEUE_CONCURRENT_WITH_AUTORELEASE_POOL - * - * @discussion - * A dispatch queue created with this attribute may invokes blocks concurrently - * and supports barrier blocks submitted with the dispatch barrier API. It also - * surrounds execution of any block submitted asynchronously to it with the - * equivalent of a individual Objective-C @autoreleasepool - * - * See dispatch_queue_attr_make_with_autorelease_frequency(). - */ -#define DISPATCH_QUEUE_CONCURRENT_WITH_AUTORELEASE_POOL \ - dispatch_queue_attr_make_with_autorelease_frequency(\ - DISPATCH_QUEUE_CONCURRENT, DISPATCH_AUTORELEASE_FREQUENCY_WORK_ITEM) - -/*! - * @typedef dispatch_autorelease_frequency_t - * Values to pass to the dispatch_queue_attr_make_with_autorelease_frequency() - * function. - * - * @const DISPATCH_AUTORELEASE_FREQUENCY_INHERIT - * Dispatch queues with this autorelease frequency inherit the behavior from - * their target queue. This is the default behavior for manually created queues. - * - * @const DISPATCH_AUTORELEASE_FREQUENCY_WORK_ITEM - * Dispatch queues with this autorelease frequency push and pop an autorelease - * pool around the execution of every block that was submitted to it - * asynchronously. - * @see dispatch_queue_attr_make_with_autorelease_frequency(). - * - * @const DISPATCH_AUTORELEASE_FREQUENCY_NEVER - * Dispatch queues with this autorelease frequency never set up an individual - * autorelease pool around the execution of a block that is submitted to it - * asynchronously. This is the behavior of the global concurrent queues. - */ -DISPATCH_ENUM(dispatch_autorelease_frequency, unsigned long, - DISPATCH_AUTORELEASE_FREQUENCY_INHERIT DISPATCH_ENUM_API_AVAILABLE( - macos(10.12), ios(10.0), tvos(10.0), watchos(3.0)) = 0, - DISPATCH_AUTORELEASE_FREQUENCY_WORK_ITEM DISPATCH_ENUM_API_AVAILABLE( - macos(10.12), ios(10.0), tvos(10.0), watchos(3.0)) = 1, - DISPATCH_AUTORELEASE_FREQUENCY_NEVER DISPATCH_ENUM_API_AVAILABLE( - macos(10.12), ios(10.0), tvos(10.0), watchos(3.0)) = 2, -); - -/*! - * @function dispatch_queue_attr_make_with_autorelease_frequency - * - * @abstract - * Returns a dispatch queue attribute value with the autorelease frequency - * set to the specified value. - * - * @discussion - * When a queue uses the per-workitem autorelease frequency (either directly - * or inherithed from its target queue), any block submitted asynchronously to - * this queue (via dispatch_async(), dispatch_barrier_async(), - * dispatch_group_notify(), etc...) is executed as if surrounded by a individual - * Objective-C @autoreleasepool scope. - * - * Autorelease frequency has no effect on blocks that are submitted - * synchronously to a queue (via dispatch_sync(), dispatch_barrier_sync()). - * - * The global concurrent queues have the DISPATCH_AUTORELEASE_FREQUENCY_NEVER - * behavior. Manually created dispatch queues use - * DISPATCH_AUTORELEASE_FREQUENCY_INHERIT by default. - * - * Queues created with this attribute cannot change target queues after having - * been activated. See dispatch_set_target_queue() and dispatch_activate(). - * - * @param attr - * A queue attribute value to be combined with the specified autorelease - * frequency or NULL. - * - * @param frequency - * The requested autorelease frequency. - * - * @return - * Returns an attribute value which may be provided to dispatch_queue_create() - * or NULL if an invalid autorelease frequency was requested. - * This new value combines the attributes specified by the 'attr' parameter and - * the chosen autorelease frequency. - */ -API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0)) -DISPATCH_EXPORT DISPATCH_WARN_RESULT DISPATCH_PURE DISPATCH_NOTHROW -dispatch_queue_attr_t -dispatch_queue_attr_make_with_autorelease_frequency( - dispatch_queue_attr_t _Nullable attr, - dispatch_autorelease_frequency_t frequency); - -/*! - * @function dispatch_queue_attr_make_with_qos_class - * - * @abstract - * Returns an attribute value which may be provided to dispatch_queue_create() - * or dispatch_queue_create_with_target(), in order to assign a QOS class and - * relative priority to the queue. - * - * @discussion - * When specified in this manner, the QOS class and relative priority take - * precedence over those inherited from the dispatch queue's target queue (if - * any) as long that does not result in a lower QOS class and relative priority. - * - * The global queue priorities map to the following QOS classes: - * - DISPATCH_QUEUE_PRIORITY_HIGH: QOS_CLASS_USER_INITIATED - * - DISPATCH_QUEUE_PRIORITY_DEFAULT: QOS_CLASS_DEFAULT - * - DISPATCH_QUEUE_PRIORITY_LOW: QOS_CLASS_UTILITY - * - DISPATCH_QUEUE_PRIORITY_BACKGROUND: QOS_CLASS_BACKGROUND - * - * Example: - * - * dispatch_queue_t queue; - * dispatch_queue_attr_t attr; - * attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, - * QOS_CLASS_UTILITY, 0); - * queue = dispatch_queue_create("com.example.myqueue", attr); - * - * - * The QOS class and relative priority set this way on a queue have no effect on - * blocks that are submitted synchronously to a queue (via dispatch_sync(), - * dispatch_barrier_sync()). - * - * @param attr - * A queue attribute value to be combined with the QOS class, or NULL. - * - * @param qos_class - * A QOS class value: - * - QOS_CLASS_USER_INTERACTIVE - * - QOS_CLASS_USER_INITIATED - * - QOS_CLASS_DEFAULT - * - QOS_CLASS_UTILITY - * - QOS_CLASS_BACKGROUND - * Passing any other value results in NULL being returned. - * - * @param relative_priority - * A relative priority within the QOS class. This value is a negative - * offset from the maximum supported scheduler priority for the given class. - * Passing a value greater than zero or less than QOS_MIN_RELATIVE_PRIORITY - * results in NULL being returned. - * - * @return - * Returns an attribute value which may be provided to dispatch_queue_create() - * and dispatch_queue_create_with_target(), or NULL if an invalid QOS class was - * requested. - * The new value combines the attributes specified by the 'attr' parameter and - * the new QOS class and relative priority. - */ -API_AVAILABLE(macos(10.10), ios(8.0)) -DISPATCH_EXPORT DISPATCH_WARN_RESULT DISPATCH_PURE DISPATCH_NOTHROW -dispatch_queue_attr_t -dispatch_queue_attr_make_with_qos_class(dispatch_queue_attr_t _Nullable attr, - dispatch_qos_class_t qos_class, int relative_priority); - -/*! - * @const DISPATCH_TARGET_QUEUE_DEFAULT - * @discussion Constant to pass to the dispatch_queue_create_with_target(), - * dispatch_set_target_queue() and dispatch_source_create() functions to - * indicate that the default target queue for the object type in question - * should be used. - */ -#define DISPATCH_TARGET_QUEUE_DEFAULT NULL - -/*! - * @function dispatch_queue_create_with_target - * - * @abstract - * Creates a new dispatch queue with a specified target queue. - * - * @discussion - * Dispatch queues created with the DISPATCH_QUEUE_SERIAL or a NULL attribute - * invoke blocks serially in FIFO order. - * - * Dispatch queues created with the DISPATCH_QUEUE_CONCURRENT attribute may - * invoke blocks concurrently (similarly to the global concurrent queues, but - * potentially with more overhead), and support barrier blocks submitted with - * the dispatch barrier API, which e.g. enables the implementation of efficient - * reader-writer schemes. - * - * When a dispatch queue is no longer needed, it should be released with - * dispatch_release(). Note that any pending blocks submitted asynchronously to - * a queue will hold a reference to that queue. Therefore a queue will not be - * deallocated until all pending blocks have finished. - * - * When using a dispatch queue attribute @a attr specifying a QoS class (derived - * from the result of dispatch_queue_attr_make_with_qos_class()), passing the - * result of dispatch_get_global_queue() in @a target will ignore the QoS class - * of that global queue and will use the global queue with the QoS class - * specified by attr instead. - * - * Queues created with dispatch_queue_create_with_target() cannot have their - * target queue changed, unless created inactive (See - * dispatch_queue_attr_make_initially_inactive()), in which case the target - * queue can be changed until the newly created queue is activated with - * dispatch_activate(). - * - * @param label - * A string label to attach to the queue. - * This parameter is optional and may be NULL. - * - * @param attr - * A predefined attribute such as DISPATCH_QUEUE_SERIAL, - * DISPATCH_QUEUE_CONCURRENT, or the result of a call to - * a dispatch_queue_attr_make_with_* function. - * - * @param target - * The target queue for the newly created queue. The target queue is retained. - * If this parameter is DISPATCH_TARGET_QUEUE_DEFAULT, sets the queue's target - * queue to the default target queue for the given queue type. - * - * @result - * The newly created dispatch queue. - */ -API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0)) -DISPATCH_EXPORT DISPATCH_MALLOC DISPATCH_RETURNS_RETAINED DISPATCH_WARN_RESULT -DISPATCH_NOTHROW -dispatch_queue_t -dispatch_queue_create_with_target(const char *_Nullable label, - dispatch_queue_attr_t _Nullable attr, dispatch_queue_t _Nullable target) - DISPATCH_ALIAS_V2(dispatch_queue_create_with_target); - -/*! - * @function dispatch_queue_create - * - * @abstract - * Creates a new dispatch queue to which blocks may be submitted. - * - * @discussion - * Dispatch queues created with the DISPATCH_QUEUE_SERIAL or a NULL attribute - * invoke blocks serially in FIFO order. - * - * Dispatch queues created with the DISPATCH_QUEUE_CONCURRENT attribute may - * invoke blocks concurrently (similarly to the global concurrent queues, but - * potentially with more overhead), and support barrier blocks submitted with - * the dispatch barrier API, which e.g. enables the implementation of efficient - * reader-writer schemes. - * - * When a dispatch queue is no longer needed, it should be released with - * dispatch_release(). Note that any pending blocks submitted asynchronously to - * a queue will hold a reference to that queue. Therefore a queue will not be - * deallocated until all pending blocks have finished. - * - * Passing the result of the dispatch_queue_attr_make_with_qos_class() function - * to the attr parameter of this function allows a quality of service class and - * relative priority to be specified for the newly created queue. - * The quality of service class so specified takes precedence over the quality - * of service class of the newly created dispatch queue's target queue (if any) - * as long that does not result in a lower QOS class and relative priority. - * - * When no quality of service class is specified, the target queue of a newly - * created dispatch queue is the default priority global concurrent queue. - * - * @param label - * A string label to attach to the queue. - * This parameter is optional and may be NULL. - * - * @param attr - * A predefined attribute such as DISPATCH_QUEUE_SERIAL, - * DISPATCH_QUEUE_CONCURRENT, or the result of a call to - * a dispatch_queue_attr_make_with_* function. - * - * @result - * The newly created dispatch queue. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_MALLOC DISPATCH_RETURNS_RETAINED DISPATCH_WARN_RESULT -DISPATCH_NOTHROW -dispatch_queue_t -dispatch_queue_create(const char *_Nullable label, - dispatch_queue_attr_t _Nullable attr); - -/*! - * @const DISPATCH_CURRENT_QUEUE_LABEL - * @discussion Constant to pass to the dispatch_queue_get_label() function to - * retrieve the label of the current queue. - */ -#define DISPATCH_CURRENT_QUEUE_LABEL NULL - -/*! - * @function dispatch_queue_get_label - * - * @abstract - * Returns the label of the given queue, as specified when the queue was - * created, or the empty string if a NULL label was specified. - * - * Passing DISPATCH_CURRENT_QUEUE_LABEL will return the label of the current - * queue. - * - * @param queue - * The queue to query, or DISPATCH_CURRENT_QUEUE_LABEL. - * - * @result - * The label of the queue. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_PURE DISPATCH_WARN_RESULT DISPATCH_NOTHROW -const char * -dispatch_queue_get_label(dispatch_queue_t _Nullable queue); - -/*! - * @function dispatch_queue_get_qos_class - * - * @abstract - * Returns the QOS class and relative priority of the given queue. - * - * @discussion - * If the given queue was created with an attribute value returned from - * dispatch_queue_attr_make_with_qos_class(), this function returns the QOS - * class and relative priority specified at that time; for any other attribute - * value it returns a QOS class of QOS_CLASS_UNSPECIFIED and a relative - * priority of 0. - * - * If the given queue is one of the global queues, this function returns its - * assigned QOS class value as documented under dispatch_get_global_queue() and - * a relative priority of 0; in the case of the main queue it returns the QOS - * value provided by qos_class_main() and a relative priority of 0. - * - * @param queue - * The queue to query. - * - * @param relative_priority_ptr - * A pointer to an int variable to be filled with the relative priority offset - * within the QOS class, or NULL. - * - * @return - * A QOS class value: - * - QOS_CLASS_USER_INTERACTIVE - * - QOS_CLASS_USER_INITIATED - * - QOS_CLASS_DEFAULT - * - QOS_CLASS_UTILITY - * - QOS_CLASS_BACKGROUND - * - QOS_CLASS_UNSPECIFIED - */ -API_AVAILABLE(macos(10.10), ios(8.0)) -DISPATCH_EXPORT DISPATCH_WARN_RESULT DISPATCH_NONNULL1 DISPATCH_NOTHROW -dispatch_qos_class_t -dispatch_queue_get_qos_class(dispatch_queue_t queue, - int *_Nullable relative_priority_ptr); - -/*! - * @function dispatch_set_target_queue - * - * @abstract - * Sets the target queue for the given object. - * - * @discussion - * An object's target queue is responsible for processing the object. - * - * When no quality of service class and relative priority is specified for a - * dispatch queue at the time of creation, a dispatch queue's quality of service - * class is inherited from its target queue. The dispatch_get_global_queue() - * function may be used to obtain a target queue of a specific quality of - * service class, however the use of dispatch_queue_attr_make_with_qos_class() - * is recommended instead. - * - * Blocks submitted to a serial queue whose target queue is another serial - * queue will not be invoked concurrently with blocks submitted to the target - * queue or to any other queue with that same target queue. - * - * The result of introducing a cycle into the hierarchy of target queues is - * undefined. - * - * A dispatch source's target queue specifies where its event handler and - * cancellation handler blocks will be submitted. - * - * A dispatch I/O channel's target queue specifies where where its I/O - * operations are executed. If the channel's target queue's priority is set to - * DISPATCH_QUEUE_PRIORITY_BACKGROUND, then the I/O operations performed by - * dispatch_io_read() or dispatch_io_write() on that queue will be - * throttled when there is I/O contention. - * - * For all other dispatch object types, the only function of the target queue - * is to determine where an object's finalizer function is invoked. - * - * In general, changing the target queue of an object is an asynchronous - * operation that doesn't take effect immediately, and doesn't affect blocks - * already associated with the specified object. - * - * However, if an object is inactive at the time dispatch_set_target_queue() is - * called, then the target queue change takes effect immediately, and will - * affect blocks already associated with the specified object. After an - * initially inactive object has been activated, calling - * dispatch_set_target_queue() results in an assertion and the process being - * terminated. - * - * If a dispatch queue is active and targeted by other dispatch objects, - * changing its target queue results in undefined behavior. - * - * @param object - * The object to modify. - * The result of passing NULL in this parameter is undefined. - * - * @param queue - * The new target queue for the object. The queue is retained, and the - * previous target queue, if any, is released. - * If queue is DISPATCH_TARGET_QUEUE_DEFAULT, set the object's target queue - * to the default target queue for the given object type. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NOTHROW -void -dispatch_set_target_queue(dispatch_object_t object, - dispatch_queue_t _Nullable queue); - -/*! - * @function dispatch_main - * - * @abstract - * Execute blocks submitted to the main queue. - * - * @discussion - * This function "parks" the main thread and waits for blocks to be submitted - * to the main queue. This function never returns. - * - * Applications that call NSApplicationMain() or CFRunLoopRun() on the - * main thread do not need to call dispatch_main(). - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NOTHROW DISPATCH_NORETURN -void -dispatch_main(void); - -/*! - * @function dispatch_after - * - * @abstract - * Schedule a block for execution on a given queue at a specified time. - * - * @discussion - * Passing DISPATCH_TIME_NOW as the "when" parameter is supported, but not as - * optimal as calling dispatch_async() instead. Passing DISPATCH_TIME_FOREVER - * is undefined. - * - * @param when - * A temporal milestone returned by dispatch_time() or dispatch_walltime(). - * - * @param queue - * A queue to which the given block will be submitted at the specified time. - * The result of passing NULL in this parameter is undefined. - * - * @param block - * The block of code to execute. - * The result of passing NULL in this parameter is undefined. - */ -#ifdef __BLOCKS__ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL2 DISPATCH_NONNULL3 DISPATCH_NOTHROW -void -dispatch_after(dispatch_time_t when, dispatch_queue_t queue, - dispatch_block_t block); -#endif - -/*! - * @function dispatch_after_f - * - * @abstract - * Schedule a function for execution on a given queue at a specified time. - * - * @discussion - * See dispatch_after() for details. - * - * @param when - * A temporal milestone returned by dispatch_time() or dispatch_walltime(). - * - * @param queue - * A queue to which the given function will be submitted at the specified time. - * The result of passing NULL in this parameter is undefined. - * - * @param context - * The application-defined context parameter to pass to the function. - * - * @param work - * The application-defined function to invoke on the target queue. The first - * parameter passed to this function is the context provided to - * dispatch_after_f(). - * The result of passing NULL in this parameter is undefined. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL2 DISPATCH_NONNULL4 DISPATCH_NOTHROW -void -dispatch_after_f(dispatch_time_t when, dispatch_queue_t queue, - void *_Nullable context, dispatch_function_t work); - -/*! - * @functiongroup Dispatch Barrier API - * The dispatch barrier API is a mechanism for submitting barrier blocks to a - * dispatch queue, analogous to the dispatch_async()/dispatch_sync() API. - * It enables the implementation of efficient reader/writer schemes. - * Barrier blocks only behave specially when submitted to queues created with - * the DISPATCH_QUEUE_CONCURRENT attribute; on such a queue, a barrier block - * will not run until all blocks submitted to the queue earlier have completed, - * and any blocks submitted to the queue after a barrier block will not run - * until the barrier block has completed. - * When submitted to a a global queue or to a queue not created with the - * DISPATCH_QUEUE_CONCURRENT attribute, barrier blocks behave identically to - * blocks submitted with the dispatch_async()/dispatch_sync() API. - */ - -/*! - * @function dispatch_barrier_async - * - * @abstract - * Submits a barrier block for asynchronous execution on a dispatch queue. - * - * @discussion - * Submits a block to a dispatch queue like dispatch_async(), but marks that - * block as a barrier (relevant only on DISPATCH_QUEUE_CONCURRENT queues). - * - * See dispatch_async() for details and "Dispatch Barrier API" for a description - * of the barrier semantics. - * - * @param queue - * The target dispatch queue to which the block is submitted. - * The system will hold a reference on the target queue until the block - * has finished. - * The result of passing NULL in this parameter is undefined. - * - * @param block - * The block to submit to the target dispatch queue. This function performs - * Block_copy() and Block_release() on behalf of callers. - * The result of passing NULL in this parameter is undefined. - */ -#ifdef __BLOCKS__ -API_AVAILABLE(macos(10.7), ios(4.3)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -void -dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block); -#endif - -/*! - * @function dispatch_barrier_async_f - * - * @abstract - * Submits a barrier function for asynchronous execution on a dispatch queue. - * - * @discussion - * Submits a function to a dispatch queue like dispatch_async_f(), but marks - * that function as a barrier (relevant only on DISPATCH_QUEUE_CONCURRENT - * queues). - * - * See dispatch_async_f() for details and "Dispatch Barrier API" for a - * description of the barrier semantics. - * - * @param queue - * The target dispatch queue to which the function is submitted. - * The system will hold a reference on the target queue until the function - * has returned. - * The result of passing NULL in this parameter is undefined. - * - * @param context - * The application-defined context parameter to pass to the function. - * - * @param work - * The application-defined function to invoke on the target queue. The first - * parameter passed to this function is the context provided to - * dispatch_barrier_async_f(). - * The result of passing NULL in this parameter is undefined. - */ -API_AVAILABLE(macos(10.7), ios(4.3)) -DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NONNULL3 DISPATCH_NOTHROW -void -dispatch_barrier_async_f(dispatch_queue_t queue, - void *_Nullable context, dispatch_function_t work); - -/*! - * @function dispatch_barrier_sync - * - * @abstract - * Submits a barrier block for synchronous execution on a dispatch queue. - * - * @discussion - * Submits a block to a dispatch queue like dispatch_sync(), but marks that - * block as a barrier (relevant only on DISPATCH_QUEUE_CONCURRENT queues). - * - * See dispatch_sync() for details and "Dispatch Barrier API" for a description - * of the barrier semantics. - * - * @param queue - * The target dispatch queue to which the block is submitted. - * The result of passing NULL in this parameter is undefined. - * - * @param block - * The block to be invoked on the target dispatch queue. - * The result of passing NULL in this parameter is undefined. - */ -#ifdef __BLOCKS__ -API_AVAILABLE(macos(10.7), ios(4.3)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -void -dispatch_barrier_sync(dispatch_queue_t queue, - DISPATCH_NOESCAPE dispatch_block_t block); -#endif - -/*! - * @function dispatch_barrier_sync_f - * - * @abstract - * Submits a barrier function for synchronous execution on a dispatch queue. - * - * @discussion - * Submits a function to a dispatch queue like dispatch_sync_f(), but marks that - * fuction as a barrier (relevant only on DISPATCH_QUEUE_CONCURRENT queues). - * - * See dispatch_sync_f() for details. - * - * @param queue - * The target dispatch queue to which the function is submitted. - * The result of passing NULL in this parameter is undefined. - * - * @param context - * The application-defined context parameter to pass to the function. - * - * @param work - * The application-defined function to invoke on the target queue. The first - * parameter passed to this function is the context provided to - * dispatch_barrier_sync_f(). - * The result of passing NULL in this parameter is undefined. - */ -API_AVAILABLE(macos(10.7), ios(4.3)) -DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NONNULL3 DISPATCH_NOTHROW -void -dispatch_barrier_sync_f(dispatch_queue_t queue, - void *_Nullable context, dispatch_function_t work); - -/*! - * @function dispatch_barrier_async_and_wait - * - * @abstract - * Submits a block for synchronous execution on a dispatch queue. - * - * @discussion - * Submits a block to a dispatch queue like dispatch_async_and_wait(), but marks - * that block as a barrier (relevant only on DISPATCH_QUEUE_CONCURRENT - * queues). - * - * See "Dispatch Barrier API" for a description of the barrier semantics. - * - * @param queue - * The target dispatch queue to which the block is submitted. - * The result of passing NULL in this parameter is undefined. - * - * @param work - * The application-defined block to invoke on the target queue. - * The result of passing NULL in this parameter is undefined. - */ -#ifdef __BLOCKS__ -API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -void -dispatch_barrier_async_and_wait(dispatch_queue_t queue, - DISPATCH_NOESCAPE dispatch_block_t block); -#endif - -/*! - * @function dispatch_barrier_async_and_wait_f - * - * @abstract - * Submits a function for synchronous execution on a dispatch queue. - * - * @discussion - * Submits a function to a dispatch queue like dispatch_async_and_wait_f(), but - * marks that function as a barrier (relevant only on DISPATCH_QUEUE_CONCURRENT - * queues). - * - * See "Dispatch Barrier API" for a description of the barrier semantics. - * - * @param queue - * The target dispatch queue to which the function is submitted. - * The result of passing NULL in this parameter is undefined. - * - * @param context - * The application-defined context parameter to pass to the function. - * - * @param work - * The application-defined function to invoke on the target queue. The first - * parameter passed to this function is the context provided to - * dispatch_barrier_async_and_wait_f(). - * The result of passing NULL in this parameter is undefined. - */ -API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0)) -DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NONNULL3 DISPATCH_NOTHROW -void -dispatch_barrier_async_and_wait_f(dispatch_queue_t queue, - void *_Nullable context, dispatch_function_t work); - -/*! - * @functiongroup Dispatch queue-specific contexts - * This API allows different subsystems to associate context to a shared queue - * without risk of collision and to retrieve that context from blocks executing - * on that queue or any of its child queues in the target queue hierarchy. - */ - -/*! - * @function dispatch_queue_set_specific - * - * @abstract - * Associates a subsystem-specific context with a dispatch queue, for a key - * unique to the subsystem. - * - * @discussion - * The specified destructor will be invoked with the context on the default - * priority global concurrent queue when a new context is set for the same key, - * or after all references to the queue have been released. - * - * @param queue - * The dispatch queue to modify. - * The result of passing NULL in this parameter is undefined. - * - * @param key - * The key to set the context for, typically a pointer to a static variable - * specific to the subsystem. Keys are only compared as pointers and never - * dereferenced. Passing a string constant directly is not recommended. - * The NULL key is reserved and attempts to set a context for it are ignored. - * - * @param context - * The new subsystem-specific context for the object. This may be NULL. - * - * @param destructor - * The destructor function pointer. This may be NULL and is ignored if context - * is NULL. - */ -API_AVAILABLE(macos(10.7), ios(5.0)) -DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NOTHROW -void -dispatch_queue_set_specific(dispatch_queue_t queue, const void *key, - void *_Nullable context, dispatch_function_t _Nullable destructor); - -/*! - * @function dispatch_queue_get_specific - * - * @abstract - * Returns the subsystem-specific context associated with a dispatch queue, for - * a key unique to the subsystem. - * - * @discussion - * Returns the context for the specified key if it has been set on the specified - * queue. - * - * @param queue - * The dispatch queue to query. - * The result of passing NULL in this parameter is undefined. - * - * @param key - * The key to get the context for, typically a pointer to a static variable - * specific to the subsystem. Keys are only compared as pointers and never - * dereferenced. Passing a string constant directly is not recommended. - * - * @result - * The context for the specified key or NULL if no context was found. - */ -API_AVAILABLE(macos(10.7), ios(5.0)) -DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_PURE DISPATCH_WARN_RESULT -DISPATCH_NOTHROW -void *_Nullable -dispatch_queue_get_specific(dispatch_queue_t queue, const void *key); - -/*! - * @function dispatch_get_specific - * - * @abstract - * Returns the current subsystem-specific context for a key unique to the - * subsystem. - * - * @discussion - * When called from a block executing on a queue, returns the context for the - * specified key if it has been set on the queue, otherwise returns the result - * of dispatch_get_specific() executed on the queue's target queue or NULL - * if the current queue is a global concurrent queue. - * - * @param key - * The key to get the context for, typically a pointer to a static variable - * specific to the subsystem. Keys are only compared as pointers and never - * dereferenced. Passing a string constant directly is not recommended. - * - * @result - * The context for the specified key or NULL if no context was found. - */ -API_AVAILABLE(macos(10.7), ios(5.0)) -DISPATCH_EXPORT DISPATCH_PURE DISPATCH_WARN_RESULT DISPATCH_NOTHROW -void *_Nullable -dispatch_get_specific(const void *key); - -/*! - * @functiongroup Dispatch assertion API - * - * This API asserts at runtime that code is executing in (or out of) the context - * of a given queue. It can be used to check that a block accessing a resource - * does so from the proper queue protecting the resource. It also can be used - * to verify that a block that could cause a deadlock if run on a given queue - * never executes on that queue. - */ - -/*! - * @function dispatch_assert_queue - * - * @abstract - * Verifies that the current block is executing on a given dispatch queue. - * - * @discussion - * Some code expects to be run on a specific dispatch queue. This function - * verifies that that expectation is true. - * - * If the currently executing block was submitted to the specified queue or to - * any queue targeting it (see dispatch_set_target_queue()), this function - * returns. - * - * If the currently executing block was submitted with a synchronous API - * (dispatch_sync(), dispatch_barrier_sync(), ...), the context of the - * submitting block is also evaluated (recursively). - * If a synchronously submitting block is found that was itself submitted to - * the specified queue or to any queue targeting it, this function returns. - * - * Otherwise this function asserts: it logs an explanation to the system log and - * terminates the application. - * - * Passing the result of dispatch_get_main_queue() to this function verifies - * that the current block was submitted to the main queue, or to a queue - * targeting it, or is running on the main thread (in any context). - * - * When dispatch_assert_queue() is called outside of the context of a - * submitted block (for example from the context of a thread created manually - * with pthread_create()) then this function will also assert and terminate - * the application. - * - * The variant dispatch_assert_queue_debug() is compiled out when the - * preprocessor macro NDEBUG is defined. (See also assert(3)). - * - * @param queue - * The dispatch queue that the current block is expected to run on. - * The result of passing NULL in this parameter is undefined. - */ -API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0)) -DISPATCH_EXPORT DISPATCH_NONNULL1 -void -dispatch_assert_queue(dispatch_queue_t queue) - DISPATCH_ALIAS_V2(dispatch_assert_queue); - -/*! - * @function dispatch_assert_queue_barrier - * - * @abstract - * Verifies that the current block is executing on a given dispatch queue, - * and that the block acts as a barrier on that queue. - * - * @discussion - * This behaves exactly like dispatch_assert_queue(), with the additional check - * that the current block acts as a barrier on the specified queue, which is - * always true if the specified queue is serial (see DISPATCH_BLOCK_BARRIER or - * dispatch_barrier_async() for details). - * - * The variant dispatch_assert_queue_barrier_debug() is compiled out when the - * preprocessor macro NDEBUG is defined. (See also assert()). - * - * @param queue - * The dispatch queue that the current block is expected to run as a barrier on. - * The result of passing NULL in this parameter is undefined. - */ -API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0)) -DISPATCH_EXPORT DISPATCH_NONNULL1 -void -dispatch_assert_queue_barrier(dispatch_queue_t queue); - -/*! - * @function dispatch_assert_queue_not - * - * @abstract - * Verifies that the current block is not executing on a given dispatch queue. - * - * @discussion - * This function is the equivalent of dispatch_assert_queue() with the test for - * equality inverted. That means that it will terminate the application when - * dispatch_assert_queue() would return, and vice-versa. See discussion there. - * - * The variant dispatch_assert_queue_not_debug() is compiled out when the - * preprocessor macro NDEBUG is defined. (See also assert(3)). - * - * @param queue - * The dispatch queue that the current block is expected not to run on. - * The result of passing NULL in this parameter is undefined. - */ -API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0)) -DISPATCH_EXPORT DISPATCH_NONNULL1 -void -dispatch_assert_queue_not(dispatch_queue_t queue) - DISPATCH_ALIAS_V2(dispatch_assert_queue_not); - -#ifdef NDEBUG -#define dispatch_assert_queue_debug(q) ((void)(0 && (q))) -#define dispatch_assert_queue_barrier_debug(q) ((void)(0 && (q))) -#define dispatch_assert_queue_not_debug(q) ((void)(0 && (q))) -#else -#define dispatch_assert_queue_debug(q) dispatch_assert_queue(q) -#define dispatch_assert_queue_barrier_debug(q) dispatch_assert_queue_barrier(q) -#define dispatch_assert_queue_not_debug(q) dispatch_assert_queue_not(q) -#endif - -__END_DECLS - -DISPATCH_ASSUME_NONNULL_END - -#endif \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/dispatch/semaphore.h b/lib/libc/include/x86_64-macos-gnu/dispatch/semaphore.h deleted file mode 100644 index 156fb800f3..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/dispatch/semaphore.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (c) 2008-2013 Apple Inc. All rights reserved. - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -#ifndef __DISPATCH_SEMAPHORE__ -#define __DISPATCH_SEMAPHORE__ - -#ifndef __DISPATCH_INDIRECT__ -#error "Please #include instead of this file directly." -#include // for HeaderDoc -#endif - -DISPATCH_ASSUME_NONNULL_BEGIN - -/*! - * @typedef dispatch_semaphore_t - * - * @abstract - * A counting semaphore. - */ -DISPATCH_DECL(dispatch_semaphore); - -__BEGIN_DECLS - -/*! - * @function dispatch_semaphore_create - * - * @abstract - * Creates new counting semaphore with an initial value. - * - * @discussion - * Passing zero for the value is useful for when two threads need to reconcile - * the completion of a particular event. Passing a value greater than zero is - * useful for managing a finite pool of resources, where the pool size is equal - * to the value. - * - * @param value - * The starting value for the semaphore. Passing a value less than zero will - * cause NULL to be returned. - * - * @result - * The newly created semaphore, or NULL on failure. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_MALLOC DISPATCH_RETURNS_RETAINED DISPATCH_WARN_RESULT -DISPATCH_NOTHROW -dispatch_semaphore_t -dispatch_semaphore_create(long value); - -/*! - * @function dispatch_semaphore_wait - * - * @abstract - * Wait (decrement) for a semaphore. - * - * @discussion - * Decrement the counting semaphore. If the resulting value is less than zero, - * this function waits for a signal to occur before returning. - * - * @param dsema - * The semaphore. The result of passing NULL in this parameter is undefined. - * - * @param timeout - * When to timeout (see dispatch_time). As a convenience, there are the - * DISPATCH_TIME_NOW and DISPATCH_TIME_FOREVER constants. - * - * @result - * Returns zero on success, or non-zero if the timeout occurred. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -long -dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout); - -/*! - * @function dispatch_semaphore_signal - * - * @abstract - * Signal (increment) a semaphore. - * - * @discussion - * Increment the counting semaphore. If the previous value was less than zero, - * this function wakes a waiting thread before returning. - * - * @param dsema The counting semaphore. - * The result of passing NULL in this parameter is undefined. - * - * @result - * This function returns non-zero if a thread is woken. Otherwise, zero is - * returned. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -long -dispatch_semaphore_signal(dispatch_semaphore_t dsema); - -__END_DECLS - -DISPATCH_ASSUME_NONNULL_END - -#endif /* __DISPATCH_SEMAPHORE__ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/dispatch/source.h b/lib/libc/include/x86_64-macos-gnu/dispatch/source.h deleted file mode 100644 index 968b9ff89e..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/dispatch/source.h +++ /dev/null @@ -1,780 +0,0 @@ -/* - * Copyright (c) 2008-2013 Apple Inc. All rights reserved. - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -#ifndef __DISPATCH_SOURCE__ -#define __DISPATCH_SOURCE__ - -#ifndef __DISPATCH_INDIRECT__ -#error "Please #include instead of this file directly." -#include // for HeaderDoc -#endif - -#if TARGET_OS_MAC -#include -#include -#endif - -#if !defined(_WIN32) -#include -#endif - -DISPATCH_ASSUME_NONNULL_BEGIN - -/*! - * @header - * The dispatch framework provides a suite of interfaces for monitoring low- - * level system objects (file descriptors, Mach ports, signals, VFS nodes, etc.) - * for activity and automatically submitting event handler blocks to dispatch - * queues when such activity occurs. - * - * This suite of interfaces is known as the Dispatch Source API. - */ - -/*! - * @typedef dispatch_source_t - * - * @abstract - * Dispatch sources are used to automatically submit event handler blocks to - * dispatch queues in response to external events. - */ -DISPATCH_SOURCE_DECL(dispatch_source); - -__BEGIN_DECLS - -/*! - * @typedef dispatch_source_type_t - * - * @abstract - * Constants of this type represent the class of low-level system object that - * is being monitored by the dispatch source. Constants of this type are - * passed as a parameter to dispatch_source_create() and determine how the - * handle argument is interpreted (i.e. as a file descriptor, mach port, - * signal number, process identifier, etc.), and how the mask argument is - * interpreted. - */ -typedef const struct dispatch_source_type_s *dispatch_source_type_t; - -/*! - * @const DISPATCH_SOURCE_TYPE_DATA_ADD - * @discussion A dispatch source that coalesces data obtained via calls to - * dispatch_source_merge_data(). An ADD is used to coalesce the data. - * The handle is unused (pass zero for now). - * The mask is unused (pass zero for now). - */ -#define DISPATCH_SOURCE_TYPE_DATA_ADD (&_dispatch_source_type_data_add) -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_SOURCE_TYPE_DECL(data_add); - -/*! - * @const DISPATCH_SOURCE_TYPE_DATA_OR - * @discussion A dispatch source that coalesces data obtained via calls to - * dispatch_source_merge_data(). A bitwise OR is used to coalesce the data. - * The handle is unused (pass zero for now). - * The mask is unused (pass zero for now). - */ -#define DISPATCH_SOURCE_TYPE_DATA_OR (&_dispatch_source_type_data_or) -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_SOURCE_TYPE_DECL(data_or); - -/*! - * @const DISPATCH_SOURCE_TYPE_DATA_REPLACE - * @discussion A dispatch source that tracks data obtained via calls to - * dispatch_source_merge_data(). Newly obtained data values replace existing - * data values not yet delivered to the source handler - * - * A data value of zero will cause the source handler to not be invoked. - * - * The handle is unused (pass zero for now). - * The mask is unused (pass zero for now). - */ -#define DISPATCH_SOURCE_TYPE_DATA_REPLACE (&_dispatch_source_type_data_replace) -API_AVAILABLE(macos(10.13), ios(11.0), tvos(11.0), watchos(4.0)) -DISPATCH_SOURCE_TYPE_DECL(data_replace); - -/*! - * @const DISPATCH_SOURCE_TYPE_MACH_SEND - * @discussion A dispatch source that monitors a Mach port for dead name - * notifications (send right no longer has any corresponding receive right). - * The handle is a Mach port with a send or send-once right (mach_port_t). - * The mask is a mask of desired events from dispatch_source_mach_send_flags_t. - */ -#define DISPATCH_SOURCE_TYPE_MACH_SEND (&_dispatch_source_type_mach_send) -API_AVAILABLE(macos(10.6), ios(4.0)) DISPATCH_LINUX_UNAVAILABLE() -DISPATCH_SOURCE_TYPE_DECL(mach_send); - -/*! - * @const DISPATCH_SOURCE_TYPE_MACH_RECV - * @discussion A dispatch source that monitors a Mach port for pending messages. - * The handle is a Mach port with a receive right (mach_port_t). - * The mask is a mask of desired events from dispatch_source_mach_recv_flags_t, - * but no flags are currently defined (pass zero for now). - */ -#define DISPATCH_SOURCE_TYPE_MACH_RECV (&_dispatch_source_type_mach_recv) -API_AVAILABLE(macos(10.6), ios(4.0)) DISPATCH_LINUX_UNAVAILABLE() -DISPATCH_SOURCE_TYPE_DECL(mach_recv); - -/*! - * @const DISPATCH_SOURCE_TYPE_MEMORYPRESSURE - * @discussion A dispatch source that monitors the system for changes in - * memory pressure condition. - * The handle is unused (pass zero for now). - * The mask is a mask of desired events from - * dispatch_source_memorypressure_flags_t. - */ -#define DISPATCH_SOURCE_TYPE_MEMORYPRESSURE \ - (&_dispatch_source_type_memorypressure) -API_AVAILABLE(macos(10.9), ios(8.0)) DISPATCH_LINUX_UNAVAILABLE() -DISPATCH_SOURCE_TYPE_DECL(memorypressure); - -/*! - * @const DISPATCH_SOURCE_TYPE_PROC - * @discussion A dispatch source that monitors an external process for events - * defined by dispatch_source_proc_flags_t. - * The handle is a process identifier (pid_t). - * The mask is a mask of desired events from dispatch_source_proc_flags_t. - */ -#define DISPATCH_SOURCE_TYPE_PROC (&_dispatch_source_type_proc) -API_AVAILABLE(macos(10.6), ios(4.0)) DISPATCH_LINUX_UNAVAILABLE() -DISPATCH_SOURCE_TYPE_DECL(proc); - -/*! - * @const DISPATCH_SOURCE_TYPE_READ - * @discussion A dispatch source that monitors a file descriptor for pending - * bytes available to be read. - * The handle is a file descriptor (int). - * The mask is unused (pass zero for now). - */ -#define DISPATCH_SOURCE_TYPE_READ (&_dispatch_source_type_read) -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_SOURCE_TYPE_DECL(read); - -/*! - * @const DISPATCH_SOURCE_TYPE_SIGNAL - * @discussion A dispatch source that monitors the current process for signals. - * The handle is a signal number (int). - * The mask is unused (pass zero for now). - */ -#define DISPATCH_SOURCE_TYPE_SIGNAL (&_dispatch_source_type_signal) -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_SOURCE_TYPE_DECL(signal); - -/*! - * @const DISPATCH_SOURCE_TYPE_TIMER - * @discussion A dispatch source that submits the event handler block based - * on a timer. - * The handle is unused (pass zero for now). - * The mask specifies which flags from dispatch_source_timer_flags_t to apply. - */ -#define DISPATCH_SOURCE_TYPE_TIMER (&_dispatch_source_type_timer) -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_SOURCE_TYPE_DECL(timer); - -/*! - * @const DISPATCH_SOURCE_TYPE_VNODE - * @discussion A dispatch source that monitors a file descriptor for events - * defined by dispatch_source_vnode_flags_t. - * The handle is a file descriptor (int). - * The mask is a mask of desired events from dispatch_source_vnode_flags_t. - */ -#define DISPATCH_SOURCE_TYPE_VNODE (&_dispatch_source_type_vnode) -API_AVAILABLE(macos(10.6), ios(4.0)) DISPATCH_LINUX_UNAVAILABLE() -DISPATCH_SOURCE_TYPE_DECL(vnode); - -/*! - * @const DISPATCH_SOURCE_TYPE_WRITE - * @discussion A dispatch source that monitors a file descriptor for available - * buffer space to write bytes. - * The handle is a file descriptor (int). - * The mask is unused (pass zero for now). - */ -#define DISPATCH_SOURCE_TYPE_WRITE (&_dispatch_source_type_write) -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_SOURCE_TYPE_DECL(write); - -/*! - * @typedef dispatch_source_mach_send_flags_t - * Type of dispatch_source_mach_send flags - * - * @constant DISPATCH_MACH_SEND_DEAD - * The receive right corresponding to the given send right was destroyed. - */ -#define DISPATCH_MACH_SEND_DEAD 0x1 - -typedef unsigned long dispatch_source_mach_send_flags_t; - -/*! - * @typedef dispatch_source_mach_recv_flags_t - * Type of dispatch_source_mach_recv flags - */ -typedef unsigned long dispatch_source_mach_recv_flags_t; - -/*! - * @typedef dispatch_source_memorypressure_flags_t - * Type of dispatch_source_memorypressure flags - * - * @constant DISPATCH_MEMORYPRESSURE_NORMAL - * The system memory pressure condition has returned to normal. - * - * @constant DISPATCH_MEMORYPRESSURE_WARN - * The system memory pressure condition has changed to warning. - * - * @constant DISPATCH_MEMORYPRESSURE_CRITICAL - * The system memory pressure condition has changed to critical. - * - * @discussion - * Elevated memory pressure is a system-wide condition that applications - * registered for this source should react to by changing their future memory - * use behavior, e.g. by reducing cache sizes of newly initiated operations - * until memory pressure returns back to normal. - * NOTE: applications should NOT traverse and discard existing caches for past - * operations when the system memory pressure enters an elevated state, as that - * is likely to trigger VM operations that will further aggravate system memory - * pressure. - */ - -#define DISPATCH_MEMORYPRESSURE_NORMAL 0x01 -#define DISPATCH_MEMORYPRESSURE_WARN 0x02 -#define DISPATCH_MEMORYPRESSURE_CRITICAL 0x04 - -typedef unsigned long dispatch_source_memorypressure_flags_t; - -/*! - * @typedef dispatch_source_proc_flags_t - * Type of dispatch_source_proc flags - * - * @constant DISPATCH_PROC_EXIT - * The process has exited (perhaps cleanly, perhaps not). - * - * @constant DISPATCH_PROC_FORK - * The process has created one or more child processes. - * - * @constant DISPATCH_PROC_EXEC - * The process has become another executable image via - * exec*() or posix_spawn*(). - * - * @constant DISPATCH_PROC_SIGNAL - * A Unix signal was delivered to the process. - */ -#define DISPATCH_PROC_EXIT 0x80000000 -#define DISPATCH_PROC_FORK 0x40000000 -#define DISPATCH_PROC_EXEC 0x20000000 -#define DISPATCH_PROC_SIGNAL 0x08000000 - -typedef unsigned long dispatch_source_proc_flags_t; - -/*! - * @typedef dispatch_source_vnode_flags_t - * Type of dispatch_source_vnode flags - * - * @constant DISPATCH_VNODE_DELETE - * The filesystem object was deleted from the namespace. - * - * @constant DISPATCH_VNODE_WRITE - * The filesystem object data changed. - * - * @constant DISPATCH_VNODE_EXTEND - * The filesystem object changed in size. - * - * @constant DISPATCH_VNODE_ATTRIB - * The filesystem object metadata changed. - * - * @constant DISPATCH_VNODE_LINK - * The filesystem object link count changed. - * - * @constant DISPATCH_VNODE_RENAME - * The filesystem object was renamed in the namespace. - * - * @constant DISPATCH_VNODE_REVOKE - * The filesystem object was revoked. - * - * @constant DISPATCH_VNODE_FUNLOCK - * The filesystem object was unlocked. - */ - -#define DISPATCH_VNODE_DELETE 0x1 -#define DISPATCH_VNODE_WRITE 0x2 -#define DISPATCH_VNODE_EXTEND 0x4 -#define DISPATCH_VNODE_ATTRIB 0x8 -#define DISPATCH_VNODE_LINK 0x10 -#define DISPATCH_VNODE_RENAME 0x20 -#define DISPATCH_VNODE_REVOKE 0x40 -#define DISPATCH_VNODE_FUNLOCK 0x100 - -typedef unsigned long dispatch_source_vnode_flags_t; - -/*! - * @typedef dispatch_source_timer_flags_t - * Type of dispatch_source_timer flags - * - * @constant DISPATCH_TIMER_STRICT - * Specifies that the system should make a best effort to strictly observe the - * leeway value specified for the timer via dispatch_source_set_timer(), even - * if that value is smaller than the default leeway value that would be applied - * to the timer otherwise. A minimal amount of leeway will be applied to the - * timer even if this flag is specified. - * - * CAUTION: Use of this flag may override power-saving techniques employed by - * the system and cause higher power consumption, so it must be used with care - * and only when absolutely necessary. - */ - -#define DISPATCH_TIMER_STRICT 0x1 - -typedef unsigned long dispatch_source_timer_flags_t; - -/*! - * @function dispatch_source_create - * - * @abstract - * Creates a new dispatch source to monitor low-level system objects and auto- - * matically submit a handler block to a dispatch queue in response to events. - * - * @discussion - * Dispatch sources are not reentrant. Any events received while the dispatch - * source is suspended or while the event handler block is currently executing - * will be coalesced and delivered after the dispatch source is resumed or the - * event handler block has returned. - * - * Dispatch sources are created in an inactive state. After creating the - * source and setting any desired attributes (i.e. the handler, context, etc.), - * a call must be made to dispatch_activate() in order to begin event delivery. - * - * Calling dispatch_set_target_queue() on a source once it has been activated - * is not allowed (see dispatch_activate() and dispatch_set_target_queue()). - * - * For backward compatibility reasons, dispatch_resume() on an inactive, - * and not otherwise suspended source has the same effect as calling - * dispatch_activate(). For new code, using dispatch_activate() is preferred. - * - * @param type - * Declares the type of the dispatch source. Must be one of the defined - * dispatch_source_type_t constants. - * - * @param handle - * The underlying system handle to monitor. The interpretation of this argument - * is determined by the constant provided in the type parameter. - * - * @param mask - * A mask of flags specifying which events are desired. The interpretation of - * this argument is determined by the constant provided in the type parameter. - * - * @param queue - * The dispatch queue to which the event handler block will be submitted. - * If queue is DISPATCH_TARGET_QUEUE_DEFAULT, the source will submit the event - * handler block to the default priority global queue. - * - * @result - * The newly created dispatch source. Or NULL if invalid arguments are passed. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_MALLOC DISPATCH_RETURNS_RETAINED DISPATCH_WARN_RESULT -DISPATCH_NOTHROW -dispatch_source_t -dispatch_source_create(dispatch_source_type_t type, - uintptr_t handle, - unsigned long mask, - dispatch_queue_t _Nullable queue); - -/*! - * @function dispatch_source_set_event_handler - * - * @abstract - * Sets the event handler block for the given dispatch source. - * - * @param source - * The dispatch source to modify. - * The result of passing NULL in this parameter is undefined. - * - * @param handler - * The event handler block to submit to the source's target queue. - */ -#ifdef __BLOCKS__ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NOTHROW -void -dispatch_source_set_event_handler(dispatch_source_t source, - dispatch_block_t _Nullable handler); -#endif /* __BLOCKS__ */ - -/*! - * @function dispatch_source_set_event_handler_f - * - * @abstract - * Sets the event handler function for the given dispatch source. - * - * @param source - * The dispatch source to modify. - * The result of passing NULL in this parameter is undefined. - * - * @param handler - * The event handler function to submit to the source's target queue. - * The context parameter passed to the event handler function is the context of - * the dispatch source current at the time the event handler was set. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NOTHROW -void -dispatch_source_set_event_handler_f(dispatch_source_t source, - dispatch_function_t _Nullable handler); - -/*! - * @function dispatch_source_set_cancel_handler - * - * @abstract - * Sets the cancellation handler block for the given dispatch source. - * - * @discussion - * The cancellation handler (if specified) will be submitted to the source's - * target queue in response to a call to dispatch_source_cancel() once the - * system has released all references to the source's underlying handle and - * the source's event handler block has returned. - * - * IMPORTANT: - * Source cancellation and a cancellation handler are required for file - * descriptor and mach port based sources in order to safely close the - * descriptor or destroy the port. - * Closing the descriptor or port before the cancellation handler is invoked may - * result in a race condition. If a new descriptor is allocated with the same - * value as the recently closed descriptor while the source's event handler is - * still running, the event handler may read/write data to the wrong descriptor. - * - * @param source - * The dispatch source to modify. - * The result of passing NULL in this parameter is undefined. - * - * @param handler - * The cancellation handler block to submit to the source's target queue. - */ -#ifdef __BLOCKS__ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NOTHROW -void -dispatch_source_set_cancel_handler(dispatch_source_t source, - dispatch_block_t _Nullable handler); -#endif /* __BLOCKS__ */ - -/*! - * @function dispatch_source_set_cancel_handler_f - * - * @abstract - * Sets the cancellation handler function for the given dispatch source. - * - * @discussion - * See dispatch_source_set_cancel_handler() for more details. - * - * @param source - * The dispatch source to modify. - * The result of passing NULL in this parameter is undefined. - * - * @param handler - * The cancellation handler function to submit to the source's target queue. - * The context parameter passed to the event handler function is the current - * context of the dispatch source at the time the handler call is made. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NOTHROW -void -dispatch_source_set_cancel_handler_f(dispatch_source_t source, - dispatch_function_t _Nullable handler); - -/*! - * @function dispatch_source_cancel - * - * @abstract - * Asynchronously cancel the dispatch source, preventing any further invocation - * of its event handler block. - * - * @discussion - * Cancellation prevents any further invocation of the event handler block for - * the specified dispatch source, but does not interrupt an event handler - * block that is already in progress. - * - * The cancellation handler is submitted to the source's target queue once the - * the source's event handler has finished, indicating it is now safe to close - * the source's handle (i.e. file descriptor or mach port). - * - * See dispatch_source_set_cancel_handler() for more information. - * - * @param source - * The dispatch source to be canceled. - * The result of passing NULL in this parameter is undefined. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -void -dispatch_source_cancel(dispatch_source_t source); - -/*! - * @function dispatch_source_testcancel - * - * @abstract - * Tests whether the given dispatch source has been canceled. - * - * @param source - * The dispatch source to be tested. - * The result of passing NULL in this parameter is undefined. - * - * @result - * Non-zero if canceled and zero if not canceled. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_PURE -DISPATCH_NOTHROW -long -dispatch_source_testcancel(dispatch_source_t source); - -/*! - * @function dispatch_source_get_handle - * - * @abstract - * Returns the underlying system handle associated with this dispatch source. - * - * @param source - * The result of passing NULL in this parameter is undefined. - * - * @result - * The return value should be interpreted according to the type of the dispatch - * source, and may be one of the following handles: - * - * DISPATCH_SOURCE_TYPE_DATA_ADD: n/a - * DISPATCH_SOURCE_TYPE_DATA_OR: n/a - * DISPATCH_SOURCE_TYPE_DATA_REPLACE: n/a - * DISPATCH_SOURCE_TYPE_MACH_SEND: mach port (mach_port_t) - * DISPATCH_SOURCE_TYPE_MACH_RECV: mach port (mach_port_t) - * DISPATCH_SOURCE_TYPE_MEMORYPRESSURE n/a - * DISPATCH_SOURCE_TYPE_PROC: process identifier (pid_t) - * DISPATCH_SOURCE_TYPE_READ: file descriptor (int) - * DISPATCH_SOURCE_TYPE_SIGNAL: signal number (int) - * DISPATCH_SOURCE_TYPE_TIMER: n/a - * DISPATCH_SOURCE_TYPE_VNODE: file descriptor (int) - * DISPATCH_SOURCE_TYPE_WRITE: file descriptor (int) - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_PURE -DISPATCH_NOTHROW -uintptr_t -dispatch_source_get_handle(dispatch_source_t source); - -/*! - * @function dispatch_source_get_mask - * - * @abstract - * Returns the mask of events monitored by the dispatch source. - * - * @param source - * The result of passing NULL in this parameter is undefined. - * - * @result - * The return value should be interpreted according to the type of the dispatch - * source, and may be one of the following flag sets: - * - * DISPATCH_SOURCE_TYPE_DATA_ADD: n/a - * DISPATCH_SOURCE_TYPE_DATA_OR: n/a - * DISPATCH_SOURCE_TYPE_DATA_REPLACE: n/a - * DISPATCH_SOURCE_TYPE_MACH_SEND: dispatch_source_mach_send_flags_t - * DISPATCH_SOURCE_TYPE_MACH_RECV: dispatch_source_mach_recv_flags_t - * DISPATCH_SOURCE_TYPE_MEMORYPRESSURE dispatch_source_memorypressure_flags_t - * DISPATCH_SOURCE_TYPE_PROC: dispatch_source_proc_flags_t - * DISPATCH_SOURCE_TYPE_READ: n/a - * DISPATCH_SOURCE_TYPE_SIGNAL: n/a - * DISPATCH_SOURCE_TYPE_TIMER: dispatch_source_timer_flags_t - * DISPATCH_SOURCE_TYPE_VNODE: dispatch_source_vnode_flags_t - * DISPATCH_SOURCE_TYPE_WRITE: n/a - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_PURE -DISPATCH_NOTHROW -unsigned long -dispatch_source_get_mask(dispatch_source_t source); - -/*! - * @function dispatch_source_get_data - * - * @abstract - * Returns pending data for the dispatch source. - * - * @discussion - * This function is intended to be called from within the event handler block. - * The result of calling this function outside of the event handler callback is - * undefined. - * - * @param source - * The result of passing NULL in this parameter is undefined. - * - * @result - * The return value should be interpreted according to the type of the dispatch - * source, and may be one of the following: - * - * DISPATCH_SOURCE_TYPE_DATA_ADD: application defined data - * DISPATCH_SOURCE_TYPE_DATA_OR: application defined data - * DISPATCH_SOURCE_TYPE_DATA_REPLACE: application defined data - * DISPATCH_SOURCE_TYPE_MACH_SEND: dispatch_source_mach_send_flags_t - * DISPATCH_SOURCE_TYPE_MACH_RECV: dispatch_source_mach_recv_flags_t - * DISPATCH_SOURCE_TYPE_MEMORYPRESSURE dispatch_source_memorypressure_flags_t - * DISPATCH_SOURCE_TYPE_PROC: dispatch_source_proc_flags_t - * DISPATCH_SOURCE_TYPE_READ: estimated bytes available to read - * DISPATCH_SOURCE_TYPE_SIGNAL: number of signals delivered since - * the last handler invocation - * DISPATCH_SOURCE_TYPE_TIMER: number of times the timer has fired - * since the last handler invocation - * DISPATCH_SOURCE_TYPE_VNODE: dispatch_source_vnode_flags_t - * DISPATCH_SOURCE_TYPE_WRITE: estimated buffer space available - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_PURE -DISPATCH_NOTHROW -unsigned long -dispatch_source_get_data(dispatch_source_t source); - -/*! - * @function dispatch_source_merge_data - * - * @abstract - * Merges data into a dispatch source of type DISPATCH_SOURCE_TYPE_DATA_ADD, - * DISPATCH_SOURCE_TYPE_DATA_OR or DISPATCH_SOURCE_TYPE_DATA_REPLACE, - * and submits its event handler block to its target queue. - * - * @param source - * The result of passing NULL in this parameter is undefined. - * - * @param value - * The value to coalesce with the pending data using a logical OR or an ADD - * as specified by the dispatch source type. A value of zero has no effect - * and will not result in the submission of the event handler block. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -void -dispatch_source_merge_data(dispatch_source_t source, unsigned long value); - -/*! - * @function dispatch_source_set_timer - * - * @abstract - * Sets a start time, interval, and leeway value for a timer source. - * - * @discussion - * Once this function returns, any pending source data accumulated for the - * previous timer values has been cleared; the next fire of the timer will - * occur at 'start', and every 'interval' nanoseconds thereafter until the - * timer source is canceled. - * - * Any fire of the timer may be delayed by the system in order to improve power - * consumption and system performance. The upper limit to the allowable delay - * may be configured with the 'leeway' argument, the lower limit is under the - * control of the system. - * - * For the initial timer fire at 'start', the upper limit to the allowable - * delay is set to 'leeway' nanoseconds. For the subsequent timer fires at - * 'start' + N * 'interval', the upper limit is MIN('leeway','interval'/2). - * - * The lower limit to the allowable delay may vary with process state such as - * visibility of application UI. If the specified timer source was created with - * a mask of DISPATCH_TIMER_STRICT, the system will make a best effort to - * strictly observe the provided 'leeway' value even if it is smaller than the - * current lower limit. Note that a minimal amount of delay is to be expected - * even if this flag is specified. - * - * The 'start' argument also determines which clock will be used for the timer: - * If 'start' is DISPATCH_TIME_NOW or was created with dispatch_time(3), the - * timer is based on up time (which is obtained from mach_absolute_time() on - * Apple platforms). If 'start' was created with dispatch_walltime(3), the - * timer is based on gettimeofday(3). - * - * Calling this function has no effect if the timer source has already been - * canceled. - * - * @param start - * The start time of the timer. See dispatch_time() and dispatch_walltime() - * for more information. - * - * @param interval - * The nanosecond interval for the timer. Use DISPATCH_TIME_FOREVER for a - * one-shot timer. - * - * @param leeway - * The nanosecond leeway for the timer. - */ -API_AVAILABLE(macos(10.6), ios(4.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -void -dispatch_source_set_timer(dispatch_source_t source, - dispatch_time_t start, - uint64_t interval, - uint64_t leeway); - -/*! - * @function dispatch_source_set_registration_handler - * - * @abstract - * Sets the registration handler block for the given dispatch source. - * - * @discussion - * The registration handler (if specified) will be submitted to the source's - * target queue once the corresponding kevent() has been registered with the - * system, following the initial dispatch_resume() of the source. - * - * If a source is already registered when the registration handler is set, the - * registration handler will be invoked immediately. - * - * @param source - * The dispatch source to modify. - * The result of passing NULL in this parameter is undefined. - * - * @param handler - * The registration handler block to submit to the source's target queue. - */ -#ifdef __BLOCKS__ -API_AVAILABLE(macos(10.7), ios(4.3)) -DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NOTHROW -void -dispatch_source_set_registration_handler(dispatch_source_t source, - dispatch_block_t _Nullable handler); -#endif /* __BLOCKS__ */ - -/*! - * @function dispatch_source_set_registration_handler_f - * - * @abstract - * Sets the registration handler function for the given dispatch source. - * - * @discussion - * See dispatch_source_set_registration_handler() for more details. - * - * @param source - * The dispatch source to modify. - * The result of passing NULL in this parameter is undefined. - * - * @param handler - * The registration handler function to submit to the source's target queue. - * The context parameter passed to the registration handler function is the - * current context of the dispatch source at the time the handler call is made. - */ -API_AVAILABLE(macos(10.7), ios(4.3)) -DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NOTHROW -void -dispatch_source_set_registration_handler_f(dispatch_source_t source, - dispatch_function_t _Nullable handler); - -__END_DECLS - -DISPATCH_ASSUME_NONNULL_END - -#endif \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/dispatch/workloop.h b/lib/libc/include/x86_64-macos-gnu/dispatch/workloop.h deleted file mode 100644 index dcd1db43cc..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/dispatch/workloop.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (c) 2017-2019 Apple Inc. All rights reserved. - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -#ifndef __DISPATCH_WORKLOOP__ -#define __DISPATCH_WORKLOOP__ - -#ifndef __DISPATCH_INDIRECT__ -#error "Please #include instead of this file directly." -#include // for HeaderDoc -#endif - -DISPATCH_ASSUME_NONNULL_BEGIN - -__BEGIN_DECLS - -/*! - * @typedef dispatch_workloop_t - * - * @abstract - * Dispatch workloops invoke workitems submitted to them in priority order. - * - * @discussion - * A dispatch workloop is a flavor of dispatch_queue_t that is a priority - * ordered queue (using the QOS class of the submitted workitems as the - * ordering). - * - * Between each workitem invocation, the workloop will evaluate whether higher - * priority workitems have since been submitted, either directly to the - * workloop or to any queues that target the workloop, and execute these first. - * - * Serial queues targeting a workloop maintain FIFO execution of their - * workitems. However, the workloop may reorder workitems submitted to - * independent serial queues targeting it with respect to each other, - * based on their priorities, while preserving FIFO execution with respect to - * each serial queue. - * - * A dispatch workloop is a "subclass" of dispatch_queue_t which can be passed - * to all APIs accepting a dispatch queue, except for functions from the - * dispatch_sync() family. dispatch_async_and_wait() must be used for workloop - * objects. Functions from the dispatch_sync() family on queues targeting - * a workloop are still permitted but discouraged for performance reasons. - */ -DISPATCH_DECL_SUBCLASS(dispatch_workloop, dispatch_queue); - -/*! - * @function dispatch_workloop_create - * - * @abstract - * Creates a new dispatch workloop to which workitems may be submitted. - * - * @param label - * A string label to attach to the workloop. - * - * @result - * The newly created dispatch workloop. - */ -API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0)) -DISPATCH_EXPORT DISPATCH_MALLOC DISPATCH_RETURNS_RETAINED DISPATCH_WARN_RESULT -DISPATCH_NOTHROW -dispatch_workloop_t -dispatch_workloop_create(const char *_Nullable label); - -/*! - * @function dispatch_workloop_create_inactive - * - * @abstract - * Creates a new inactive dispatch workloop that can be setup and then - * activated. - * - * @discussion - * Creating an inactive workloop allows for it to receive further configuration - * before it is activated, and workitems can be submitted to it. - * - * Submitting workitems to an inactive workloop is undefined and will cause the - * process to be terminated. - * - * @param label - * A string label to attach to the workloop. - * - * @result - * The newly created dispatch workloop. - */ -API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0)) -DISPATCH_EXPORT DISPATCH_MALLOC DISPATCH_RETURNS_RETAINED DISPATCH_WARN_RESULT -DISPATCH_NOTHROW -dispatch_workloop_t -dispatch_workloop_create_inactive(const char *_Nullable label); - -/*! - * @function dispatch_workloop_set_autorelease_frequency - * - * @abstract - * Sets the autorelease frequency of the workloop. - * - * @discussion - * See dispatch_queue_attr_make_with_autorelease_frequency(). - * The default policy for a workloop is - * DISPATCH_AUTORELEASE_FREQUENCY_WORK_ITEM. - * - * @param workloop - * The dispatch workloop to modify. - * - * This workloop must be inactive, passing an activated object is undefined - * and will cause the process to be terminated. - * - * @param frequency - * The requested autorelease frequency. - */ -API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0)) -DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW -void -dispatch_workloop_set_autorelease_frequency(dispatch_workloop_t workloop, - dispatch_autorelease_frequency_t frequency); - -__END_DECLS - -DISPATCH_ASSUME_NONNULL_END - -#endif \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/i386/_param.h b/lib/libc/include/x86_64-macos-gnu/i386/_param.h index d8f7b3d4bf..b89bc39692 100644 --- a/lib/libc/include/x86_64-macos-gnu/i386/_param.h +++ b/lib/libc/include/x86_64-macos-gnu/i386/_param.h @@ -37,10 +37,10 @@ * cast to any desired pointer type. */ #define __DARWIN_ALIGNBYTES (sizeof(__darwin_size_t) - 1) -#define __DARWIN_ALIGN(p) ((__darwin_size_t)((char *)(__darwin_size_t)(p) + __DARWIN_ALIGNBYTES) &~ __DARWIN_ALIGNBYTES) +#define __DARWIN_ALIGN(p) ((__darwin_size_t)((__darwin_size_t)(p) + __DARWIN_ALIGNBYTES) &~ __DARWIN_ALIGNBYTES) #define __DARWIN_ALIGNBYTES32 (sizeof(__uint32_t) - 1) -#define __DARWIN_ALIGN32(p) ((__darwin_size_t)((char *)(__darwin_size_t)(p) + __DARWIN_ALIGNBYTES32) &~ __DARWIN_ALIGNBYTES32) +#define __DARWIN_ALIGN32(p) ((__darwin_size_t)((__darwin_size_t)(p) + __DARWIN_ALIGNBYTES32) &~ __DARWIN_ALIGNBYTES32) #endif /* _I386__PARAM_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/libkern/OSAtomicDeprecated.h b/lib/libc/include/x86_64-macos-gnu/libkern/OSAtomicDeprecated.h index aef009bc04..6dc880b0d4 100644 --- a/lib/libc/include/x86_64-macos-gnu/libkern/OSAtomicDeprecated.h +++ b/lib/libc/include/x86_64-macos-gnu/libkern/OSAtomicDeprecated.h @@ -35,13 +35,14 @@ * is preferred. */ +#include + #if !(defined(OSATOMIC_USE_INLINED) && OSATOMIC_USE_INLINED) #include #include #include #include -#include #ifndef OSATOMIC_DEPRECATED #define OSATOMIC_DEPRECATED 1 @@ -161,7 +162,7 @@ __OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0) int32_t OSAtomicAdd32Barrier( int32_t __theAmount, volatile int32_t *__theValue ); -#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_10 || __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_1 +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_10 || __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_1 || TARGET_OS_DRIVERKIT /*! @abstract Atomically increments a 32-bit value. @result Returns the new value. @@ -248,7 +249,7 @@ int64_t OSAtomicAdd64Barrier( int64_t __theAmount, volatile OSAtomic_int64_aligned64_t *__theValue ); -#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_10 || __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_1 +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_10 || __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_1 || TARGET_OS_DRIVERKIT /*! @abstract Atomically increments a 64-bit value. @result Returns the new value. @@ -361,7 +362,7 @@ int32_t OSAtomicOr32Orig( uint32_t __theMask, volatile uint32_t *__theValue ); This function performs the bitwise OR of the value given by __theMask with the value in the memory location referenced by __theValue, storing the result back to that memory location atomically. - + This function is equivalent to {@link OSAtomicOr32Orig} except that it also introduces a barrier. @result Returns the original value referenced by __theValue. @@ -481,7 +482,7 @@ int32_t OSAtomicXor32Orig( uint32_t __theMask, volatile uint32_t *__theValue ); OSATOMIC_BARRIER_DEPRECATED_REPLACE_WITH(atomic_fetch_xor) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_3_2) int32_t OSAtomicXor32OrigBarrier( uint32_t __theMask, volatile uint32_t *__theValue ); - + /*! @group Compare and swap * Functions in this group return true if the swap occured. There are several versions, @@ -587,7 +588,7 @@ bool OSAtomicCompareAndSwapIntBarrier( int __oldValue, int __newValue, volatile match, this function stores the value from __newValue into that memory location atomically. - This function is equivalent to {@link OSAtomicCompareAndSwap32} on 32-bit architectures, + This function is equivalent to {@link OSAtomicCompareAndSwap32} on 32-bit architectures, or {@link OSAtomicCompareAndSwap64} on 64-bit architectures. @result Returns TRUE on a match, FALSE otherwise. */ @@ -606,7 +607,7 @@ bool OSAtomicCompareAndSwapLong( long __oldValue, long __newValue, volatile long This function is equivalent to {@link OSAtomicCompareAndSwapLong} except that it also introduces a barrier. - This function is equivalent to {@link OSAtomicCompareAndSwap32} on 32-bit architectures, + This function is equivalent to {@link OSAtomicCompareAndSwap32} on 32-bit architectures, or {@link OSAtomicCompareAndSwap64} on 64-bit architectures. @result Returns TRUE on a match, FALSE otherwise. */ @@ -706,7 +707,7 @@ bool OSAtomicTestAndSetBarrier( uint32_t __n, volatile void *__theAddress ); For example, if __theAddress points to a 64-bit value, to compare the value of the most significant bit, you would specify 56 for __n. - + @result Returns the original value of the bit being tested. */ @@ -719,15 +720,15 @@ bool OSAtomicTestAndClear( uint32_t __n, volatile void *__theAddress ); @discussion This function tests a bit in the value referenced by __theAddress and if it is not cleared, clears it. - + The bit is chosen by the value of __n such that the operation will be performed on bit (0x80 >> (__n & 7)) of byte ((char *)__theAddress + (n >> 3)). - + For example, if __theAddress points to a 64-bit value, to compare the value of the most significant bit, you would specify 56 for __n. - + This function is equivalent to {@link OSAtomicTestAndSet} except that it also introduces a barrier. @result @@ -736,7 +737,7 @@ bool OSAtomicTestAndClear( uint32_t __n, volatile void *__theAddress ); OSATOMIC_BARRIER_DEPRECATED_REPLACE_WITH(atomic_fetch_and) __OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0) bool OSAtomicTestAndClearBarrier( uint32_t __n, volatile void *__theAddress ); - + /*! @group Memory barriers */ @@ -1174,4 +1175,92 @@ __END_DECLS #endif // defined(OSATOMIC_USE_INLINED) && OSATOMIC_USE_INLINED +#if TARGET_OS_OSX || TARGET_OS_DRIVERKIT + +__BEGIN_DECLS + +/*! @group Lockless atomic fifo enqueue and dequeue + * These routines manipulate singly-linked FIFO lists. + * + * This API is deprecated and no longer recommended + */ + +/*! @abstract The data structure for a fifo queue head. + @discussion + You should always initialize a fifo queue head structure with the + initialization vector {@link OS_ATOMIC_FIFO_QUEUE_INIT} before use. + */ +#if defined(__LP64__) + +typedef volatile struct { + void *opaque1; + void *opaque2; + int opaque3; +} __attribute__ ((aligned (16))) OSFifoQueueHead; + +#else + +typedef volatile struct { + void *opaque1; + void *opaque2; + int opaque3; +} OSFifoQueueHead; + +#endif +/*! @abstract The initialization vector for a fifo queue head. */ +#define OS_ATOMIC_FIFO_QUEUE_INIT { NULL, NULL, 0 } + +/*! @abstract Enqueue an element onto a list. + @discussion + Memory barriers are incorporated as needed to permit thread-safe access + to the queue element. + @param __list + The list on which you want to enqueue the element. + @param __new + The element to add. + @param __offset + The "offset" parameter is the offset (in bytes) of the link field + from the beginning of the data structure being queued (__new). + The link field should be a pointer type. + The __offset value needs to be same for all enqueuing and + dequeuing operations on the same list, even if different structure types + are enqueued on that list. The use of offsetset(), defined in + stddef.h is the common way to specify the __offset + value. + + @note + This API is deprecated and no longer recommended + */ +__API_DEPRECATED("No longer supported", macos(10.7, 11.0)) +void OSAtomicFifoEnqueue( OSFifoQueueHead *__list, void *__new, size_t __offset); + +/*! @abstract Dequeue an element from a list. + @discussion + Memory barriers are incorporated as needed to permit thread-safe access + to the queue element. + @param __list + The list from which you want to dequeue an element. + @param __offset + The "offset" parameter is the offset (in bytes) of the link field + from the beginning of the data structure being dequeued (__new). + The link field should be a pointer type. + The __offset value needs to be same for all enqueuing and + dequeuing operations on the same list, even if different structure types + are enqueued on that list. The use of offsetset(), defined in + stddef.h is the common way to specify the __offset + value. + @result + Returns the oldest enqueued element, or NULL if the + list is empty. + + @note + This API is deprecated and no longer recommended + */ +__API_DEPRECATED("No longer supported", macos(10.7, 11.0)) +void* OSAtomicFifoDequeue( OSFifoQueueHead *__list, size_t __offset); + +__END_DECLS + +#endif /* TARGET_OS_OSX || TARGET_OS_DRIVERKIT */ + #endif /* _OSATOMIC_DEPRECATED_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/libkern/OSAtomicQueue.h b/lib/libc/include/x86_64-macos-gnu/libkern/OSAtomicQueue.h index 3f673861e3..66033fc834 100644 --- a/lib/libc/include/x86_64-macos-gnu/libkern/OSAtomicQueue.h +++ b/lib/libc/include/x86_64-macos-gnu/libkern/OSAtomicQueue.h @@ -28,6 +28,7 @@ #include #include #include +#include "OSAtomicDeprecated.h" #include @@ -109,83 +110,6 @@ void OSAtomicEnqueue( OSQueueHead *__list, void *__new, size_t __offset); __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_4_0) void* OSAtomicDequeue( OSQueueHead *__list, size_t __offset); -#if defined(__x86_64__) || defined(__i386__) - -/*! @group Lockless atomic fifo enqueue and dequeue - * These routines manipulate singly-linked FIFO lists. - */ - -/*! @abstract The data structure for a fifo queue head. - @discussion - You should always initialize a fifo queue head structure with the - initialization vector {@link OS_ATOMIC_FIFO_QUEUE_INIT} before use. - */ -#if defined(__x86_64__) - -typedef volatile struct { - void *opaque1; - void *opaque2; - int opaque3; -} __attribute__ ((aligned (16))) OSFifoQueueHead; - -#else - -typedef volatile struct { - void *opaque1; - void *opaque2; - int opaque3; -} OSFifoQueueHead; - -#endif - -/*! @abstract The initialization vector for a fifo queue head. */ -#define OS_ATOMIC_FIFO_QUEUE_INIT { NULL, NULL, 0 } - -/*! @abstract Enqueue an element onto a list. - @discussion - Memory barriers are incorporated as needed to permit thread-safe access - to the queue element. - @param __list - The list on which you want to enqueue the element. - @param __new - The element to add. - @param __offset - The "offset" parameter is the offset (in bytes) of the link field - from the beginning of the data structure being queued (__new). - The link field should be a pointer type. - The __offset value needs to be same for all enqueuing and - dequeuing operations on the same list, even if different structure types - are enqueued on that list. The use of offsetset(), defined in - stddef.h is the common way to specify the __offset - value. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_NA) -void OSAtomicFifoEnqueue( OSFifoQueueHead *__list, void *__new, size_t __offset); - -/*! @abstract Dequeue an element from a list. - @discussion - Memory barriers are incorporated as needed to permit thread-safe access - to the queue element. - @param __list - The list from which you want to dequeue an element. - @param __offset - The "offset" parameter is the offset (in bytes) of the link field - from the beginning of the data structure being dequeued (__new). - The link field should be a pointer type. - The __offset value needs to be same for all enqueuing and - dequeuing operations on the same list, even if different structure types - are enqueued on that list. The use of offsetset(), defined in - stddef.h is the common way to specify the __offset - value. - @result - Returns the oldest enqueued element, or NULL if the - list is empty. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_NA) -void* OSAtomicFifoDequeue( OSFifoQueueHead *__list, size_t __offset); - -#endif /* __i386__ || __x86_64__ */ - __END_DECLS #endif /* _OSATOMICQUEUE_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/libkern/OSByteOrder.h b/lib/libc/include/x86_64-macos-gnu/libkern/OSByteOrder.h deleted file mode 100644 index 25563e26e7..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/libkern/OSByteOrder.h +++ /dev/null @@ -1,305 +0,0 @@ -/* - * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ - -#ifndef _OS_OSBYTEORDER_H -#define _OS_OSBYTEORDER_H - -#include -#include - -/* Macros for swapping constant values in the preprocessing stage. */ -#define OSSwapConstInt16(x) __DARWIN_OSSwapConstInt16(x) -#define OSSwapConstInt32(x) __DARWIN_OSSwapConstInt32(x) -#define OSSwapConstInt64(x) __DARWIN_OSSwapConstInt64(x) - -#if defined(__GNUC__) - -#if (defined(__i386__) || defined(__x86_64__)) -#include -#else -#include -#endif - -#else /* ! __GNUC__ */ - -#include - -#endif /* __GNUC__ */ - -#define OSSwapInt16(x) __DARWIN_OSSwapInt16(x) -#define OSSwapInt32(x) __DARWIN_OSSwapInt32(x) -#define OSSwapInt64(x) __DARWIN_OSSwapInt64(x) - -enum { - OSUnknownByteOrder, - OSLittleEndian, - OSBigEndian -}; - -OS_INLINE -int32_t -OSHostByteOrder(void) -{ -#if defined(__LITTLE_ENDIAN__) - return OSLittleEndian; -#elif defined(__BIG_ENDIAN__) - return OSBigEndian; -#else - return OSUnknownByteOrder; -#endif -} - -#define OSReadBigInt(x, y) OSReadBigInt32(x, y) -#define OSWriteBigInt(x, y, z) OSWriteBigInt32(x, y, z) -#define OSSwapBigToHostInt(x) OSSwapBigToHostInt32(x) -#define OSSwapHostToBigInt(x) OSSwapHostToBigInt32(x) -#define OSReadLittleInt(x, y) OSReadLittleInt32(x, y) -#define OSWriteLittleInt(x, y, z) OSWriteLittleInt32(x, y, z) -#define OSSwapHostToLittleInt(x) OSSwapHostToLittleInt32(x) -#define OSSwapLittleToHostInt(x) OSSwapLittleToHostInt32(x) - -/* Functions for loading native endian values. */ - -OS_INLINE -uint16_t -_OSReadInt16( - const volatile void * base, - uintptr_t byteOffset - ) -{ - return *(volatile uint16_t *)((uintptr_t)base + byteOffset); -} - -OS_INLINE -uint32_t -_OSReadInt32( - const volatile void * base, - uintptr_t byteOffset - ) -{ - return *(volatile uint32_t *)((uintptr_t)base + byteOffset); -} - -OS_INLINE -uint64_t -_OSReadInt64( - const volatile void * base, - uintptr_t byteOffset - ) -{ - return *(volatile uint64_t *)((uintptr_t)base + byteOffset); -} - -/* Functions for storing native endian values. */ - -OS_INLINE -void -_OSWriteInt16( - volatile void * base, - uintptr_t byteOffset, - uint16_t data - ) -{ - *(volatile uint16_t *)((uintptr_t)base + byteOffset) = data; -} - -OS_INLINE -void -_OSWriteInt32( - volatile void * base, - uintptr_t byteOffset, - uint32_t data - ) -{ - *(volatile uint32_t *)((uintptr_t)base + byteOffset) = data; -} - -OS_INLINE -void -_OSWriteInt64( - volatile void * base, - uintptr_t byteOffset, - uint64_t data - ) -{ - *(volatile uint64_t *)((uintptr_t)base + byteOffset) = data; -} - -#if defined(__BIG_ENDIAN__) - -/* Functions for loading big endian to host endianess. */ - -#define OSReadBigInt16(base, byteOffset) _OSReadInt16(base, byteOffset) -#define OSReadBigInt32(base, byteOffset) _OSReadInt32(base, byteOffset) -#define OSReadBigInt64(base, byteOffset) _OSReadInt64(base, byteOffset) - -/* Functions for storing host endianess to big endian. */ - -#define OSWriteBigInt16(base, byteOffset, data) _OSWriteInt16(base, byteOffset, data) -#define OSWriteBigInt32(base, byteOffset, data) _OSWriteInt32(base, byteOffset, data) -#define OSWriteBigInt64(base, byteOffset, data) _OSWriteInt64(base, byteOffset, data) - -/* Functions for loading little endian to host endianess. */ - -#define OSReadLittleInt16(base, byteOffset) OSReadSwapInt16(base, byteOffset) -#define OSReadLittleInt32(base, byteOffset) OSReadSwapInt32(base, byteOffset) -#define OSReadLittleInt64(base, byteOffset) OSReadSwapInt64(base, byteOffset) - -/* Functions for storing host endianess to little endian. */ - -#define OSWriteLittleInt16(base, byteOffset, data) OSWriteSwapInt16(base, byteOffset, data) -#define OSWriteLittleInt32(base, byteOffset, data) OSWriteSwapInt32(base, byteOffset, data) -#define OSWriteLittleInt64(base, byteOffset, data) OSWriteSwapInt64(base, byteOffset, data) - -/* Host endianess to big endian byte swapping macros for constants. */ - -#define OSSwapHostToBigConstInt16(x) ((uint16_t)(x)) -#define OSSwapHostToBigConstInt32(x) ((uint32_t)(x)) -#define OSSwapHostToBigConstInt64(x) ((uint64_t)(x)) - -/* Generic host endianess to big endian byte swapping functions. */ - -#define OSSwapHostToBigInt16(x) ((uint16_t)(x)) -#define OSSwapHostToBigInt32(x) ((uint32_t)(x)) -#define OSSwapHostToBigInt64(x) ((uint64_t)(x)) - -/* Host endianess to little endian byte swapping macros for constants. */ - -#define OSSwapHostToLittleConstInt16(x) OSSwapConstInt16(x) -#define OSSwapHostToLittleConstInt32(x) OSSwapConstInt32(x) -#define OSSwapHostToLittleConstInt64(x) OSSwapConstInt64(x) - -/* Generic host endianess to little endian byte swapping functions. */ - -#define OSSwapHostToLittleInt16(x) OSSwapInt16(x) -#define OSSwapHostToLittleInt32(x) OSSwapInt32(x) -#define OSSwapHostToLittleInt64(x) OSSwapInt64(x) - -/* Big endian to host endianess byte swapping macros for constants. */ - -#define OSSwapBigToHostConstInt16(x) ((uint16_t)(x)) -#define OSSwapBigToHostConstInt32(x) ((uint32_t)(x)) -#define OSSwapBigToHostConstInt64(x) ((uint64_t)(x)) - -/* Generic big endian to host endianess byte swapping functions. */ - -#define OSSwapBigToHostInt16(x) ((uint16_t)(x)) -#define OSSwapBigToHostInt32(x) ((uint32_t)(x)) -#define OSSwapBigToHostInt64(x) ((uint64_t)(x)) - -/* Little endian to host endianess byte swapping macros for constants. */ - -#define OSSwapLittleToHostConstInt16(x) OSSwapConstInt16(x) -#define OSSwapLittleToHostConstInt32(x) OSSwapConstInt32(x) -#define OSSwapLittleToHostConstInt64(x) OSSwapConstInt64(x) - -/* Generic little endian to host endianess byte swapping functions. */ - -#define OSSwapLittleToHostInt16(x) OSSwapInt16(x) -#define OSSwapLittleToHostInt32(x) OSSwapInt32(x) -#define OSSwapLittleToHostInt64(x) OSSwapInt64(x) - -#elif defined(__LITTLE_ENDIAN__) - -/* Functions for loading big endian to host endianess. */ - -#define OSReadBigInt16(base, byteOffset) OSReadSwapInt16(base, byteOffset) -#define OSReadBigInt32(base, byteOffset) OSReadSwapInt32(base, byteOffset) -#define OSReadBigInt64(base, byteOffset) OSReadSwapInt64(base, byteOffset) - -/* Functions for storing host endianess to big endian. */ - -#define OSWriteBigInt16(base, byteOffset, data) OSWriteSwapInt16(base, byteOffset, data) -#define OSWriteBigInt32(base, byteOffset, data) OSWriteSwapInt32(base, byteOffset, data) -#define OSWriteBigInt64(base, byteOffset, data) OSWriteSwapInt64(base, byteOffset, data) - -/* Functions for loading little endian to host endianess. */ - -#define OSReadLittleInt16(base, byteOffset) _OSReadInt16(base, byteOffset) -#define OSReadLittleInt32(base, byteOffset) _OSReadInt32(base, byteOffset) -#define OSReadLittleInt64(base, byteOffset) _OSReadInt64(base, byteOffset) - -/* Functions for storing host endianess to little endian. */ - -#define OSWriteLittleInt16(base, byteOffset, data) _OSWriteInt16(base, byteOffset, data) -#define OSWriteLittleInt32(base, byteOffset, data) _OSWriteInt32(base, byteOffset, data) -#define OSWriteLittleInt64(base, byteOffset, data) _OSWriteInt64(base, byteOffset, data) - -/* Host endianess to big endian byte swapping macros for constants. */ - -#define OSSwapHostToBigConstInt16(x) OSSwapConstInt16(x) -#define OSSwapHostToBigConstInt32(x) OSSwapConstInt32(x) -#define OSSwapHostToBigConstInt64(x) OSSwapConstInt64(x) - -/* Generic host endianess to big endian byte swapping functions. */ - -#define OSSwapHostToBigInt16(x) OSSwapInt16(x) -#define OSSwapHostToBigInt32(x) OSSwapInt32(x) -#define OSSwapHostToBigInt64(x) OSSwapInt64(x) - -/* Host endianess to little endian byte swapping macros for constants. */ - -#define OSSwapHostToLittleConstInt16(x) ((uint16_t)(x)) -#define OSSwapHostToLittleConstInt32(x) ((uint32_t)(x)) -#define OSSwapHostToLittleConstInt64(x) ((uint64_t)(x)) - -/* Generic host endianess to little endian byte swapping functions. */ - -#define OSSwapHostToLittleInt16(x) ((uint16_t)(x)) -#define OSSwapHostToLittleInt32(x) ((uint32_t)(x)) -#define OSSwapHostToLittleInt64(x) ((uint64_t)(x)) - -/* Big endian to host endianess byte swapping macros for constants. */ - -#define OSSwapBigToHostConstInt16(x) OSSwapConstInt16(x) -#define OSSwapBigToHostConstInt32(x) OSSwapConstInt32(x) -#define OSSwapBigToHostConstInt64(x) OSSwapConstInt64(x) - -/* Generic big endian to host endianess byte swapping functions. */ - -#define OSSwapBigToHostInt16(x) OSSwapInt16(x) -#define OSSwapBigToHostInt32(x) OSSwapInt32(x) -#define OSSwapBigToHostInt64(x) OSSwapInt64(x) - -/* Little endian to host endianess byte swapping macros for constants. */ - -#define OSSwapLittleToHostConstInt16(x) ((uint16_t)(x)) -#define OSSwapLittleToHostConstInt32(x) ((uint32_t)(x)) -#define OSSwapLittleToHostConstInt64(x) ((uint64_t)(x)) - -/* Generic little endian to host endianess byte swapping functions. */ - -#define OSSwapLittleToHostInt16(x) ((uint16_t)(x)) -#define OSSwapLittleToHostInt32(x) ((uint32_t)(x)) -#define OSSwapLittleToHostInt64(x) ((uint64_t)(x)) - -#else -#error Unknown endianess. -#endif - -#endif /* ! _OS_OSBYTEORDER_H */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/libkern/_OSByteOrder.h b/lib/libc/include/x86_64-macos-gnu/libkern/_OSByteOrder.h deleted file mode 100644 index 06614c63ea..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/libkern/_OSByteOrder.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (c) 2006 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ - -#ifndef _OS__OSBYTEORDER_H -#define _OS__OSBYTEORDER_H - -/* - * This header is normally included from . However, - * also includes this in the case of little-endian - * architectures, so that we can map OSByteOrder routines to the hton* and ntoh* - * macros. This results in the asymmetry below; we only include - * for little-endian architectures. - */ - -#include - -/* Macros for swapping constant values in the preprocessing stage. */ -#define __DARWIN_OSSwapConstInt16(x) \ - ((__uint16_t)((((__uint16_t)(x) & 0xff00) >> 8) | \ - (((__uint16_t)(x) & 0x00ff) << 8))) - -#define __DARWIN_OSSwapConstInt32(x) \ - ((__uint32_t)((((__uint32_t)(x) & 0xff000000) >> 24) | \ - (((__uint32_t)(x) & 0x00ff0000) >> 8) | \ - (((__uint32_t)(x) & 0x0000ff00) << 8) | \ - (((__uint32_t)(x) & 0x000000ff) << 24))) - -#define __DARWIN_OSSwapConstInt64(x) \ - ((__uint64_t)((((__uint64_t)(x) & 0xff00000000000000ULL) >> 56) | \ - (((__uint64_t)(x) & 0x00ff000000000000ULL) >> 40) | \ - (((__uint64_t)(x) & 0x0000ff0000000000ULL) >> 24) | \ - (((__uint64_t)(x) & 0x000000ff00000000ULL) >> 8) | \ - (((__uint64_t)(x) & 0x00000000ff000000ULL) << 8) | \ - (((__uint64_t)(x) & 0x0000000000ff0000ULL) << 24) | \ - (((__uint64_t)(x) & 0x000000000000ff00ULL) << 40) | \ - (((__uint64_t)(x) & 0x00000000000000ffULL) << 56))) - -#if defined(__GNUC__) - -#if defined(__i386__) || defined(__x86_64__) -#include -#endif - - - -#define __DARWIN_OSSwapInt16(x) \ - ((__uint16_t)(__builtin_constant_p(x) ? __DARWIN_OSSwapConstInt16(x) : _OSSwapInt16(x))) - -#define __DARWIN_OSSwapInt32(x) \ - (__builtin_constant_p(x) ? __DARWIN_OSSwapConstInt32(x) : _OSSwapInt32(x)) - -#define __DARWIN_OSSwapInt64(x) \ - (__builtin_constant_p(x) ? __DARWIN_OSSwapConstInt64(x) : _OSSwapInt64(x)) - -#else /* ! __GNUC__ */ - -#if defined(__i386__) || defined(__x86_64__) - -#if !defined(__DARWIN_OS_INLINE) -# if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -# define __DARWIN_OS_INLINE static inline -# elif defined(__MWERKS__) || defined(__cplusplus) -# define __DARWIN_OS_INLINE static inline -# else -# define __DARWIN_OS_INLINE static __inline__ -# endif -#endif - -__DARWIN_OS_INLINE -uint16_t -_OSSwapInt16( - uint16_t data - ) -{ - return __DARWIN_OSSwapConstInt16(data); -} - -__DARWIN_OS_INLINE -uint32_t -_OSSwapInt32( - uint32_t data - ) -{ - return __DARWIN_OSSwapConstInt32(data); -} - -__DARWIN_OS_INLINE -uint64_t -_OSSwapInt64( - uint64_t data - ) -{ - return __DARWIN_OSSwapConstInt64(data); -} -#endif - -#define __DARWIN_OSSwapInt16(x) _OSSwapInt16(x) - -#define __DARWIN_OSSwapInt32(x) _OSSwapInt32(x) - -#define __DARWIN_OSSwapInt64(x) _OSSwapInt64(x) - -#endif /* __GNUC__ */ - -#endif /* ! _OS__OSBYTEORDER_H */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/libproc.h b/lib/libc/include/x86_64-macos-gnu/libproc.h deleted file mode 100644 index 4094fe40ef..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/libproc.h +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright (c) 2006, 2007, 2010 Apple Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ -#ifndef _LIBPROC_H_ -#define _LIBPROC_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include /* for audit_token_t */ - -#include - -#include -#include - -/* - * This header file contains private interfaces to obtain process information. - * These interfaces are subject to change in future releases. - */ - -/*! - * @define PROC_LISTPIDSPATH_PATH_IS_VOLUME - * @discussion This flag indicates that all processes that hold open - * file references on the volume associated with the specified - * path should be returned. - */ -#define PROC_LISTPIDSPATH_PATH_IS_VOLUME 1 - - -/*! - * @define PROC_LISTPIDSPATH_EXCLUDE_EVTONLY - * @discussion This flag indicates that file references that were opened - * with the O_EVTONLY flag should be excluded from the matching - * criteria. - */ -#define PROC_LISTPIDSPATH_EXCLUDE_EVTONLY 2 - -__BEGIN_DECLS - - -/*! - * @function proc_listpidspath - * @discussion A function which will search through the current - * processes looking for open file references which match - * a specified path or volume. - * @param type types of processes to be searched (see proc_listpids) - * @param typeinfo adjunct information for type - * @param path file or volume path - * @param pathflags flags to control which files should be considered - * during the process search. - * @param buffer a C array of int-sized values to be filled with - * process identifiers that hold an open file reference - * matching the specified path or volume. Pass NULL to - * obtain the minimum buffer size needed to hold the - * currently active processes. - * @param buffersize the size (in bytes) of the provided buffer. - * @result the number of bytes of data returned in the provided buffer; - * -1 if an error was encountered; - */ -int proc_listpidspath(uint32_t type, - uint32_t typeinfo, - const char *path, - uint32_t pathflags, - void *buffer, - int buffersize) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); - -int proc_listpids(uint32_t type, uint32_t typeinfo, void *buffer, int buffersize) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); -int proc_listallpids(void * buffer, int buffersize) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_1); -int proc_listpgrppids(pid_t pgrpid, void * buffer, int buffersize) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_1); -int proc_listchildpids(pid_t ppid, void * buffer, int buffersize) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_1); -int proc_pidinfo(int pid, int flavor, uint64_t arg, void *buffer, int buffersize) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); -int proc_pidfdinfo(int pid, int fd, int flavor, void * buffer, int buffersize) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); -int proc_pidfileportinfo(int pid, uint32_t fileport, int flavor, void *buffer, int buffersize) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); -int proc_name(int pid, void * buffer, uint32_t buffersize) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); -int proc_regionfilename(int pid, uint64_t address, void * buffer, uint32_t buffersize) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); -int proc_kmsgbuf(void * buffer, uint32_t buffersize) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); -int proc_pidpath(int pid, void * buffer, uint32_t buffersize) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); -int proc_pidpath_audittoken(audit_token_t *audittoken, void * buffer, uint32_t buffersize) API_AVAILABLE(macos(11.0), ios(14.0), watchos(7.0), tvos(14.0)); -int proc_libversion(int *major, int * minor) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); - -/* - * Return resource usage information for the given pid, which can be a live process or a zombie. - * - * Returns 0 on success; or -1 on failure, with errno set to indicate the specific error. - */ -int proc_pid_rusage(int pid, int flavor, rusage_info_t *buffer) __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0); - -/* - * A process can use the following api to set its own process control - * state on resoure starvation. The argument can have one of the PROC_SETPC_XX values - */ -#define PROC_SETPC_NONE 0 -#define PROC_SETPC_THROTTLEMEM 1 -#define PROC_SETPC_SUSPEND 2 -#define PROC_SETPC_TERMINATE 3 - -int proc_setpcontrol(const int control) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2); -int proc_setpcontrol(const int control); - -int proc_track_dirty(pid_t pid, uint32_t flags); -int proc_set_dirty(pid_t pid, bool dirty); -int proc_get_dirty(pid_t pid, uint32_t *flags); -int proc_clear_dirty(pid_t pid, uint32_t flags); - -int proc_terminate(pid_t pid, int *sig); - -/* - * NO_SMT means that on an SMT CPU, this thread must be scheduled alone, - * with the paired CPU idle. - * - * Set NO_SMT on the current proc (all existing and future threads) - * This attribute is inherited on fork and exec - */ -int proc_set_no_smt(void) __API_AVAILABLE(macos(11.0)); - -/* Set NO_SMT on the current thread */ -int proc_setthread_no_smt(void) __API_AVAILABLE(macos(11.0)); - -/* - * CPU Security Mitigation APIs - * - * Set CPU security mitigation on the current proc (all existing and future threads) - * This attribute is inherited on fork and exec - */ -int proc_set_csm(uint32_t flags) __API_AVAILABLE(macos(11.0)); - -/* Set CPU security mitigation on the current thread */ -int proc_setthread_csm(uint32_t flags) __API_AVAILABLE(macos(11.0)); - -/* - * flags for CPU Security Mitigation APIs - * PROC_CSM_ALL should be used in most cases, - * the individual flags are provided only for performance evaluation etc - */ -#define PROC_CSM_ALL 0x0001 /* Set all available mitigations */ -#define PROC_CSM_NOSMT 0x0002 /* Set NO_SMT - see above */ -#define PROC_CSM_TECS 0x0004 /* Execute VERW on every return to user mode */ - -#ifdef PRIVATE -#include -/* - * Enumerate potential userspace pointers embedded in kernel data structures. - * Currently inspects kqueues only. - * - * NOTE: returned "pointers" are opaque user-supplied values and thus not - * guaranteed to address valid objects or be pointers at all. - * - * Returns the number of pointers found (which may exceed buffersize), or -1 on - * failure and errno set appropriately. - */ -int proc_list_uptrs(pid_t pid, uint64_t *buffer, uint32_t buffersize); - -int proc_list_dynkqueueids(int pid, kqueue_id_t *buf, uint32_t bufsz); -int proc_piddynkqueueinfo(int pid, int flavor, kqueue_id_t kq_id, void *buffer, - int buffersize); -#endif /* PRIVATE */ - -int proc_udata_info(int pid, int flavor, void *buffer, int buffersize); - -__END_DECLS - -#endif /*_LIBPROC_H_ */ diff --git a/lib/libc/include/x86_64-macos-gnu/mach-o/dyld.h b/lib/libc/include/x86_64-macos-gnu/mach-o/dyld.h deleted file mode 100644 index 0b293cbd09..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach-o/dyld.h +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Copyright (c) 1999-2008 Apple Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ -#ifndef _MACH_O_DYLD_H_ -#define _MACH_O_DYLD_H_ - - -#include -#include -#include - -#include -#include - -#if __cplusplus -extern "C" { -#endif - -#ifdef __DRIVERKIT_19_0 - #define DYLD_DRIVERKIT_UNAVAILABLE __API_UNAVAILABLE(driverkit) -#else - #define DYLD_DRIVERKIT_UNAVAILABLE -#endif - -/* - * The following functions allow you to iterate through all loaded images. - * This is not a thread safe operation. Another thread can add or remove - * an image during the iteration. - * - * Many uses of these routines can be replace by a call to dladdr() which - * will return the mach_header and name of an image, given an address in - * the image. dladdr() is thread safe. - */ -extern uint32_t _dyld_image_count(void) __OSX_AVAILABLE_STARTING(__MAC_10_1, __IPHONE_2_0); -extern const struct mach_header* _dyld_get_image_header(uint32_t image_index) __OSX_AVAILABLE_STARTING(__MAC_10_1, __IPHONE_2_0); -extern intptr_t _dyld_get_image_vmaddr_slide(uint32_t image_index) __OSX_AVAILABLE_STARTING(__MAC_10_1, __IPHONE_2_0); -extern const char* _dyld_get_image_name(uint32_t image_index) __OSX_AVAILABLE_STARTING(__MAC_10_1, __IPHONE_2_0); - - -/* - * The following functions allow you to install callbacks which will be called - * by dyld whenever an image is loaded or unloaded. During a call to _dyld_register_func_for_add_image() - * the callback func is called for every existing image. Later, it is called as each new image - * is loaded and bound (but initializers not yet run). The callback registered with - * _dyld_register_func_for_remove_image() is called after any terminators in an image are run - * and before the image is un-memory-mapped. - */ -extern void _dyld_register_func_for_add_image(void (*func)(const struct mach_header* mh, intptr_t vmaddr_slide)) __OSX_AVAILABLE_STARTING(__MAC_10_1, __IPHONE_2_0); -extern void _dyld_register_func_for_remove_image(void (*func)(const struct mach_header* mh, intptr_t vmaddr_slide)) __OSX_AVAILABLE_STARTING(__MAC_10_1, __IPHONE_2_0); - - -/* - * NSVersionOfRunTimeLibrary() returns the current_version number of the currently dylib - * specifed by the libraryName. The libraryName parameter would be "bar" for /path/libbar.3.dylib and - * "Foo" for /path/Foo.framework/Versions/A/Foo. It returns -1 if no such library is loaded. - */ -extern int32_t NSVersionOfRunTimeLibrary(const char* libraryName) __OSX_AVAILABLE_STARTING(__MAC_10_1, __IPHONE_2_0); - - -/* - * NSVersionOfLinkTimeLibrary() returns the current_version number that the main executable was linked - * against at build time. The libraryName parameter would be "bar" for /path/libbar.3.dylib and - * "Foo" for /path/Foo.framework/Versions/A/Foo. It returns -1 if the main executable did not link - * against the specified library. - */ -extern int32_t NSVersionOfLinkTimeLibrary(const char* libraryName) __OSX_AVAILABLE_STARTING(__MAC_10_1, __IPHONE_2_0); - - -/* - * _NSGetExecutablePath() copies the path of the main executable into the buffer. The bufsize parameter - * should initially be the size of the buffer. The function returns 0 if the path was successfully copied, - * and *bufsize is left unchanged. It returns -1 if the buffer is not large enough, and *bufsize is set - * to the size required. - * - * Note that _NSGetExecutablePath will return "a path" to the executable not a "real path" to the executable. - * That is the path may be a symbolic link and not the real file. With deep directories the total bufsize - * needed could be more than MAXPATHLEN. - */ -extern int _NSGetExecutablePath(char* buf, uint32_t* bufsize) __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0); - - - -/* - * Registers a function to be called when the current thread terminates. - * Called by c++ compiler to implement destructors on thread_local object variables. - */ -extern void _tlv_atexit(void (*termFunc)(void* objAddr), void* objAddr) __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0); - - -/* - * Never called. On-disk thread local variables contain a pointer to this. Once - * the thread local is prepared, the pointer changes to a real handler such as tlv_get_addr. - */ -extern void _tlv_bootstrap(void) __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0) DYLD_DRIVERKIT_UNAVAILABLE ; - -/* - * The following dyld API's are deprecated as of Mac OS X 10.5. They are either - * no longer necessary or are superceeded by dlopen and friends in . - * dlopen/dlsym/dlclose have been available since Mac OS X 10.3 and work with - * dylibs and bundles. - * - * NSAddImage -> dlopen - * NSLookupSymbolInImage -> dlsym - * NSCreateObjectFileImageFromFile -> dlopen - * NSDestroyObjectFileImage -> dlclose - * NSLinkModule -> not needed when dlopen used - * NSUnLinkModule -> not needed when dlclose used - * NSLookupSymbolInModule -> dlsym - * _dyld_image_containing_address -> dladdr - * NSLinkEditError -> dlerror - * - */ - -#ifndef ENUM_DYLD_BOOL -#define ENUM_DYLD_BOOL - #undef FALSE - #undef TRUE - enum DYLD_BOOL { FALSE, TRUE }; -#endif /* ENUM_DYLD_BOOL */ - - -/* Object file image API */ -typedef enum { - NSObjectFileImageFailure, /* for this a message is printed on stderr */ - NSObjectFileImageSuccess, - NSObjectFileImageInappropriateFile, - NSObjectFileImageArch, - NSObjectFileImageFormat, /* for this a message is printed on stderr */ - NSObjectFileImageAccess -} NSObjectFileImageReturnCode; - -typedef struct __NSObjectFileImage* NSObjectFileImage; - - - -/* NSObjectFileImage can only be used with MH_BUNDLE files */ -extern NSObjectFileImageReturnCode NSCreateObjectFileImageFromFile(const char* pathName, NSObjectFileImage *objectFileImage) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "dlopen()"); -extern NSObjectFileImageReturnCode NSCreateObjectFileImageFromMemory(const void *address, size_t size, NSObjectFileImage *objectFileImage) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, ""); -extern bool NSDestroyObjectFileImage(NSObjectFileImage objectFileImage) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "dlclose()"); - -extern uint32_t NSSymbolDefinitionCountInObjectFileImage(NSObjectFileImage objectFileImage) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, ""); -extern const char* NSSymbolDefinitionNameInObjectFileImage(NSObjectFileImage objectFileImage, uint32_t ordinal) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, ""); -extern uint32_t NSSymbolReferenceCountInObjectFileImage(NSObjectFileImage objectFileImage) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, ""); -extern const char* NSSymbolReferenceNameInObjectFileImage(NSObjectFileImage objectFileImage, uint32_t ordinal, bool *tentative_definition) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, ""); -extern bool NSIsSymbolDefinedInObjectFileImage(NSObjectFileImage objectFileImage, const char* symbolName) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.4, "dlsym()"); -extern void* NSGetSectionDataInObjectFileImage(NSObjectFileImage objectFileImage, const char* segmentName, const char* sectionName, size_t *size) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "getsectiondata()"); - -typedef struct __NSModule* NSModule; -extern const char* NSNameOfModule(NSModule m) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, ""); -extern const char* NSLibraryNameForModule(NSModule m) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, ""); - -extern NSModule NSLinkModule(NSObjectFileImage objectFileImage, const char* moduleName, uint32_t options) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "dlopen()"); -#define NSLINKMODULE_OPTION_NONE 0x0 -#define NSLINKMODULE_OPTION_BINDNOW 0x1 -#define NSLINKMODULE_OPTION_PRIVATE 0x2 -#define NSLINKMODULE_OPTION_RETURN_ON_ERROR 0x4 -#define NSLINKMODULE_OPTION_DONT_CALL_MOD_INIT_ROUTINES 0x8 -#define NSLINKMODULE_OPTION_TRAILING_PHYS_NAME 0x10 - -extern bool NSUnLinkModule(NSModule module, uint32_t options) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, ""); -#define NSUNLINKMODULE_OPTION_NONE 0x0 -#define NSUNLINKMODULE_OPTION_KEEP_MEMORY_MAPPED 0x1 -#define NSUNLINKMODULE_OPTION_RESET_LAZY_REFERENCES 0x2 - -/* symbol API */ -typedef struct __NSSymbol* NSSymbol; -extern bool NSIsSymbolNameDefined(const char* symbolName) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.4, "dlsym()"); -extern bool NSIsSymbolNameDefinedWithHint(const char* symbolName, const char* libraryNameHint) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.4, "dlsym()"); -extern bool NSIsSymbolNameDefinedInImage(const struct mach_header* image, const char* symbolName) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.4, "dlsym()"); -extern NSSymbol NSLookupAndBindSymbol(const char* symbolName) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.4, "dlsym()"); -extern NSSymbol NSLookupAndBindSymbolWithHint(const char* symbolName, const char* libraryNameHint) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.4, "dlsym()"); -extern NSSymbol NSLookupSymbolInModule(NSModule module, const char* symbolName) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "dlsym()"); -extern NSSymbol NSLookupSymbolInImage(const struct mach_header* image, const char* symbolName, uint32_t options) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "dlsym()"); -#define NSLOOKUPSYMBOLINIMAGE_OPTION_BIND 0x0 -#define NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_NOW 0x1 -#define NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_FULLY 0x2 -#define NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR 0x4 -extern const char* NSNameOfSymbol(NSSymbol symbol) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, ""); -extern void * NSAddressOfSymbol(NSSymbol symbol) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "dlsym()"); -extern NSModule NSModuleForSymbol(NSSymbol symbol) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "dladdr()"); - -/* error handling API */ -typedef enum { - NSLinkEditFileAccessError, - NSLinkEditFileFormatError, - NSLinkEditMachResourceError, - NSLinkEditUnixResourceError, - NSLinkEditOtherError, - NSLinkEditWarningError, - NSLinkEditMultiplyDefinedError, - NSLinkEditUndefinedError -} NSLinkEditErrors; - -/* - * For the NSLinkEditErrors value NSLinkEditOtherError these are the values - * passed to the link edit error handler as the errorNumber (what would be an - * errno value for NSLinkEditUnixResourceError or a kern_return_t value for - * NSLinkEditMachResourceError). - */ -typedef enum { - NSOtherErrorRelocation, - NSOtherErrorLazyBind, - NSOtherErrorIndrLoop, - NSOtherErrorLazyInit, - NSOtherErrorInvalidArgs -} NSOtherErrorNumbers; - -extern void NSLinkEditError(NSLinkEditErrors *c, int *errorNumber, const char** fileName, const char** errorString) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "dlerror()"); - -typedef struct { - void (*undefined)(const char* symbolName); - NSModule (*multiple)(NSSymbol s, NSModule oldModule, NSModule newModule); - void (*linkEdit)(NSLinkEditErrors errorClass, int errorNumber, - const char* fileName, const char* errorString); -} NSLinkEditErrorHandlers; - -extern void NSInstallLinkEditErrorHandlers(const NSLinkEditErrorHandlers *handlers) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, ""); - -extern bool NSAddLibrary(const char* pathName) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.4, "dlopen()"); -extern bool NSAddLibraryWithSearching(const char* pathName) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.4, "dlopen()"); -extern const struct mach_header* NSAddImage(const char* image_name, uint32_t options) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "dlopen()"); -#define NSADDIMAGE_OPTION_NONE 0x0 -#define NSADDIMAGE_OPTION_RETURN_ON_ERROR 0x1 -#define NSADDIMAGE_OPTION_WITH_SEARCHING 0x2 -#define NSADDIMAGE_OPTION_RETURN_ONLY_IF_LOADED 0x4 -#define NSADDIMAGE_OPTION_MATCH_FILENAME_BY_INSTALLNAME 0x8 - -extern bool _dyld_present(void) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "always true"); -extern bool _dyld_launched_prebound(void) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "moot"); -extern bool _dyld_all_twolevel_modules_prebound(void) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.3, 10.5, "moot"); -extern bool _dyld_bind_fully_image_containing_address(const void* address) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "dlopen(RTLD_NOW)"); -extern bool _dyld_image_containing_address(const void* address) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.3, 10.5, "dladdr()"); -extern void _dyld_lookup_and_bind(const char* symbol_name, void **address, NSModule* module) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.4, "dlsym()"); -extern void _dyld_lookup_and_bind_with_hint(const char* symbol_name, const char* library_name_hint, void** address, NSModule* module) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.4, "dlsym()"); -extern void _dyld_lookup_and_bind_fully(const char* symbol_name, void** address, NSModule* module) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "dlsym()"); - -extern const struct mach_header* _dyld_get_image_header_containing_address(const void* address) __API_UNAVAILABLE(ios, tvos, watchos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.3, 10.5, "dladdr()"); - - -#if __cplusplus -} -#endif - -#endif /* _MACH_O_DYLD_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach-o/loader.h b/lib/libc/include/x86_64-macos-gnu/mach-o/loader.h deleted file mode 100644 index a088105205..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach-o/loader.h +++ /dev/null @@ -1,1577 +0,0 @@ -/* - * Copyright (c) 1999-2010 Apple Inc. All Rights Reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ -#ifndef _MACHO_LOADER_H_ -#define _MACHO_LOADER_H_ - -/* - * This file describes the format of mach object files. - */ -#include - -/* - * is needed here for the cpu_type_t and cpu_subtype_t types - * and contains the constants for the possible values of these types. - */ -#include - -/* - * is needed here for the vm_prot_t type and contains the - * constants that are or'ed together for the possible values of this type. - */ -#include - -/* - * is expected to define the flavors of the thread - * states and the structures of those flavors for each machine. - */ -#include -#include - -/* - * The 32-bit mach header appears at the very beginning of the object file for - * 32-bit architectures. - */ -struct mach_header { - uint32_t magic; /* mach magic number identifier */ - cpu_type_t cputype; /* cpu specifier */ - cpu_subtype_t cpusubtype; /* machine specifier */ - uint32_t filetype; /* type of file */ - uint32_t ncmds; /* number of load commands */ - uint32_t sizeofcmds; /* the size of all the load commands */ - uint32_t flags; /* flags */ -}; - -/* Constant for the magic field of the mach_header (32-bit architectures) */ -#define MH_MAGIC 0xfeedface /* the mach magic number */ -#define MH_CIGAM 0xcefaedfe /* NXSwapInt(MH_MAGIC) */ - -/* - * The 64-bit mach header appears at the very beginning of object files for - * 64-bit architectures. - */ -struct mach_header_64 { - uint32_t magic; /* mach magic number identifier */ - cpu_type_t cputype; /* cpu specifier */ - cpu_subtype_t cpusubtype; /* machine specifier */ - uint32_t filetype; /* type of file */ - uint32_t ncmds; /* number of load commands */ - uint32_t sizeofcmds; /* the size of all the load commands */ - uint32_t flags; /* flags */ - uint32_t reserved; /* reserved */ -}; - -/* Constant for the magic field of the mach_header_64 (64-bit architectures) */ -#define MH_MAGIC_64 0xfeedfacf /* the 64-bit mach magic number */ -#define MH_CIGAM_64 0xcffaedfe /* NXSwapInt(MH_MAGIC_64) */ - -/* - * The layout of the file depends on the filetype. For all but the MH_OBJECT - * file type the segments are padded out and aligned on a segment alignment - * boundary for efficient demand pageing. The MH_EXECUTE, MH_FVMLIB, MH_DYLIB, - * MH_DYLINKER and MH_BUNDLE file types also have the headers included as part - * of their first segment. - * - * The file type MH_OBJECT is a compact format intended as output of the - * assembler and input (and possibly output) of the link editor (the .o - * format). All sections are in one unnamed segment with no segment padding. - * This format is used as an executable format when the file is so small the - * segment padding greatly increases its size. - * - * The file type MH_PRELOAD is an executable format intended for things that - * are not executed under the kernel (proms, stand alones, kernels, etc). The - * format can be executed under the kernel but may demand paged it and not - * preload it before execution. - * - * A core file is in MH_CORE format and can be any in an arbritray legal - * Mach-O file. - * - * Constants for the filetype field of the mach_header - */ -#define MH_OBJECT 0x1 /* relocatable object file */ -#define MH_EXECUTE 0x2 /* demand paged executable file */ -#define MH_FVMLIB 0x3 /* fixed VM shared library file */ -#define MH_CORE 0x4 /* core file */ -#define MH_PRELOAD 0x5 /* preloaded executable file */ -#define MH_DYLIB 0x6 /* dynamically bound shared library */ -#define MH_DYLINKER 0x7 /* dynamic link editor */ -#define MH_BUNDLE 0x8 /* dynamically bound bundle file */ -#define MH_DYLIB_STUB 0x9 /* shared library stub for static */ - /* linking only, no section contents */ -#define MH_DSYM 0xa /* companion file with only debug */ - /* sections */ -#define MH_KEXT_BUNDLE 0xb /* x86_64 kexts */ - -/* Constants for the flags field of the mach_header */ -#define MH_NOUNDEFS 0x1 /* the object file has no undefined - references */ -#define MH_INCRLINK 0x2 /* the object file is the output of an - incremental link against a base file - and can't be link edited again */ -#define MH_DYLDLINK 0x4 /* the object file is input for the - dynamic linker and can't be staticly - link edited again */ -#define MH_BINDATLOAD 0x8 /* the object file's undefined - references are bound by the dynamic - linker when loaded. */ -#define MH_PREBOUND 0x10 /* the file has its dynamic undefined - references prebound. */ -#define MH_SPLIT_SEGS 0x20 /* the file has its read-only and - read-write segments split */ -#define MH_LAZY_INIT 0x40 /* the shared library init routine is - to be run lazily via catching memory - faults to its writeable segments - (obsolete) */ -#define MH_TWOLEVEL 0x80 /* the image is using two-level name - space bindings */ -#define MH_FORCE_FLAT 0x100 /* the executable is forcing all images - to use flat name space bindings */ -#define MH_NOMULTIDEFS 0x200 /* this umbrella guarantees no multiple - defintions of symbols in its - sub-images so the two-level namespace - hints can always be used. */ -#define MH_NOFIXPREBINDING 0x400 /* do not have dyld notify the - prebinding agent about this - executable */ -#define MH_PREBINDABLE 0x800 /* the binary is not prebound but can - have its prebinding redone. only used - when MH_PREBOUND is not set. */ -#define MH_ALLMODSBOUND 0x1000 /* indicates that this binary binds to - all two-level namespace modules of - its dependent libraries. only used - when MH_PREBINDABLE and MH_TWOLEVEL - are both set. */ -#define MH_SUBSECTIONS_VIA_SYMBOLS 0x2000/* safe to divide up the sections into - sub-sections via symbols for dead - code stripping */ -#define MH_CANONICAL 0x4000 /* the binary has been canonicalized - via the unprebind operation */ -#define MH_WEAK_DEFINES 0x8000 /* the final linked image contains - external weak symbols */ -#define MH_BINDS_TO_WEAK 0x10000 /* the final linked image uses - weak symbols */ - -#define MH_ALLOW_STACK_EXECUTION 0x20000/* When this bit is set, all stacks - in the task will be given stack - execution privilege. Only used in - MH_EXECUTE filetypes. */ -#define MH_ROOT_SAFE 0x40000 /* When this bit is set, the binary - declares it is safe for use in - processes with uid zero */ - -#define MH_SETUID_SAFE 0x80000 /* When this bit is set, the binary - declares it is safe for use in - processes when issetugid() is true */ - -#define MH_NO_REEXPORTED_DYLIBS 0x100000 /* When this bit is set on a dylib, - the static linker does not need to - examine dependent dylibs to see - if any are re-exported */ -#define MH_PIE 0x200000 /* When this bit is set, the OS will - load the main executable at a - random address. Only used in - MH_EXECUTE filetypes. */ -#define MH_DEAD_STRIPPABLE_DYLIB 0x400000 /* Only for use on dylibs. When - linking against a dylib that - has this bit set, the static linker - will automatically not create a - LC_LOAD_DYLIB load command to the - dylib if no symbols are being - referenced from the dylib. */ -#define MH_HAS_TLV_DESCRIPTORS 0x800000 /* Contains a section of type - S_THREAD_LOCAL_VARIABLES */ - -#define MH_NO_HEAP_EXECUTION 0x1000000 /* When this bit is set, the OS will - run the main executable with - a non-executable heap even on - platforms (e.g. i386) that don't - require it. Only used in MH_EXECUTE - filetypes. */ - -#define MH_APP_EXTENSION_SAFE 0x02000000 /* The code was linked for use in an - application extension. */ - -#define MH_NLIST_OUTOFSYNC_WITH_DYLDINFO 0x04000000 /* The external symbols - listed in the nlist symbol table do - not include all the symbols listed in - the dyld info. */ - -#define MH_SIM_SUPPORT 0x08000000 /* Allow LC_MIN_VERSION_MACOS and - LC_BUILD_VERSION load commands with - the platforms macOS, macCatalyst, - iOSSimulator, tvOSSimulator and - watchOSSimulator. */ - -#define MH_DYLIB_IN_CACHE 0x80000000 /* Only for use on dylibs. When this bit - is set, the dylib is part of the dyld - shared cache, rather than loose in - the filesystem. */ - -/* - * The load commands directly follow the mach_header. The total size of all - * of the commands is given by the sizeofcmds field in the mach_header. All - * load commands must have as their first two fields cmd and cmdsize. The cmd - * field is filled in with a constant for that command type. Each command type - * has a structure specifically for it. The cmdsize field is the size in bytes - * of the particular load command structure plus anything that follows it that - * is a part of the load command (i.e. section structures, strings, etc.). To - * advance to the next load command the cmdsize can be added to the offset or - * pointer of the current load command. The cmdsize for 32-bit architectures - * MUST be a multiple of 4 bytes and for 64-bit architectures MUST be a multiple - * of 8 bytes (these are forever the maximum alignment of any load commands). - * The padded bytes must be zero. All tables in the object file must also - * follow these rules so the file can be memory mapped. Otherwise the pointers - * to these tables will not work well or at all on some machines. With all - * padding zeroed like objects will compare byte for byte. - */ -struct load_command { - uint32_t cmd; /* type of load command */ - uint32_t cmdsize; /* total size of command in bytes */ -}; - -/* - * After MacOS X 10.1 when a new load command is added that is required to be - * understood by the dynamic linker for the image to execute properly the - * LC_REQ_DYLD bit will be or'ed into the load command constant. If the dynamic - * linker sees such a load command it it does not understand will issue a - * "unknown load command required for execution" error and refuse to use the - * image. Other load commands without this bit that are not understood will - * simply be ignored. - */ -#define LC_REQ_DYLD 0x80000000 - -/* Constants for the cmd field of all load commands, the type */ -#define LC_SEGMENT 0x1 /* segment of this file to be mapped */ -#define LC_SYMTAB 0x2 /* link-edit stab symbol table info */ -#define LC_SYMSEG 0x3 /* link-edit gdb symbol table info (obsolete) */ -#define LC_THREAD 0x4 /* thread */ -#define LC_UNIXTHREAD 0x5 /* unix thread (includes a stack) */ -#define LC_LOADFVMLIB 0x6 /* load a specified fixed VM shared library */ -#define LC_IDFVMLIB 0x7 /* fixed VM shared library identification */ -#define LC_IDENT 0x8 /* object identification info (obsolete) */ -#define LC_FVMFILE 0x9 /* fixed VM file inclusion (internal use) */ -#define LC_PREPAGE 0xa /* prepage command (internal use) */ -#define LC_DYSYMTAB 0xb /* dynamic link-edit symbol table info */ -#define LC_LOAD_DYLIB 0xc /* load a dynamically linked shared library */ -#define LC_ID_DYLIB 0xd /* dynamically linked shared lib ident */ -#define LC_LOAD_DYLINKER 0xe /* load a dynamic linker */ -#define LC_ID_DYLINKER 0xf /* dynamic linker identification */ -#define LC_PREBOUND_DYLIB 0x10 /* modules prebound for a dynamically */ - /* linked shared library */ -#define LC_ROUTINES 0x11 /* image routines */ -#define LC_SUB_FRAMEWORK 0x12 /* sub framework */ -#define LC_SUB_UMBRELLA 0x13 /* sub umbrella */ -#define LC_SUB_CLIENT 0x14 /* sub client */ -#define LC_SUB_LIBRARY 0x15 /* sub library */ -#define LC_TWOLEVEL_HINTS 0x16 /* two-level namespace lookup hints */ -#define LC_PREBIND_CKSUM 0x17 /* prebind checksum */ - -/* - * load a dynamically linked shared library that is allowed to be missing - * (all symbols are weak imported). - */ -#define LC_LOAD_WEAK_DYLIB (0x18 | LC_REQ_DYLD) - -#define LC_SEGMENT_64 0x19 /* 64-bit segment of this file to be - mapped */ -#define LC_ROUTINES_64 0x1a /* 64-bit image routines */ -#define LC_UUID 0x1b /* the uuid */ -#define LC_RPATH (0x1c | LC_REQ_DYLD) /* runpath additions */ -#define LC_CODE_SIGNATURE 0x1d /* local of code signature */ -#define LC_SEGMENT_SPLIT_INFO 0x1e /* local of info to split segments */ -#define LC_REEXPORT_DYLIB (0x1f | LC_REQ_DYLD) /* load and re-export dylib */ -#define LC_LAZY_LOAD_DYLIB 0x20 /* delay load of dylib until first use */ -#define LC_ENCRYPTION_INFO 0x21 /* encrypted segment information */ -#define LC_DYLD_INFO 0x22 /* compressed dyld information */ -#define LC_DYLD_INFO_ONLY (0x22|LC_REQ_DYLD) /* compressed dyld information only */ -#define LC_LOAD_UPWARD_DYLIB (0x23 | LC_REQ_DYLD) /* load upward dylib */ -#define LC_VERSION_MIN_MACOSX 0x24 /* build for MacOSX min OS version */ -#define LC_VERSION_MIN_IPHONEOS 0x25 /* build for iPhoneOS min OS version */ -#define LC_FUNCTION_STARTS 0x26 /* compressed table of function start addresses */ -#define LC_DYLD_ENVIRONMENT 0x27 /* string for dyld to treat - like environment variable */ -#define LC_MAIN (0x28|LC_REQ_DYLD) /* replacement for LC_UNIXTHREAD */ -#define LC_DATA_IN_CODE 0x29 /* table of non-instructions in __text */ -#define LC_SOURCE_VERSION 0x2A /* source version used to build binary */ -#define LC_DYLIB_CODE_SIGN_DRS 0x2B /* Code signing DRs copied from linked dylibs */ -#define LC_ENCRYPTION_INFO_64 0x2C /* 64-bit encrypted segment information */ -#define LC_LINKER_OPTION 0x2D /* linker options in MH_OBJECT files */ -#define LC_LINKER_OPTIMIZATION_HINT 0x2E /* optimization hints in MH_OBJECT files */ -#define LC_VERSION_MIN_TVOS 0x2F /* build for AppleTV min OS version */ -#define LC_VERSION_MIN_WATCHOS 0x30 /* build for Watch min OS version */ -#define LC_NOTE 0x31 /* arbitrary data included within a Mach-O file */ -#define LC_BUILD_VERSION 0x32 /* build for platform min OS version */ -#define LC_DYLD_EXPORTS_TRIE (0x33 | LC_REQ_DYLD) /* used with linkedit_data_command, payload is trie */ -#define LC_DYLD_CHAINED_FIXUPS (0x34 | LC_REQ_DYLD) /* used with linkedit_data_command */ - -/* - * A variable length string in a load command is represented by an lc_str - * union. The strings are stored just after the load command structure and - * the offset is from the start of the load command structure. The size - * of the string is reflected in the cmdsize field of the load command. - * Once again any padded bytes to bring the cmdsize field to a multiple - * of 4 bytes must be zero. - */ -union lc_str { - uint32_t offset; /* offset to the string */ -#ifndef __LP64__ - char *ptr; /* pointer to the string */ -#endif -}; - -/* - * The segment load command indicates that a part of this file is to be - * mapped into the task's address space. The size of this segment in memory, - * vmsize, maybe equal to or larger than the amount to map from this file, - * filesize. The file is mapped starting at fileoff to the beginning of - * the segment in memory, vmaddr. The rest of the memory of the segment, - * if any, is allocated zero fill on demand. The segment's maximum virtual - * memory protection and initial virtual memory protection are specified - * by the maxprot and initprot fields. If the segment has sections then the - * section structures directly follow the segment command and their size is - * reflected in cmdsize. - */ -struct segment_command { /* for 32-bit architectures */ - uint32_t cmd; /* LC_SEGMENT */ - uint32_t cmdsize; /* includes sizeof section structs */ - char segname[16]; /* segment name */ - uint32_t vmaddr; /* memory address of this segment */ - uint32_t vmsize; /* memory size of this segment */ - uint32_t fileoff; /* file offset of this segment */ - uint32_t filesize; /* amount to map from the file */ - vm_prot_t maxprot; /* maximum VM protection */ - vm_prot_t initprot; /* initial VM protection */ - uint32_t nsects; /* number of sections in segment */ - uint32_t flags; /* flags */ -}; - -/* - * The 64-bit segment load command indicates that a part of this file is to be - * mapped into a 64-bit task's address space. If the 64-bit segment has - * sections then section_64 structures directly follow the 64-bit segment - * command and their size is reflected in cmdsize. - */ -struct segment_command_64 { /* for 64-bit architectures */ - uint32_t cmd; /* LC_SEGMENT_64 */ - uint32_t cmdsize; /* includes sizeof section_64 structs */ - char segname[16]; /* segment name */ - uint64_t vmaddr; /* memory address of this segment */ - uint64_t vmsize; /* memory size of this segment */ - uint64_t fileoff; /* file offset of this segment */ - uint64_t filesize; /* amount to map from the file */ - vm_prot_t maxprot; /* maximum VM protection */ - vm_prot_t initprot; /* initial VM protection */ - uint32_t nsects; /* number of sections in segment */ - uint32_t flags; /* flags */ -}; - -/* Constants for the flags field of the segment_command */ -#define SG_HIGHVM 0x1 /* the file contents for this segment is for - the high part of the VM space, the low part - is zero filled (for stacks in core files) */ -#define SG_FVMLIB 0x2 /* this segment is the VM that is allocated by - a fixed VM library, for overlap checking in - the link editor */ -#define SG_NORELOC 0x4 /* this segment has nothing that was relocated - in it and nothing relocated to it, that is - it maybe safely replaced without relocation*/ -#define SG_PROTECTED_VERSION_1 0x8 /* This segment is protected. If the - segment starts at file offset 0, the - first page of the segment is not - protected. All other pages of the - segment are protected. */ -#define SG_READ_ONLY 0x10 /* This segment is made read-only after fixups */ - - - -/* - * A segment is made up of zero or more sections. Non-MH_OBJECT files have - * all of their segments with the proper sections in each, and padded to the - * specified segment alignment when produced by the link editor. The first - * segment of a MH_EXECUTE and MH_FVMLIB format file contains the mach_header - * and load commands of the object file before its first section. The zero - * fill sections are always last in their segment (in all formats). This - * allows the zeroed segment padding to be mapped into memory where zero fill - * sections might be. The gigabyte zero fill sections, those with the section - * type S_GB_ZEROFILL, can only be in a segment with sections of this type. - * These segments are then placed after all other segments. - * - * The MH_OBJECT format has all of its sections in one segment for - * compactness. There is no padding to a specified segment boundary and the - * mach_header and load commands are not part of the segment. - * - * Sections with the same section name, sectname, going into the same segment, - * segname, are combined by the link editor. The resulting section is aligned - * to the maximum alignment of the combined sections and is the new section's - * alignment. The combined sections are aligned to their original alignment in - * the combined section. Any padded bytes to get the specified alignment are - * zeroed. - * - * The format of the relocation entries referenced by the reloff and nreloc - * fields of the section structure for mach object files is described in the - * header file . - */ -struct section { /* for 32-bit architectures */ - char sectname[16]; /* name of this section */ - char segname[16]; /* segment this section goes in */ - uint32_t addr; /* memory address of this section */ - uint32_t size; /* size in bytes of this section */ - uint32_t offset; /* file offset of this section */ - uint32_t align; /* section alignment (power of 2) */ - uint32_t reloff; /* file offset of relocation entries */ - uint32_t nreloc; /* number of relocation entries */ - uint32_t flags; /* flags (section type and attributes)*/ - uint32_t reserved1; /* reserved (for offset or index) */ - uint32_t reserved2; /* reserved (for count or sizeof) */ -}; - -struct section_64 { /* for 64-bit architectures */ - char sectname[16]; /* name of this section */ - char segname[16]; /* segment this section goes in */ - uint64_t addr; /* memory address of this section */ - uint64_t size; /* size in bytes of this section */ - uint32_t offset; /* file offset of this section */ - uint32_t align; /* section alignment (power of 2) */ - uint32_t reloff; /* file offset of relocation entries */ - uint32_t nreloc; /* number of relocation entries */ - uint32_t flags; /* flags (section type and attributes)*/ - uint32_t reserved1; /* reserved (for offset or index) */ - uint32_t reserved2; /* reserved (for count or sizeof) */ - uint32_t reserved3; /* reserved */ -}; - -/* - * The flags field of a section structure is separated into two parts a section - * type and section attributes. The section types are mutually exclusive (it - * can only have one type) but the section attributes are not (it may have more - * than one attribute). - */ -#define SECTION_TYPE 0x000000ff /* 256 section types */ -#define SECTION_ATTRIBUTES 0xffffff00 /* 24 section attributes */ - -/* Constants for the type of a section */ -#define S_REGULAR 0x0 /* regular section */ -#define S_ZEROFILL 0x1 /* zero fill on demand section */ -#define S_CSTRING_LITERALS 0x2 /* section with only literal C strings*/ -#define S_4BYTE_LITERALS 0x3 /* section with only 4 byte literals */ -#define S_8BYTE_LITERALS 0x4 /* section with only 8 byte literals */ -#define S_LITERAL_POINTERS 0x5 /* section with only pointers to */ - /* literals */ -/* - * For the two types of symbol pointers sections and the symbol stubs section - * they have indirect symbol table entries. For each of the entries in the - * section the indirect symbol table entries, in corresponding order in the - * indirect symbol table, start at the index stored in the reserved1 field - * of the section structure. Since the indirect symbol table entries - * correspond to the entries in the section the number of indirect symbol table - * entries is inferred from the size of the section divided by the size of the - * entries in the section. For symbol pointers sections the size of the entries - * in the section is 4 bytes and for symbol stubs sections the byte size of the - * stubs is stored in the reserved2 field of the section structure. - */ -#define S_NON_LAZY_SYMBOL_POINTERS 0x6 /* section with only non-lazy - symbol pointers */ -#define S_LAZY_SYMBOL_POINTERS 0x7 /* section with only lazy symbol - pointers */ -#define S_SYMBOL_STUBS 0x8 /* section with only symbol - stubs, byte size of stub in - the reserved2 field */ -#define S_MOD_INIT_FUNC_POINTERS 0x9 /* section with only function - pointers for initialization*/ -#define S_MOD_TERM_FUNC_POINTERS 0xa /* section with only function - pointers for termination */ -#define S_COALESCED 0xb /* section contains symbols that - are to be coalesced */ -#define S_GB_ZEROFILL 0xc /* zero fill on demand section - (that can be larger than 4 - gigabytes) */ -#define S_INTERPOSING 0xd /* section with only pairs of - function pointers for - interposing */ -#define S_16BYTE_LITERALS 0xe /* section with only 16 byte - literals */ -#define S_DTRACE_DOF 0xf /* section contains - DTrace Object Format */ -#define S_LAZY_DYLIB_SYMBOL_POINTERS 0x10 /* section with only lazy - symbol pointers to lazy - loaded dylibs */ -/* - * Section types to support thread local variables - */ -#define S_THREAD_LOCAL_REGULAR 0x11 /* template of initial - values for TLVs */ -#define S_THREAD_LOCAL_ZEROFILL 0x12 /* template of initial - values for TLVs */ -#define S_THREAD_LOCAL_VARIABLES 0x13 /* TLV descriptors */ -#define S_THREAD_LOCAL_VARIABLE_POINTERS 0x14 /* pointers to TLV - descriptors */ -#define S_THREAD_LOCAL_INIT_FUNCTION_POINTERS 0x15 /* functions to call - to initialize TLV - values */ -#define S_INIT_FUNC_OFFSETS 0x16 /* 32-bit offsets to - initializers */ - -/* - * Constants for the section attributes part of the flags field of a section - * structure. - */ -#define SECTION_ATTRIBUTES_USR 0xff000000 /* User setable attributes */ -#define S_ATTR_PURE_INSTRUCTIONS 0x80000000 /* section contains only true - machine instructions */ -#define S_ATTR_NO_TOC 0x40000000 /* section contains coalesced - symbols that are not to be - in a ranlib table of - contents */ -#define S_ATTR_STRIP_STATIC_SYMS 0x20000000 /* ok to strip static symbols - in this section in files - with the MH_DYLDLINK flag */ -#define S_ATTR_NO_DEAD_STRIP 0x10000000 /* no dead stripping */ -#define S_ATTR_LIVE_SUPPORT 0x08000000 /* blocks are live if they - reference live blocks */ -#define S_ATTR_SELF_MODIFYING_CODE 0x04000000 /* Used with i386 code stubs - written on by dyld */ -/* - * If a segment contains any sections marked with S_ATTR_DEBUG then all - * sections in that segment must have this attribute. No section other than - * a section marked with this attribute may reference the contents of this - * section. A section with this attribute may contain no symbols and must have - * a section type S_REGULAR. The static linker will not copy section contents - * from sections with this attribute into its output file. These sections - * generally contain DWARF debugging info. - */ -#define S_ATTR_DEBUG 0x02000000 /* a debug section */ -#define SECTION_ATTRIBUTES_SYS 0x00ffff00 /* system setable attributes */ -#define S_ATTR_SOME_INSTRUCTIONS 0x00000400 /* section contains some - machine instructions */ -#define S_ATTR_EXT_RELOC 0x00000200 /* section has external - relocation entries */ -#define S_ATTR_LOC_RELOC 0x00000100 /* section has local - relocation entries */ - - -/* - * The names of segments and sections in them are mostly meaningless to the - * link-editor. But there are few things to support traditional UNIX - * executables that require the link-editor and assembler to use some names - * agreed upon by convention. - * - * The initial protection of the "__TEXT" segment has write protection turned - * off (not writeable). - * - * The link-editor will allocate common symbols at the end of the "__common" - * section in the "__DATA" segment. It will create the section and segment - * if needed. - */ - -/* The currently known segment names and the section names in those segments */ - -#define SEG_PAGEZERO "__PAGEZERO" /* the pagezero segment which has no */ - /* protections and catches NULL */ - /* references for MH_EXECUTE files */ - - -#define SEG_TEXT "__TEXT" /* the tradition UNIX text segment */ -#define SECT_TEXT "__text" /* the real text part of the text */ - /* section no headers, and no padding */ -#define SECT_FVMLIB_INIT0 "__fvmlib_init0" /* the fvmlib initialization */ - /* section */ -#define SECT_FVMLIB_INIT1 "__fvmlib_init1" /* the section following the */ - /* fvmlib initialization */ - /* section */ - -#define SEG_DATA "__DATA" /* the tradition UNIX data segment */ -#define SECT_DATA "__data" /* the real initialized data section */ - /* no padding, no bss overlap */ -#define SECT_BSS "__bss" /* the real uninitialized data section*/ - /* no padding */ -#define SECT_COMMON "__common" /* the section common symbols are */ - /* allocated in by the link editor */ - -#define SEG_OBJC "__OBJC" /* objective-C runtime segment */ -#define SECT_OBJC_SYMBOLS "__symbol_table" /* symbol table */ -#define SECT_OBJC_MODULES "__module_info" /* module information */ -#define SECT_OBJC_STRINGS "__selector_strs" /* string table */ -#define SECT_OBJC_REFS "__selector_refs" /* string table */ - -#define SEG_ICON "__ICON" /* the icon segment */ -#define SECT_ICON_HEADER "__header" /* the icon headers */ -#define SECT_ICON_TIFF "__tiff" /* the icons in tiff format */ - -#define SEG_LINKEDIT "__LINKEDIT" /* the segment containing all structs */ - /* created and maintained by the link */ - /* editor. Created with -seglinkedit */ - /* option to ld(1) for MH_EXECUTE and */ - /* FVMLIB file types only */ - -#define SEG_UNIXSTACK "__UNIXSTACK" /* the unix stack segment */ - -#define SEG_IMPORT "__IMPORT" /* the segment for the self (dyld) */ - /* modifing code stubs that has read, */ - /* write and execute permissions */ - -/* - * Fixed virtual memory shared libraries are identified by two things. The - * target pathname (the name of the library as found for execution), and the - * minor version number. The address of where the headers are loaded is in - * header_addr. (THIS IS OBSOLETE and no longer supported). - */ -struct fvmlib { - union lc_str name; /* library's target pathname */ - uint32_t minor_version; /* library's minor version number */ - uint32_t header_addr; /* library's header address */ -}; - -/* - * A fixed virtual shared library (filetype == MH_FVMLIB in the mach header) - * contains a fvmlib_command (cmd == LC_IDFVMLIB) to identify the library. - * An object that uses a fixed virtual shared library also contains a - * fvmlib_command (cmd == LC_LOADFVMLIB) for each library it uses. - * (THIS IS OBSOLETE and no longer supported). - */ -struct fvmlib_command { - uint32_t cmd; /* LC_IDFVMLIB or LC_LOADFVMLIB */ - uint32_t cmdsize; /* includes pathname string */ - struct fvmlib fvmlib; /* the library identification */ -}; - -/* - * Dynamicly linked shared libraries are identified by two things. The - * pathname (the name of the library as found for execution), and the - * compatibility version number. The pathname must match and the compatibility - * number in the user of the library must be greater than or equal to the - * library being used. The time stamp is used to record the time a library was - * built and copied into user so it can be use to determined if the library used - * at runtime is exactly the same as used to built the program. - */ -struct dylib { - union lc_str name; /* library's path name */ - uint32_t timestamp; /* library's build time stamp */ - uint32_t current_version; /* library's current version number */ - uint32_t compatibility_version; /* library's compatibility vers number*/ -}; - -/* - * A dynamically linked shared library (filetype == MH_DYLIB in the mach header) - * contains a dylib_command (cmd == LC_ID_DYLIB) to identify the library. - * An object that uses a dynamically linked shared library also contains a - * dylib_command (cmd == LC_LOAD_DYLIB, LC_LOAD_WEAK_DYLIB, or - * LC_REEXPORT_DYLIB) for each library it uses. - */ -struct dylib_command { - uint32_t cmd; /* LC_ID_DYLIB, LC_LOAD_{,WEAK_}DYLIB, - LC_REEXPORT_DYLIB */ - uint32_t cmdsize; /* includes pathname string */ - struct dylib dylib; /* the library identification */ -}; - -/* - * A dynamically linked shared library may be a subframework of an umbrella - * framework. If so it will be linked with "-umbrella umbrella_name" where - * Where "umbrella_name" is the name of the umbrella framework. A subframework - * can only be linked against by its umbrella framework or other subframeworks - * that are part of the same umbrella framework. Otherwise the static link - * editor produces an error and states to link against the umbrella framework. - * The name of the umbrella framework for subframeworks is recorded in the - * following structure. - */ -struct sub_framework_command { - uint32_t cmd; /* LC_SUB_FRAMEWORK */ - uint32_t cmdsize; /* includes umbrella string */ - union lc_str umbrella; /* the umbrella framework name */ -}; - -/* - * For dynamically linked shared libraries that are subframework of an umbrella - * framework they can allow clients other than the umbrella framework or other - * subframeworks in the same umbrella framework. To do this the subframework - * is built with "-allowable_client client_name" and an LC_SUB_CLIENT load - * command is created for each -allowable_client flag. The client_name is - * usually a framework name. It can also be a name used for bundles clients - * where the bundle is built with "-client_name client_name". - */ -struct sub_client_command { - uint32_t cmd; /* LC_SUB_CLIENT */ - uint32_t cmdsize; /* includes client string */ - union lc_str client; /* the client name */ -}; - -/* - * A dynamically linked shared library may be a sub_umbrella of an umbrella - * framework. If so it will be linked with "-sub_umbrella umbrella_name" where - * Where "umbrella_name" is the name of the sub_umbrella framework. When - * staticly linking when -twolevel_namespace is in effect a twolevel namespace - * umbrella framework will only cause its subframeworks and those frameworks - * listed as sub_umbrella frameworks to be implicited linked in. Any other - * dependent dynamic libraries will not be linked it when -twolevel_namespace - * is in effect. The primary library recorded by the static linker when - * resolving a symbol in these libraries will be the umbrella framework. - * Zero or more sub_umbrella frameworks may be use by an umbrella framework. - * The name of a sub_umbrella framework is recorded in the following structure. - */ -struct sub_umbrella_command { - uint32_t cmd; /* LC_SUB_UMBRELLA */ - uint32_t cmdsize; /* includes sub_umbrella string */ - union lc_str sub_umbrella; /* the sub_umbrella framework name */ -}; - -/* - * A dynamically linked shared library may be a sub_library of another shared - * library. If so it will be linked with "-sub_library library_name" where - * Where "library_name" is the name of the sub_library shared library. When - * staticly linking when -twolevel_namespace is in effect a twolevel namespace - * shared library will only cause its subframeworks and those frameworks - * listed as sub_umbrella frameworks and libraries listed as sub_libraries to - * be implicited linked in. Any other dependent dynamic libraries will not be - * linked it when -twolevel_namespace is in effect. The primary library - * recorded by the static linker when resolving a symbol in these libraries - * will be the umbrella framework (or dynamic library). Zero or more sub_library - * shared libraries may be use by an umbrella framework or (or dynamic library). - * The name of a sub_library framework is recorded in the following structure. - * For example /usr/lib/libobjc_profile.A.dylib would be recorded as "libobjc". - */ -struct sub_library_command { - uint32_t cmd; /* LC_SUB_LIBRARY */ - uint32_t cmdsize; /* includes sub_library string */ - union lc_str sub_library; /* the sub_library name */ -}; - -/* - * A program (filetype == MH_EXECUTE) that is - * prebound to its dynamic libraries has one of these for each library that - * the static linker used in prebinding. It contains a bit vector for the - * modules in the library. The bits indicate which modules are bound (1) and - * which are not (0) from the library. The bit for module 0 is the low bit - * of the first byte. So the bit for the Nth module is: - * (linked_modules[N/8] >> N%8) & 1 - */ -struct prebound_dylib_command { - uint32_t cmd; /* LC_PREBOUND_DYLIB */ - uint32_t cmdsize; /* includes strings */ - union lc_str name; /* library's path name */ - uint32_t nmodules; /* number of modules in library */ - union lc_str linked_modules; /* bit vector of linked modules */ -}; - -/* - * A program that uses a dynamic linker contains a dylinker_command to identify - * the name of the dynamic linker (LC_LOAD_DYLINKER). And a dynamic linker - * contains a dylinker_command to identify the dynamic linker (LC_ID_DYLINKER). - * A file can have at most one of these. - * This struct is also used for the LC_DYLD_ENVIRONMENT load command and - * contains string for dyld to treat like environment variable. - */ -struct dylinker_command { - uint32_t cmd; /* LC_ID_DYLINKER, LC_LOAD_DYLINKER or - LC_DYLD_ENVIRONMENT */ - uint32_t cmdsize; /* includes pathname string */ - union lc_str name; /* dynamic linker's path name */ -}; - -/* - * Thread commands contain machine-specific data structures suitable for - * use in the thread state primitives. The machine specific data structures - * follow the struct thread_command as follows. - * Each flavor of machine specific data structure is preceded by an uint32_t - * constant for the flavor of that data structure, an uint32_t that is the - * count of uint32_t's of the size of the state data structure and then - * the state data structure follows. This triple may be repeated for many - * flavors. The constants for the flavors, counts and state data structure - * definitions are expected to be in the header file . - * These machine specific data structures sizes must be multiples of - * 4 bytes. The cmdsize reflects the total size of the thread_command - * and all of the sizes of the constants for the flavors, counts and state - * data structures. - * - * For executable objects that are unix processes there will be one - * thread_command (cmd == LC_UNIXTHREAD) created for it by the link-editor. - * This is the same as a LC_THREAD, except that a stack is automatically - * created (based on the shell's limit for the stack size). Command arguments - * and environment variables are copied onto that stack. - */ -struct thread_command { - uint32_t cmd; /* LC_THREAD or LC_UNIXTHREAD */ - uint32_t cmdsize; /* total size of this command */ - /* uint32_t flavor flavor of thread state */ - /* uint32_t count count of uint32_t's in thread state */ - /* struct XXX_thread_state state thread state for this flavor */ - /* ... */ -}; - -/* - * The routines command contains the address of the dynamic shared library - * initialization routine and an index into the module table for the module - * that defines the routine. Before any modules are used from the library the - * dynamic linker fully binds the module that defines the initialization routine - * and then calls it. This gets called before any module initialization - * routines (used for C++ static constructors) in the library. - */ -struct routines_command { /* for 32-bit architectures */ - uint32_t cmd; /* LC_ROUTINES */ - uint32_t cmdsize; /* total size of this command */ - uint32_t init_address; /* address of initialization routine */ - uint32_t init_module; /* index into the module table that */ - /* the init routine is defined in */ - uint32_t reserved1; - uint32_t reserved2; - uint32_t reserved3; - uint32_t reserved4; - uint32_t reserved5; - uint32_t reserved6; -}; - -/* - * The 64-bit routines command. Same use as above. - */ -struct routines_command_64 { /* for 64-bit architectures */ - uint32_t cmd; /* LC_ROUTINES_64 */ - uint32_t cmdsize; /* total size of this command */ - uint64_t init_address; /* address of initialization routine */ - uint64_t init_module; /* index into the module table that */ - /* the init routine is defined in */ - uint64_t reserved1; - uint64_t reserved2; - uint64_t reserved3; - uint64_t reserved4; - uint64_t reserved5; - uint64_t reserved6; -}; - -/* - * The symtab_command contains the offsets and sizes of the link-edit 4.3BSD - * "stab" style symbol table information as described in the header files - * and . - */ -struct symtab_command { - uint32_t cmd; /* LC_SYMTAB */ - uint32_t cmdsize; /* sizeof(struct symtab_command) */ - uint32_t symoff; /* symbol table offset */ - uint32_t nsyms; /* number of symbol table entries */ - uint32_t stroff; /* string table offset */ - uint32_t strsize; /* string table size in bytes */ -}; - -/* - * This is the second set of the symbolic information which is used to support - * the data structures for the dynamically link editor. - * - * The original set of symbolic information in the symtab_command which contains - * the symbol and string tables must also be present when this load command is - * present. When this load command is present the symbol table is organized - * into three groups of symbols: - * local symbols (static and debugging symbols) - grouped by module - * defined external symbols - grouped by module (sorted by name if not lib) - * undefined external symbols (sorted by name if MH_BINDATLOAD is not set, - * and in order the were seen by the static - * linker if MH_BINDATLOAD is set) - * In this load command there are offsets and counts to each of the three groups - * of symbols. - * - * This load command contains a the offsets and sizes of the following new - * symbolic information tables: - * table of contents - * module table - * reference symbol table - * indirect symbol table - * The first three tables above (the table of contents, module table and - * reference symbol table) are only present if the file is a dynamically linked - * shared library. For executable and object modules, which are files - * containing only one module, the information that would be in these three - * tables is determined as follows: - * table of contents - the defined external symbols are sorted by name - * module table - the file contains only one module so everything in the - * file is part of the module. - * reference symbol table - is the defined and undefined external symbols - * - * For dynamically linked shared library files this load command also contains - * offsets and sizes to the pool of relocation entries for all sections - * separated into two groups: - * external relocation entries - * local relocation entries - * For executable and object modules the relocation entries continue to hang - * off the section structures. - */ -struct dysymtab_command { - uint32_t cmd; /* LC_DYSYMTAB */ - uint32_t cmdsize; /* sizeof(struct dysymtab_command) */ - - /* - * The symbols indicated by symoff and nsyms of the LC_SYMTAB load command - * are grouped into the following three groups: - * local symbols (further grouped by the module they are from) - * defined external symbols (further grouped by the module they are from) - * undefined symbols - * - * The local symbols are used only for debugging. The dynamic binding - * process may have to use them to indicate to the debugger the local - * symbols for a module that is being bound. - * - * The last two groups are used by the dynamic binding process to do the - * binding (indirectly through the module table and the reference symbol - * table when this is a dynamically linked shared library file). - */ - uint32_t ilocalsym; /* index to local symbols */ - uint32_t nlocalsym; /* number of local symbols */ - - uint32_t iextdefsym;/* index to externally defined symbols */ - uint32_t nextdefsym;/* number of externally defined symbols */ - - uint32_t iundefsym; /* index to undefined symbols */ - uint32_t nundefsym; /* number of undefined symbols */ - - /* - * For the for the dynamic binding process to find which module a symbol - * is defined in the table of contents is used (analogous to the ranlib - * structure in an archive) which maps defined external symbols to modules - * they are defined in. This exists only in a dynamically linked shared - * library file. For executable and object modules the defined external - * symbols are sorted by name and is use as the table of contents. - */ - uint32_t tocoff; /* file offset to table of contents */ - uint32_t ntoc; /* number of entries in table of contents */ - - /* - * To support dynamic binding of "modules" (whole object files) the symbol - * table must reflect the modules that the file was created from. This is - * done by having a module table that has indexes and counts into the merged - * tables for each module. The module structure that these two entries - * refer to is described below. This exists only in a dynamically linked - * shared library file. For executable and object modules the file only - * contains one module so everything in the file belongs to the module. - */ - uint32_t modtaboff; /* file offset to module table */ - uint32_t nmodtab; /* number of module table entries */ - - /* - * To support dynamic module binding the module structure for each module - * indicates the external references (defined and undefined) each module - * makes. For each module there is an offset and a count into the - * reference symbol table for the symbols that the module references. - * This exists only in a dynamically linked shared library file. For - * executable and object modules the defined external symbols and the - * undefined external symbols indicates the external references. - */ - uint32_t extrefsymoff; /* offset to referenced symbol table */ - uint32_t nextrefsyms; /* number of referenced symbol table entries */ - - /* - * The sections that contain "symbol pointers" and "routine stubs" have - * indexes and (implied counts based on the size of the section and fixed - * size of the entry) into the "indirect symbol" table for each pointer - * and stub. For every section of these two types the index into the - * indirect symbol table is stored in the section header in the field - * reserved1. An indirect symbol table entry is simply a 32bit index into - * the symbol table to the symbol that the pointer or stub is referring to. - * The indirect symbol table is ordered to match the entries in the section. - */ - uint32_t indirectsymoff; /* file offset to the indirect symbol table */ - uint32_t nindirectsyms; /* number of indirect symbol table entries */ - - /* - * To support relocating an individual module in a library file quickly the - * external relocation entries for each module in the library need to be - * accessed efficiently. Since the relocation entries can't be accessed - * through the section headers for a library file they are separated into - * groups of local and external entries further grouped by module. In this - * case the presents of this load command who's extreloff, nextrel, - * locreloff and nlocrel fields are non-zero indicates that the relocation - * entries of non-merged sections are not referenced through the section - * structures (and the reloff and nreloc fields in the section headers are - * set to zero). - * - * Since the relocation entries are not accessed through the section headers - * this requires the r_address field to be something other than a section - * offset to identify the item to be relocated. In this case r_address is - * set to the offset from the vmaddr of the first LC_SEGMENT command. - * For MH_SPLIT_SEGS images r_address is set to the the offset from the - * vmaddr of the first read-write LC_SEGMENT command. - * - * The relocation entries are grouped by module and the module table - * entries have indexes and counts into them for the group of external - * relocation entries for that the module. - * - * For sections that are merged across modules there must not be any - * remaining external relocation entries for them (for merged sections - * remaining relocation entries must be local). - */ - uint32_t extreloff; /* offset to external relocation entries */ - uint32_t nextrel; /* number of external relocation entries */ - - /* - * All the local relocation entries are grouped together (they are not - * grouped by their module since they are only used if the object is moved - * from it staticly link edited address). - */ - uint32_t locreloff; /* offset to local relocation entries */ - uint32_t nlocrel; /* number of local relocation entries */ - -}; - -/* - * An indirect symbol table entry is simply a 32bit index into the symbol table - * to the symbol that the pointer or stub is refering to. Unless it is for a - * non-lazy symbol pointer section for a defined symbol which strip(1) as - * removed. In which case it has the value INDIRECT_SYMBOL_LOCAL. If the - * symbol was also absolute INDIRECT_SYMBOL_ABS is or'ed with that. - */ -#define INDIRECT_SYMBOL_LOCAL 0x80000000 -#define INDIRECT_SYMBOL_ABS 0x40000000 - - -/* a table of contents entry */ -struct dylib_table_of_contents { - uint32_t symbol_index; /* the defined external symbol - (index into the symbol table) */ - uint32_t module_index; /* index into the module table this symbol - is defined in */ -}; - -/* a module table entry */ -struct dylib_module { - uint32_t module_name; /* the module name (index into string table) */ - - uint32_t iextdefsym; /* index into externally defined symbols */ - uint32_t nextdefsym; /* number of externally defined symbols */ - uint32_t irefsym; /* index into reference symbol table */ - uint32_t nrefsym; /* number of reference symbol table entries */ - uint32_t ilocalsym; /* index into symbols for local symbols */ - uint32_t nlocalsym; /* number of local symbols */ - - uint32_t iextrel; /* index into external relocation entries */ - uint32_t nextrel; /* number of external relocation entries */ - - uint32_t iinit_iterm; /* low 16 bits are the index into the init - section, high 16 bits are the index into - the term section */ - uint32_t ninit_nterm; /* low 16 bits are the number of init section - entries, high 16 bits are the number of - term section entries */ - - uint32_t /* for this module address of the start of */ - objc_module_info_addr; /* the (__OBJC,__module_info) section */ - uint32_t /* for this module size of */ - objc_module_info_size; /* the (__OBJC,__module_info) section */ -}; - -/* a 64-bit module table entry */ -struct dylib_module_64 { - uint32_t module_name; /* the module name (index into string table) */ - - uint32_t iextdefsym; /* index into externally defined symbols */ - uint32_t nextdefsym; /* number of externally defined symbols */ - uint32_t irefsym; /* index into reference symbol table */ - uint32_t nrefsym; /* number of reference symbol table entries */ - uint32_t ilocalsym; /* index into symbols for local symbols */ - uint32_t nlocalsym; /* number of local symbols */ - - uint32_t iextrel; /* index into external relocation entries */ - uint32_t nextrel; /* number of external relocation entries */ - - uint32_t iinit_iterm; /* low 16 bits are the index into the init - section, high 16 bits are the index into - the term section */ - uint32_t ninit_nterm; /* low 16 bits are the number of init section - entries, high 16 bits are the number of - term section entries */ - - uint32_t /* for this module size of */ - objc_module_info_size; /* the (__OBJC,__module_info) section */ - uint64_t /* for this module address of the start of */ - objc_module_info_addr; /* the (__OBJC,__module_info) section */ -}; - -/* - * The entries in the reference symbol table are used when loading the module - * (both by the static and dynamic link editors) and if the module is unloaded - * or replaced. Therefore all external symbols (defined and undefined) are - * listed in the module's reference table. The flags describe the type of - * reference that is being made. The constants for the flags are defined in - * as they are also used for symbol table entries. - */ -struct dylib_reference { - uint32_t isym:24, /* index into the symbol table */ - flags:8; /* flags to indicate the type of reference */ -}; - -/* - * The twolevel_hints_command contains the offset and number of hints in the - * two-level namespace lookup hints table. - */ -struct twolevel_hints_command { - uint32_t cmd; /* LC_TWOLEVEL_HINTS */ - uint32_t cmdsize; /* sizeof(struct twolevel_hints_command) */ - uint32_t offset; /* offset to the hint table */ - uint32_t nhints; /* number of hints in the hint table */ -}; - -/* - * The entries in the two-level namespace lookup hints table are twolevel_hint - * structs. These provide hints to the dynamic link editor where to start - * looking for an undefined symbol in a two-level namespace image. The - * isub_image field is an index into the sub-images (sub-frameworks and - * sub-umbrellas list) that made up the two-level image that the undefined - * symbol was found in when it was built by the static link editor. If - * isub-image is 0 the the symbol is expected to be defined in library and not - * in the sub-images. If isub-image is non-zero it is an index into the array - * of sub-images for the umbrella with the first index in the sub-images being - * 1. The array of sub-images is the ordered list of sub-images of the umbrella - * that would be searched for a symbol that has the umbrella recorded as its - * primary library. The table of contents index is an index into the - * library's table of contents. This is used as the starting point of the - * binary search or a directed linear search. - */ -struct twolevel_hint { - uint32_t - isub_image:8, /* index into the sub images */ - itoc:24; /* index into the table of contents */ -}; - -/* - * The prebind_cksum_command contains the value of the original check sum for - * prebound files or zero. When a prebound file is first created or modified - * for other than updating its prebinding information the value of the check sum - * is set to zero. When the file has it prebinding re-done and if the value of - * the check sum is zero the original check sum is calculated and stored in - * cksum field of this load command in the output file. If when the prebinding - * is re-done and the cksum field is non-zero it is left unchanged from the - * input file. - */ -struct prebind_cksum_command { - uint32_t cmd; /* LC_PREBIND_CKSUM */ - uint32_t cmdsize; /* sizeof(struct prebind_cksum_command) */ - uint32_t cksum; /* the check sum or zero */ -}; - -/* - * The uuid load command contains a single 128-bit unique random number that - * identifies an object produced by the static link editor. - */ -struct uuid_command { - uint32_t cmd; /* LC_UUID */ - uint32_t cmdsize; /* sizeof(struct uuid_command) */ - uint8_t uuid[16]; /* the 128-bit uuid */ -}; - -/* - * The rpath_command contains a path which at runtime should be added to - * the current run path used to find @rpath prefixed dylibs. - */ -struct rpath_command { - uint32_t cmd; /* LC_RPATH */ - uint32_t cmdsize; /* includes string */ - union lc_str path; /* path to add to run path */ -}; - -/* - * The linkedit_data_command contains the offsets and sizes of a blob - * of data in the __LINKEDIT segment. - */ -struct linkedit_data_command { - uint32_t cmd; /* LC_CODE_SIGNATURE, LC_SEGMENT_SPLIT_INFO, - LC_FUNCTION_STARTS, LC_DATA_IN_CODE, - LC_DYLIB_CODE_SIGN_DRS, - LC_LINKER_OPTIMIZATION_HINT, - LC_DYLD_EXPORTS_TRIE, or - LC_DYLD_CHAINED_FIXUPS. */ - uint32_t cmdsize; /* sizeof(struct linkedit_data_command) */ - uint32_t dataoff; /* file offset of data in __LINKEDIT segment */ - uint32_t datasize; /* file size of data in __LINKEDIT segment */ -}; - -/* - * The encryption_info_command contains the file offset and size of an - * of an encrypted segment. - */ -struct encryption_info_command { - uint32_t cmd; /* LC_ENCRYPTION_INFO */ - uint32_t cmdsize; /* sizeof(struct encryption_info_command) */ - uint32_t cryptoff; /* file offset of encrypted range */ - uint32_t cryptsize; /* file size of encrypted range */ - uint32_t cryptid; /* which enryption system, - 0 means not-encrypted yet */ -}; - -/* - * The encryption_info_command_64 contains the file offset and size of an - * of an encrypted segment (for use in x86_64 targets). - */ -struct encryption_info_command_64 { - uint32_t cmd; /* LC_ENCRYPTION_INFO_64 */ - uint32_t cmdsize; /* sizeof(struct encryption_info_command_64) */ - uint32_t cryptoff; /* file offset of encrypted range */ - uint32_t cryptsize; /* file size of encrypted range */ - uint32_t cryptid; /* which enryption system, - 0 means not-encrypted yet */ - uint32_t pad; /* padding to make this struct's size a multiple - of 8 bytes */ -}; - -/* - * The version_min_command contains the min OS version on which this - * binary was built to run. - */ -struct version_min_command { - uint32_t cmd; /* LC_VERSION_MIN_MACOSX or - LC_VERSION_MIN_IPHONEOS or - LC_VERSION_MIN_WATCHOS or - LC_VERSION_MIN_TVOS */ - uint32_t cmdsize; /* sizeof(struct min_version_command) */ - uint32_t version; /* X.Y.Z is encoded in nibbles xxxx.yy.zz */ - uint32_t sdk; /* X.Y.Z is encoded in nibbles xxxx.yy.zz */ -}; - -/* - * The build_version_command contains the min OS version on which this - * binary was built to run for its platform. The list of known platforms and - * tool values following it. - */ -struct build_version_command { - uint32_t cmd; /* LC_BUILD_VERSION */ - uint32_t cmdsize; /* sizeof(struct build_version_command) plus */ - /* ntools * sizeof(struct build_tool_version) */ - uint32_t platform; /* platform */ - uint32_t minos; /* X.Y.Z is encoded in nibbles xxxx.yy.zz */ - uint32_t sdk; /* X.Y.Z is encoded in nibbles xxxx.yy.zz */ - uint32_t ntools; /* number of tool entries following this */ -}; - -struct build_tool_version { - uint32_t tool; /* enum for the tool */ - uint32_t version; /* version number of the tool */ -}; - -/* Known values for the platform field above. */ -#define PLATFORM_MACOS 1 -#define PLATFORM_IOS 2 -#define PLATFORM_TVOS 3 -#define PLATFORM_WATCHOS 4 -#define PLATFORM_BRIDGEOS 5 -#define PLATFORM_MACCATALYST 6 -#if (!defined(PLATFORM_MACCATALYST)) -#define PLATFORM_MACCATALYST 6 -#endif -#define PLATFORM_IOSSIMULATOR 7 -#define PLATFORM_TVOSSIMULATOR 8 -#define PLATFORM_WATCHOSSIMULATOR 9 -#define PLATFORM_DRIVERKIT 10 - -/* Known values for the tool field above. */ -#define TOOL_CLANG 1 -#define TOOL_SWIFT 2 -#define TOOL_LD 3 - -/* - * The dyld_info_command contains the file offsets and sizes of - * the new compressed form of the information dyld needs to - * load the image. This information is used by dyld on Mac OS X - * 10.6 and later. All information pointed to by this command - * is encoded using byte streams, so no endian swapping is needed - * to interpret it. - */ -struct dyld_info_command { - uint32_t cmd; /* LC_DYLD_INFO or LC_DYLD_INFO_ONLY */ - uint32_t cmdsize; /* sizeof(struct dyld_info_command) */ - - /* - * Dyld rebases an image whenever dyld loads it at an address different - * from its preferred address. The rebase information is a stream - * of byte sized opcodes whose symbolic names start with REBASE_OPCODE_. - * Conceptually the rebase information is a table of tuples: - * - * The opcodes are a compressed way to encode the table by only - * encoding when a column changes. In addition simple patterns - * like "every n'th offset for m times" can be encoded in a few - * bytes. - */ - uint32_t rebase_off; /* file offset to rebase info */ - uint32_t rebase_size; /* size of rebase info */ - - /* - * Dyld binds an image during the loading process, if the image - * requires any pointers to be initialized to symbols in other images. - * The bind information is a stream of byte sized - * opcodes whose symbolic names start with BIND_OPCODE_. - * Conceptually the bind information is a table of tuples: - * - * The opcodes are a compressed way to encode the table by only - * encoding when a column changes. In addition simple patterns - * like for runs of pointers initialzed to the same value can be - * encoded in a few bytes. - */ - uint32_t bind_off; /* file offset to binding info */ - uint32_t bind_size; /* size of binding info */ - - /* - * Some C++ programs require dyld to unique symbols so that all - * images in the process use the same copy of some code/data. - * This step is done after binding. The content of the weak_bind - * info is an opcode stream like the bind_info. But it is sorted - * alphabetically by symbol name. This enable dyld to walk - * all images with weak binding information in order and look - * for collisions. If there are no collisions, dyld does - * no updating. That means that some fixups are also encoded - * in the bind_info. For instance, all calls to "operator new" - * are first bound to libstdc++.dylib using the information - * in bind_info. Then if some image overrides operator new - * that is detected when the weak_bind information is processed - * and the call to operator new is then rebound. - */ - uint32_t weak_bind_off; /* file offset to weak binding info */ - uint32_t weak_bind_size; /* size of weak binding info */ - - /* - * Some uses of external symbols do not need to be bound immediately. - * Instead they can be lazily bound on first use. The lazy_bind - * are contains a stream of BIND opcodes to bind all lazy symbols. - * Normal use is that dyld ignores the lazy_bind section when - * loading an image. Instead the static linker arranged for the - * lazy pointer to initially point to a helper function which - * pushes the offset into the lazy_bind area for the symbol - * needing to be bound, then jumps to dyld which simply adds - * the offset to lazy_bind_off to get the information on what - * to bind. - */ - uint32_t lazy_bind_off; /* file offset to lazy binding info */ - uint32_t lazy_bind_size; /* size of lazy binding infs */ - - /* - * The symbols exported by a dylib are encoded in a trie. This - * is a compact representation that factors out common prefixes. - * It also reduces LINKEDIT pages in RAM because it encodes all - * information (name, address, flags) in one small, contiguous range. - * The export area is a stream of nodes. The first node sequentially - * is the start node for the trie. - * - * Nodes for a symbol start with a uleb128 that is the length of - * the exported symbol information for the string so far. - * If there is no exported symbol, the node starts with a zero byte. - * If there is exported info, it follows the length. - * - * First is a uleb128 containing flags. Normally, it is followed by - * a uleb128 encoded offset which is location of the content named - * by the symbol from the mach_header for the image. If the flags - * is EXPORT_SYMBOL_FLAGS_REEXPORT, then following the flags is - * a uleb128 encoded library ordinal, then a zero terminated - * UTF8 string. If the string is zero length, then the symbol - * is re-export from the specified dylib with the same name. - * If the flags is EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER, then following - * the flags is two uleb128s: the stub offset and the resolver offset. - * The stub is used by non-lazy pointers. The resolver is used - * by lazy pointers and must be called to get the actual address to use. - * - * After the optional exported symbol information is a byte of - * how many edges (0-255) that this node has leaving it, - * followed by each edge. - * Each edge is a zero terminated UTF8 of the addition chars - * in the symbol, followed by a uleb128 offset for the node that - * edge points to. - * - */ - uint32_t export_off; /* file offset to lazy binding info */ - uint32_t export_size; /* size of lazy binding infs */ -}; - -/* - * The following are used to encode rebasing information - */ -#define REBASE_TYPE_POINTER 1 -#define REBASE_TYPE_TEXT_ABSOLUTE32 2 -#define REBASE_TYPE_TEXT_PCREL32 3 - -#define REBASE_OPCODE_MASK 0xF0 -#define REBASE_IMMEDIATE_MASK 0x0F -#define REBASE_OPCODE_DONE 0x00 -#define REBASE_OPCODE_SET_TYPE_IMM 0x10 -#define REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB 0x20 -#define REBASE_OPCODE_ADD_ADDR_ULEB 0x30 -#define REBASE_OPCODE_ADD_ADDR_IMM_SCALED 0x40 -#define REBASE_OPCODE_DO_REBASE_IMM_TIMES 0x50 -#define REBASE_OPCODE_DO_REBASE_ULEB_TIMES 0x60 -#define REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB 0x70 -#define REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB 0x80 - - -/* - * The following are used to encode binding information - */ -#define BIND_TYPE_POINTER 1 -#define BIND_TYPE_TEXT_ABSOLUTE32 2 -#define BIND_TYPE_TEXT_PCREL32 3 - -#define BIND_SPECIAL_DYLIB_SELF 0 -#define BIND_SPECIAL_DYLIB_MAIN_EXECUTABLE -1 -#define BIND_SPECIAL_DYLIB_FLAT_LOOKUP -2 -#define BIND_SPECIAL_DYLIB_WEAK_LOOKUP -3 - -#define BIND_SYMBOL_FLAGS_WEAK_IMPORT 0x1 -#define BIND_SYMBOL_FLAGS_NON_WEAK_DEFINITION 0x8 - -#define BIND_OPCODE_MASK 0xF0 -#define BIND_IMMEDIATE_MASK 0x0F -#define BIND_OPCODE_DONE 0x00 -#define BIND_OPCODE_SET_DYLIB_ORDINAL_IMM 0x10 -#define BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB 0x20 -#define BIND_OPCODE_SET_DYLIB_SPECIAL_IMM 0x30 -#define BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM 0x40 -#define BIND_OPCODE_SET_TYPE_IMM 0x50 -#define BIND_OPCODE_SET_ADDEND_SLEB 0x60 -#define BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB 0x70 -#define BIND_OPCODE_ADD_ADDR_ULEB 0x80 -#define BIND_OPCODE_DO_BIND 0x90 -#define BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB 0xA0 -#define BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED 0xB0 -#define BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB 0xC0 -#define BIND_OPCODE_THREADED 0xD0 -#define BIND_SUBOPCODE_THREADED_SET_BIND_ORDINAL_TABLE_SIZE_ULEB 0x00 -#define BIND_SUBOPCODE_THREADED_APPLY 0x01 - - -/* - * The following are used on the flags byte of a terminal node - * in the export information. - */ -#define EXPORT_SYMBOL_FLAGS_KIND_MASK 0x03 -#define EXPORT_SYMBOL_FLAGS_KIND_REGULAR 0x00 -#define EXPORT_SYMBOL_FLAGS_KIND_THREAD_LOCAL 0x01 -#define EXPORT_SYMBOL_FLAGS_KIND_ABSOLUTE 0x02 -#define EXPORT_SYMBOL_FLAGS_WEAK_DEFINITION 0x04 -#define EXPORT_SYMBOL_FLAGS_REEXPORT 0x08 -#define EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER 0x10 - -/* - * The linker_option_command contains linker options embedded in object files. - */ -struct linker_option_command { - uint32_t cmd; /* LC_LINKER_OPTION only used in MH_OBJECT filetypes */ - uint32_t cmdsize; - uint32_t count; /* number of strings */ - /* concatenation of zero terminated UTF8 strings. - Zero filled at end to align */ -}; - -/* - * The symseg_command contains the offset and size of the GNU style - * symbol table information as described in the header file . - * The symbol roots of the symbol segments must also be aligned properly - * in the file. So the requirement of keeping the offsets aligned to a - * multiple of a 4 bytes translates to the length field of the symbol - * roots also being a multiple of a long. Also the padding must again be - * zeroed. (THIS IS OBSOLETE and no longer supported). - */ -struct symseg_command { - uint32_t cmd; /* LC_SYMSEG */ - uint32_t cmdsize; /* sizeof(struct symseg_command) */ - uint32_t offset; /* symbol segment offset */ - uint32_t size; /* symbol segment size in bytes */ -}; - -/* - * The ident_command contains a free format string table following the - * ident_command structure. The strings are null terminated and the size of - * the command is padded out with zero bytes to a multiple of 4 bytes/ - * (THIS IS OBSOLETE and no longer supported). - */ -struct ident_command { - uint32_t cmd; /* LC_IDENT */ - uint32_t cmdsize; /* strings that follow this command */ -}; - -/* - * The fvmfile_command contains a reference to a file to be loaded at the - * specified virtual address. (Presently, this command is reserved for - * internal use. The kernel ignores this command when loading a program into - * memory). - */ -struct fvmfile_command { - uint32_t cmd; /* LC_FVMFILE */ - uint32_t cmdsize; /* includes pathname string */ - union lc_str name; /* files pathname */ - uint32_t header_addr; /* files virtual address */ -}; - - -/* - * The entry_point_command is a replacement for thread_command. - * It is used for main executables to specify the location (file offset) - * of main(). If -stack_size was used at link time, the stacksize - * field will contain the stack size need for the main thread. - */ -struct entry_point_command { - uint32_t cmd; /* LC_MAIN only used in MH_EXECUTE filetypes */ - uint32_t cmdsize; /* 24 */ - uint64_t entryoff; /* file (__TEXT) offset of main() */ - uint64_t stacksize;/* if not zero, initial stack size */ -}; - - -/* - * The source_version_command is an optional load command containing - * the version of the sources used to build the binary. - */ -struct source_version_command { - uint32_t cmd; /* LC_SOURCE_VERSION */ - uint32_t cmdsize; /* 16 */ - uint64_t version; /* A.B.C.D.E packed as a24.b10.c10.d10.e10 */ -}; - - -/* - * The LC_DATA_IN_CODE load commands uses a linkedit_data_command - * to point to an array of data_in_code_entry entries. Each entry - * describes a range of data in a code section. - */ -struct data_in_code_entry { - uint32_t offset; /* from mach_header to start of data range*/ - uint16_t length; /* number of bytes in data range */ - uint16_t kind; /* a DICE_KIND_* value */ -}; -#define DICE_KIND_DATA 0x0001 -#define DICE_KIND_JUMP_TABLE8 0x0002 -#define DICE_KIND_JUMP_TABLE16 0x0003 -#define DICE_KIND_JUMP_TABLE32 0x0004 -#define DICE_KIND_ABS_JUMP_TABLE32 0x0005 - - - -/* - * Sections of type S_THREAD_LOCAL_VARIABLES contain an array - * of tlv_descriptor structures. - */ -struct tlv_descriptor -{ - void* (*thunk)(struct tlv_descriptor*); - unsigned long key; - unsigned long offset; -}; - -/* - * LC_NOTE commands describe a region of arbitrary data included in a Mach-O - * file. Its initial use is to record extra data in MH_CORE files. - */ -struct note_command { - uint32_t cmd; /* LC_NOTE */ - uint32_t cmdsize; /* sizeof(struct note_command) */ - char data_owner[16]; /* owner name for this LC_NOTE */ - uint64_t offset; /* file offset of this data */ - uint64_t size; /* length of data region */ -}; - -#endif /* _MACHO_LOADER_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/exception_types.h b/lib/libc/include/x86_64-macos-gnu/mach/exception_types.h deleted file mode 100644 index a0026b9ce2..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/exception_types.h +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * @OSF_COPYRIGHT@ - */ -/* - * Mach Operating System - * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ -/* - */ - -#ifndef _MACH_EXCEPTION_TYPES_H_ -#define _MACH_EXCEPTION_TYPES_H_ - -#include - -/* - * Machine-independent exception definitions. - */ - -#define EXC_BAD_ACCESS 1 /* Could not access memory */ -/* Code contains kern_return_t describing error. */ -/* Subcode contains bad memory address. */ - -#define EXC_BAD_INSTRUCTION 2 /* Instruction failed */ -/* Illegal or undefined instruction or operand */ - -#define EXC_ARITHMETIC 3 /* Arithmetic exception */ -/* Exact nature of exception is in code field */ - -#define EXC_EMULATION 4 /* Emulation instruction */ -/* Emulation support instruction encountered */ -/* Details in code and subcode fields */ - -#define EXC_SOFTWARE 5 /* Software generated exception */ -/* Exact exception is in code field. */ -/* Codes 0 - 0xFFFF reserved to hardware */ -/* Codes 0x10000 - 0x1FFFF reserved for OS emulation (Unix) */ - -#define EXC_BREAKPOINT 6 /* Trace, breakpoint, etc. */ -/* Details in code field. */ - -#define EXC_SYSCALL 7 /* System calls. */ - -#define EXC_MACH_SYSCALL 8 /* Mach system calls. */ - -#define EXC_RPC_ALERT 9 /* RPC alert */ - -#define EXC_CRASH 10 /* Abnormal process exit */ - -#define EXC_RESOURCE 11 /* Hit resource consumption limit */ -/* Exact resource is in code field. */ - -#define EXC_GUARD 12 /* Violated guarded resource protections */ - -#define EXC_CORPSE_NOTIFY 13 /* Abnormal process exited to corpse state */ - -#define EXC_CORPSE_VARIANT_BIT 0x100 /* bit set for EXC_*_CORPSE variants of EXC_* */ - - -/* - * Machine-independent exception behaviors - */ - -# define EXCEPTION_DEFAULT 1 -/* Send a catch_exception_raise message including the identity. - */ - -# define EXCEPTION_STATE 2 -/* Send a catch_exception_raise_state message including the - * thread state. - */ - -# define EXCEPTION_STATE_IDENTITY 3 -/* Send a catch_exception_raise_state_identity message including - * the thread identity and state. - */ - -#define MACH_EXCEPTION_ERRORS 0x40000000 -/* include additional exception specific errors, not used yet. */ - -#define MACH_EXCEPTION_CODES 0x80000000 -/* Send 64-bit code and subcode in the exception header */ - -#define MACH_EXCEPTION_MASK (MACH_EXCEPTION_CODES | MACH_EXCEPTION_ERRORS) -/* - * Masks for exception definitions, above - * bit zero is unused, therefore 1 word = 31 exception types - */ - -#define EXC_MASK_BAD_ACCESS (1 << EXC_BAD_ACCESS) -#define EXC_MASK_BAD_INSTRUCTION (1 << EXC_BAD_INSTRUCTION) -#define EXC_MASK_ARITHMETIC (1 << EXC_ARITHMETIC) -#define EXC_MASK_EMULATION (1 << EXC_EMULATION) -#define EXC_MASK_SOFTWARE (1 << EXC_SOFTWARE) -#define EXC_MASK_BREAKPOINT (1 << EXC_BREAKPOINT) -#define EXC_MASK_SYSCALL (1 << EXC_SYSCALL) -#define EXC_MASK_MACH_SYSCALL (1 << EXC_MACH_SYSCALL) -#define EXC_MASK_RPC_ALERT (1 << EXC_RPC_ALERT) -#define EXC_MASK_CRASH (1 << EXC_CRASH) -#define EXC_MASK_RESOURCE (1 << EXC_RESOURCE) -#define EXC_MASK_GUARD (1 << EXC_GUARD) -#define EXC_MASK_CORPSE_NOTIFY (1 << EXC_CORPSE_NOTIFY) - -#define EXC_MASK_ALL (EXC_MASK_BAD_ACCESS | \ - EXC_MASK_BAD_INSTRUCTION | \ - EXC_MASK_ARITHMETIC | \ - EXC_MASK_EMULATION | \ - EXC_MASK_SOFTWARE | \ - EXC_MASK_BREAKPOINT | \ - EXC_MASK_SYSCALL | \ - EXC_MASK_MACH_SYSCALL | \ - EXC_MASK_RPC_ALERT | \ - EXC_MASK_RESOURCE | \ - EXC_MASK_GUARD | \ - EXC_MASK_MACHINE) - - -#define FIRST_EXCEPTION 1 /* ZERO is illegal */ - -/* - * Machine independent codes for EXC_SOFTWARE - * Codes 0x10000 - 0x1FFFF reserved for OS emulation (Unix) - * 0x10000 - 0x10002 in use for unix signals - * 0x20000 - 0x2FFFF reserved for MACF - */ -#define EXC_SOFT_SIGNAL 0x10003 /* Unix signal exceptions */ - -#define EXC_MACF_MIN 0x20000 /* MACF exceptions */ -#define EXC_MACF_MAX 0x2FFFF - -#ifndef ASSEMBLER - -#include -#include -#include -/* - * Exported types - */ - -typedef int exception_type_t; -typedef integer_t exception_data_type_t; -typedef int64_t mach_exception_data_type_t; -typedef int exception_behavior_t; -typedef exception_data_type_t *exception_data_t; -typedef mach_exception_data_type_t *mach_exception_data_t; -typedef unsigned int exception_mask_t; -typedef exception_mask_t *exception_mask_array_t; -typedef exception_behavior_t *exception_behavior_array_t; -typedef thread_state_flavor_t *exception_flavor_array_t; -typedef mach_port_t *exception_port_array_t; -typedef mach_exception_data_type_t mach_exception_code_t; -typedef mach_exception_data_type_t mach_exception_subcode_t; - -#endif /* ASSEMBLER */ - -#endif /* _MACH_EXCEPTION_TYPES_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/host_special_ports.h b/lib/libc/include/x86_64-macos-gnu/mach/host_special_ports.h deleted file mode 100644 index 8d4cdbefce..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/host_special_ports.h +++ /dev/null @@ -1,281 +0,0 @@ -/* - * Copyright (c) 2003 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * @OSF_COPYRIGHT@ - */ -/* - * Mach Operating System - * Copyright (c) 1991 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ -/* - */ -/* - * File: mach/host_special_ports.h - * - * Defines codes for access to host-wide special ports. - */ - -#ifndef _MACH_HOST_SPECIAL_PORTS_H_ -#define _MACH_HOST_SPECIAL_PORTS_H_ - -/* - * Cannot be set or gotten from user space - */ -#define HOST_SECURITY_PORT 0 - -#define HOST_MIN_SPECIAL_PORT HOST_SECURITY_PORT - -/* - * Always provided by kernel (cannot be set from user-space). - */ -#define HOST_PORT 1 -#define HOST_PRIV_PORT 2 -#define HOST_IO_MASTER_PORT 3 -#define HOST_MAX_SPECIAL_KERNEL_PORT 7 /* room to grow */ - -#define HOST_LAST_SPECIAL_KERNEL_PORT HOST_IO_MASTER_PORT - -/* - * Not provided by kernel - */ -#define HOST_DYNAMIC_PAGER_PORT (1 + HOST_MAX_SPECIAL_KERNEL_PORT) -#define HOST_AUDIT_CONTROL_PORT (2 + HOST_MAX_SPECIAL_KERNEL_PORT) -#define HOST_USER_NOTIFICATION_PORT (3 + HOST_MAX_SPECIAL_KERNEL_PORT) -#define HOST_AUTOMOUNTD_PORT (4 + HOST_MAX_SPECIAL_KERNEL_PORT) -#define HOST_LOCKD_PORT (5 + HOST_MAX_SPECIAL_KERNEL_PORT) -#define HOST_KTRACE_BACKGROUND_PORT (6 + HOST_MAX_SPECIAL_KERNEL_PORT) -#define HOST_SEATBELT_PORT (7 + HOST_MAX_SPECIAL_KERNEL_PORT) -#define HOST_KEXTD_PORT (8 + HOST_MAX_SPECIAL_KERNEL_PORT) -#define HOST_LAUNCHCTL_PORT (9 + HOST_MAX_SPECIAL_KERNEL_PORT) -#define HOST_UNFREED_PORT (10 + HOST_MAX_SPECIAL_KERNEL_PORT) -#define HOST_AMFID_PORT (11 + HOST_MAX_SPECIAL_KERNEL_PORT) -#define HOST_GSSD_PORT (12 + HOST_MAX_SPECIAL_KERNEL_PORT) -#define HOST_TELEMETRY_PORT (13 + HOST_MAX_SPECIAL_KERNEL_PORT) -#define HOST_ATM_NOTIFICATION_PORT (14 + HOST_MAX_SPECIAL_KERNEL_PORT) -#define HOST_COALITION_PORT (15 + HOST_MAX_SPECIAL_KERNEL_PORT) -#define HOST_SYSDIAGNOSE_PORT (16 + HOST_MAX_SPECIAL_KERNEL_PORT) -#define HOST_XPC_EXCEPTION_PORT (17 + HOST_MAX_SPECIAL_KERNEL_PORT) -#define HOST_CONTAINERD_PORT (18 + HOST_MAX_SPECIAL_KERNEL_PORT) -#define HOST_NODE_PORT (19 + HOST_MAX_SPECIAL_KERNEL_PORT) -#define HOST_RESOURCE_NOTIFY_PORT (20 + HOST_MAX_SPECIAL_KERNEL_PORT) -#define HOST_CLOSURED_PORT (21 + HOST_MAX_SPECIAL_KERNEL_PORT) -#define HOST_SYSPOLICYD_PORT (22 + HOST_MAX_SPECIAL_KERNEL_PORT) -#define HOST_FILECOORDINATIOND_PORT (23 + HOST_MAX_SPECIAL_KERNEL_PORT) -#define HOST_FAIRPLAYD_PORT (24 + HOST_MAX_SPECIAL_KERNEL_PORT) - -#define HOST_MAX_SPECIAL_PORT HOST_FAIRPLAYD_PORT -/* MAX = last since rdar://35861175 */ - -/* obsolete name */ -#define HOST_CHUD_PORT HOST_LAUNCHCTL_PORT - -/* - * Special node identifier to always represent the local node. - */ -#define HOST_LOCAL_NODE -1 - -/* - * Definitions for ease of use. - * - * In the get call, the host parameter can be any host, but will generally - * be the local node host port. In the set call, the host must the per-node - * host port for the node being affected. - */ -#define host_get_host_port(host, port) \ - (host_get_special_port((host), \ - HOST_LOCAL_NODE, HOST_PORT, (port))) -#define host_set_host_port(host, port) (KERN_INVALID_ARGUMENT) - -#define host_get_host_priv_port(host, port) \ - (host_get_special_port((host), \ - HOST_LOCAL_NODE, HOST_PRIV_PORT, (port))) -#define host_set_host_priv_port(host, port) (KERN_INVALID_ARGUMENT) - -#define host_get_io_master_port(host, port) \ - (host_get_special_port((host), \ - HOST_LOCAL_NODE, HOST_IO_MASTER_PORT, (port))) -#define host_set_io_master_port(host, port) (KERN_INVALID_ARGUMENT) - -/* - * User-settable special ports. - */ -#define host_get_dynamic_pager_port(host, port) \ - (host_get_special_port((host), \ - HOST_LOCAL_NODE, HOST_DYNAMIC_PAGER_PORT, (port))) -#define host_set_dynamic_pager_port(host, port) \ - (host_set_special_port((host), HOST_DYNAMIC_PAGER_PORT, (port))) - -#define host_get_audit_control_port(host, port) \ - (host_get_special_port((host), \ - HOST_LOCAL_NODE, HOST_AUDIT_CONTROL_PORT, (port))) -#define host_set_audit_control_port(host, port) \ - (host_set_special_port((host), HOST_AUDIT_CONTROL_PORT, (port))) - -#define host_get_user_notification_port(host, port) \ - (host_get_special_port((host), \ - HOST_LOCAL_NODE, HOST_USER_NOTIFICATION_PORT, (port))) -#define host_set_user_notification_port(host, port) \ - (host_set_special_port((host), HOST_USER_NOTIFICATION_PORT, (port))) - -#define host_get_automountd_port(host, port) \ - (host_get_special_port((host), \ - HOST_LOCAL_NODE, HOST_AUTOMOUNTD_PORT, (port))) -#define host_set_automountd_port(host, port) \ - (host_set_special_port((host), HOST_AUTOMOUNTD_PORT, (port))) - -#define host_get_lockd_port(host, port) \ - (host_get_special_port((host), \ - HOST_LOCAL_NODE, HOST_LOCKD_PORT, (port))) -#define host_set_lockd_port(host, port) \ - (host_set_special_port((host), HOST_LOCKD_PORT, (port))) - -#define host_get_ktrace_background_port(host, port) \ - (host_get_special_port((host), \ - HOST_LOCAL_NODE, HOST_KTRACE_BACKGROUND_PORT, (port))) -#define host_set_ktrace_background_port(host, port) \ - (host_set_special_port((host), HOST_KTRACE_BACKGROUND_PORT, (port))) - -#define host_get_kextd_port(host, port) \ - (host_get_special_port((host), \ - HOST_LOCAL_NODE, HOST_KEXTD_PORT, (port))) -#define host_set_kextd_port(host, port) \ - (host_set_special_port((host), HOST_KEXTD_PORT, (port))) - -#define host_get_launchctl_port(host, port) \ - (host_get_special_port((host), HOST_LOCAL_NODE, HOST_LAUNCHCTL_PORT, \ - (port))) -#define host_set_launchctl_port(host, port) \ - (host_set_special_port((host), HOST_LAUNCHCTL_PORT, (port))) - -#define host_get_chud_port(host, port) host_get_launchctl_port(host, port) -#define host_set_chud_port(host, port) host_set_launchctl_port(host, port) - -#define host_get_unfreed_port(host, port) \ - (host_get_special_port((host), \ - HOST_LOCAL_NODE, HOST_UNFREED_PORT, (port))) -#define host_set_unfreed_port(host, port) \ - (host_set_special_port((host), HOST_UNFREED_PORT, (port))) - -#define host_get_amfid_port(host, port) \ - (host_get_special_port((host), \ - HOST_LOCAL_NODE, HOST_AMFID_PORT, (port))) -#define host_set_amfid_port(host, port) \ - (host_set_special_port((host), HOST_AMFID_PORT, (port))) - -#define host_get_gssd_port(host, port) \ - (host_get_special_port((host), \ - HOST_LOCAL_NODE, HOST_GSSD_PORT, (port))) -#define host_set_gssd_port(host, port) \ - (host_set_special_port((host), HOST_GSSD_PORT, (port))) - -#define host_get_telemetry_port(host, port) \ - (host_get_special_port((host), \ - HOST_LOCAL_NODE, HOST_TELEMETRY_PORT, (port))) -#define host_set_telemetry_port(host, port) \ - (host_set_special_port((host), HOST_TELEMETRY_PORT, (port))) - -#define host_get_atm_notification_port(host, port) \ - (host_get_special_port((host), \ - HOST_LOCAL_NODE, HOST_ATM_NOTIFICATION_PORT, (port))) -#define host_set_atm_notification_port(host, port) \ - (host_set_special_port((host), HOST_ATM_NOTIFICATION_PORT, (port))) - -#define host_get_coalition_port(host, port) \ - (host_get_special_port((host), \ - HOST_LOCAL_NODE, HOST_COALITION_PORT, (port))) -#define host_set_coalition_port(host, port) \ - (host_set_special_port((host), HOST_COALITION_PORT, (port))) - -#define host_get_sysdiagnose_port(host, port) \ - (host_get_special_port((host), \ - HOST_LOCAL_NODE, HOST_SYSDIAGNOSE_PORT, (port))) -#define host_set_sysdiagnose_port(host, port) \ - (host_set_special_port((host), HOST_SYSDIAGNOSE_PORT, (port))) - -#define host_get_container_port(host, port) \ - (host_get_special_port((host), \ - HOST_LOCAL_NODE, HOST_CONTAINERD_PORT, (port))) -#define host_set_container_port(host, port) \ - (host_set_special_port((host), HOST_CONTAINERD_PORT, (port))) - -#define host_get_node_port(host, port) \ - (host_get_special_port((host), \ - HOST_LOCAL_NODE, HOST_NODE_PORT, (port))) -#define host_set_node_port(host, port) \ - (host_set_special_port((host), HOST_NODE_PORT, (port))) - -#define host_get_closured_port(host, port) \ - (host_get_special_port((host), \ - HOST_LOCAL_NODE, HOST_CLOSURED_PORT, (port))) -#define host_set_closured_port(host, port) \ - (host_set_special_port((host), HOST_CLOSURED_PORT, (port))) - -#define host_get_syspolicyd_port(host, port) \ - (host_get_special_port((host), \ - HOST_LOCAL_NODE, HOST_SYSPOLICYD_PORT, (port))) -#define host_set_syspolicyd_port(host, port) \ - (host_set_special_port((host), HOST_SYSPOLICYD_PORT, (port))) - -#define host_get_filecoordinationd_port(host, port) \ - (host_get_special_port((host), \ - HOST_LOCAL_NODE, HOST_FILECOORDINATIOND_PORT, (port))) -#define host_set_filecoordinationd_port(host, port) \ - (host_set_special_port((host), HOST_FILECOORDINATIOND_PORT, (port))) - -#define host_get_fairplayd_port(host, port) \ - (host_get_special_port((host), \ - HOST_LOCAL_NODE, HOST_FAIRPLAYD_PORT, (port))) -#define host_set_fairplayd_port(host, port) \ - (host_set_special_port((host), HOST_FAIRPLAYD_PORT, (port))) - -/* HOST_RESOURCE_NOTIFY_PORT doesn't #defines these conveniences. - * All lookups go through send_resource_violation() - */ - -#endif /* _MACH_HOST_SPECIAL_PORTS_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/i386/_structs.h b/lib/libc/include/x86_64-macos-gnu/mach/i386/_structs.h index f041af9f3f..248653b4f8 100644 --- a/lib/libc/include/x86_64-macos-gnu/mach/i386/_structs.h +++ b/lib/libc/include/x86_64-macos-gnu/mach/i386/_structs.h @@ -603,7 +603,48 @@ _STRUCT_X86_DEBUG_STATE32 unsigned int __dr6; unsigned int __dr7; }; + +#define _STRUCT_X86_INSTRUCTION_STATE struct __x86_instruction_state +_STRUCT_X86_INSTRUCTION_STATE +{ + int __insn_stream_valid_bytes; + int __insn_offset; + int __out_of_synch; /* + * non-zero when the cacheline that includes the insn_offset + * is replaced in the insn_bytes array due to a mismatch + * detected when comparing it with the same cacheline in memory + */ +#define _X86_INSTRUCTION_STATE_MAX_INSN_BYTES (2448 - 64 - 4) + __uint8_t __insn_bytes[_X86_INSTRUCTION_STATE_MAX_INSN_BYTES]; +#define _X86_INSTRUCTION_STATE_CACHELINE_SIZE 64 + __uint8_t __insn_cacheline[_X86_INSTRUCTION_STATE_CACHELINE_SIZE]; +}; + +#define _STRUCT_LAST_BRANCH_RECORD struct __last_branch_record +_STRUCT_LAST_BRANCH_RECORD +{ + __uint64_t __from_ip; + __uint64_t __to_ip; + __uint32_t __mispredict : 1, + __tsx_abort : 1, + __in_tsx : 1, + __cycle_count: 16, + __reserved : 13; +}; + +#define _STRUCT_LAST_BRANCH_STATE struct __last_branch_state +_STRUCT_LAST_BRANCH_STATE +{ + int __lbr_count; + __uint32_t __lbr_supported_tsx : 1, + __lbr_supported_cycle_count : 1, + __reserved : 30; +#define __LASTBRANCH_MAX 32 + _STRUCT_LAST_BRANCH_RECORD __lbrs[__LASTBRANCH_MAX]; +}; + #else /* !__DARWIN_UNIX03 */ + #define _STRUCT_X86_DEBUG_STATE32 struct x86_debug_state32 _STRUCT_X86_DEBUG_STATE32 { @@ -616,6 +657,45 @@ _STRUCT_X86_DEBUG_STATE32 unsigned int dr6; unsigned int dr7; }; + +#define _STRUCT_X86_INSTRUCTION_STATE struct __x86_instruction_state +_STRUCT_X86_INSTRUCTION_STATE +{ + int insn_stream_valid_bytes; + int insn_offset; + int out_of_synch; /* + * non-zero when the cacheline that includes the insn_offset + * is replaced in the insn_bytes array due to a mismatch + * detected when comparing it with the same cacheline in memory + */ +#define x86_INSTRUCTION_STATE_MAX_INSN_BYTES (2448 - 64 - 4) + __uint8_t insn_bytes[x86_INSTRUCTION_STATE_MAX_INSN_BYTES]; +#define x86_INSTRUCTION_STATE_CACHELINE_SIZE 64 + __uint8_t insn_cacheline[x86_INSTRUCTION_STATE_CACHELINE_SIZE]; +}; + +#define _STRUCT_LAST_BRANCH_RECORD struct __last_branch_record +_STRUCT_LAST_BRANCH_RECORD +{ + __uint64_t from_ip; + __uint64_t to_ip; + __uint32_t mispredict : 1, + tsx_abort : 1, + in_tsx : 1, + cycle_count: 16, + reserved : 13; +}; + +#define _STRUCT_LAST_BRANCH_STATE struct __last_branch_state +_STRUCT_LAST_BRANCH_STATE +{ + int lbr_count; + __uint32_t lbr_supported_tsx : 1, + lbr_supported_cycle_count : 1, + reserved : 30; +#define __LASTBRANCH_MAX 32 + _STRUCT_LAST_BRANCH_RECORD lbrs[__LASTBRANCH_MAX]; +}; #endif /* !__DARWIN_UNIX03 */ #define _STRUCT_X86_PAGEIN_STATE struct __x86_pagein_state diff --git a/lib/libc/include/x86_64-macos-gnu/mach/i386/thread_state.h b/lib/libc/include/x86_64-macos-gnu/mach/i386/thread_state.h index 78595255a3..4d9825be70 100644 --- a/lib/libc/include/x86_64-macos-gnu/mach/i386/thread_state.h +++ b/lib/libc/include/x86_64-macos-gnu/mach/i386/thread_state.h @@ -32,7 +32,7 @@ #ifndef _MACH_I386_THREAD_STATE_H_ #define _MACH_I386_THREAD_STATE_H_ -/* Size of maximum exported thread state in words */ +/* Size of maximum exported thread state in 32-bit words */ #define I386_THREAD_STATE_MAX (614) /* Size of biggest state possible */ #if defined (__i386__) || defined(__x86_64__) diff --git a/lib/libc/include/x86_64-macos-gnu/mach/i386/thread_status.h b/lib/libc/include/x86_64-macos-gnu/mach/i386/thread_status.h index 233e0f22a6..24de7ae76c 100644 --- a/lib/libc/include/x86_64-macos-gnu/mach/i386/thread_status.h +++ b/lib/libc/include/x86_64-macos-gnu/mach/i386/thread_status.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2020 Apple Computer, Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * @@ -121,6 +121,8 @@ #define x86_AVX512_STATE (x86_AVX512_STATE32 + 2) #define x86_PAGEIN_STATE 22 #define x86_THREAD_FULL_STATE64 23 +#define x86_INSTRUCTION_STATE 24 +#define x86_LAST_BRANCH_STATE 25 /* * Largest state on this machine: @@ -155,6 +157,8 @@ (x == x86_AVX512_STATE64) || \ (x == x86_AVX512_STATE) || \ (x == x86_PAGEIN_STATE) || \ + (x == x86_INSTRUCTION_STATE) || \ + (x == x86_LAST_BRANCH_STATE) || \ (x == THREAD_STATE_NONE)) struct x86_state_hdr { @@ -259,6 +263,19 @@ typedef _STRUCT_X86_PAGEIN_STATE x86_pagein_state_t; #define X86_PAGEIN_STATE_COUNT x86_PAGEIN_STATE_COUNT +typedef _STRUCT_X86_INSTRUCTION_STATE x86_instruction_state_t; +#define x86_INSTRUCTION_STATE_COUNT \ + ((mach_msg_type_number_t)(sizeof(x86_instruction_state_t) / sizeof(int))) + +#define X86_INSTRUCTION_STATE_COUNT x86_INSTRUCTION_STATE_COUNT + +typedef _STRUCT_LAST_BRANCH_STATE last_branch_state_t; +#define x86_LAST_BRANCH_STATE_COUNT \ + ((mach_msg_type_number_t)(sizeof(last_branch_state_t) / sizeof(int))) + +#define X86_LAST_BRANCH_STATE_COUNT x86_LAST_BRANCH_STATE_COUNT + + /* * Combined thread, float and exception states */ diff --git a/lib/libc/include/x86_64-macos-gnu/mach/i386/vm_param.h b/lib/libc/include/x86_64-macos-gnu/mach/i386/vm_param.h index a85ee924b7..fa27fffa2f 100644 --- a/lib/libc/include/x86_64-macos-gnu/mach/i386/vm_param.h +++ b/lib/libc/include/x86_64-macos-gnu/mach/i386/vm_param.h @@ -90,47 +90,34 @@ #ifndef _MACH_I386_VM_PARAM_H_ #define _MACH_I386_VM_PARAM_H_ +#if !defined(KERNEL) && !defined(__ASSEMBLER__) + +#include +#endif + #define BYTE_SIZE 8 /* byte size in bits */ #define I386_PGBYTES 4096 /* bytes per 80386 page */ #define I386_PGSHIFT 12 /* bitshift for pages */ -#define PAGE_SIZE I386_PGBYTES + +#if !defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || (__MAC_OS_X_VERSION_MIN_REQUIRED < 101600) #define PAGE_SHIFT I386_PGSHIFT -#define PAGE_MASK (PAGE_SIZE - 1) +#define PAGE_SIZE I386_PGBYTES +#define PAGE_MASK (PAGE_SIZE-1) +#else /* !defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || (__MAC_OS_X_VERSION_MIN_REQUIRED < 101600) */ +#define PAGE_SHIFT vm_page_shift +#define PAGE_SIZE vm_page_size +#define PAGE_MASK vm_page_mask +#endif /* !defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || (__MAC_OS_X_VERSION_MIN_REQUIRED < 101600) */ -#define PAGE_MAX_SHIFT PAGE_SHIFT -#define PAGE_MAX_SIZE PAGE_SIZE -#define PAGE_MAX_MASK PAGE_MASK - -#define PAGE_MIN_SHIFT PAGE_SHIFT -#define PAGE_MIN_SIZE PAGE_SIZE -#define PAGE_MIN_MASK PAGE_MASK - -#define I386_LPGBYTES 2*1024*1024 /* bytes per large page */ -#define I386_LPGSHIFT 21 /* bitshift for large pages */ -#define I386_LPGMASK (I386_LPGBYTES-1) - -/* - * Convert bytes to pages and convert pages to bytes. - * No rounding is used. - */ - -#define i386_btop(x) ((ppnum_t)((x) >> I386_PGSHIFT)) -#define machine_btop(x) i386_btop(x) -#define i386_ptob(x) (((pmap_paddr_t)(x)) << I386_PGSHIFT) -#define machine_ptob(x) i386_ptob(x) - -/* - * Round off or truncate to the nearest page. These will work - * for either addresses or counts. (i.e. 1 byte rounds to 1 page - * bytes. - */ - -#define i386_round_page(x) ((((pmap_paddr_t)(x)) + I386_PGBYTES - 1) & \ - ~(I386_PGBYTES-1)) -#define i386_trunc_page(x) (((pmap_paddr_t)(x)) & ~(I386_PGBYTES-1)) +#define PAGE_MAX_SHIFT 14 +#define PAGE_MAX_SIZE (1 << PAGE_MAX_SHIFT) +#define PAGE_MAX_MASK (PAGE_MAX_SIZE-1) +#define PAGE_MIN_SHIFT 12 +#define PAGE_MIN_SIZE (1 << PAGE_MIN_SHIFT) +#define PAGE_MIN_MASK (PAGE_MIN_SIZE-1) #define VM_MIN_ADDRESS64 ((user_addr_t) 0x0000000000000000ULL) diff --git a/lib/libc/include/x86_64-macos-gnu/mach/i386/vm_types.h b/lib/libc/include/x86_64-macos-gnu/mach/i386/vm_types.h index 8a95db53ee..57bc28af88 100644 --- a/lib/libc/include/x86_64-macos-gnu/mach/i386/vm_types.h +++ b/lib/libc/include/x86_64-macos-gnu/mach/i386/vm_types.h @@ -70,7 +70,6 @@ #ifndef ASSEMBLER #include -#include #include /* diff --git a/lib/libc/include/x86_64-macos-gnu/mach/kern_return.h b/lib/libc/include/x86_64-macos-gnu/mach/kern_return.h deleted file mode 100644 index 62d6415f52..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/kern_return.h +++ /dev/null @@ -1,330 +0,0 @@ -/* - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * @OSF_COPYRIGHT@ - */ -/* - * Mach Operating System - * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ -/* - */ -/* - * File: h/kern_return.h - * Author: Avadis Tevanian, Jr. - * Date: 1985 - * - * Kernel return codes. - * - */ - -#ifndef _MACH_KERN_RETURN_H_ -#define _MACH_KERN_RETURN_H_ - -#include - -#define KERN_SUCCESS 0 - -#define KERN_INVALID_ADDRESS 1 -/* Specified address is not currently valid. - */ - -#define KERN_PROTECTION_FAILURE 2 -/* Specified memory is valid, but does not permit the - * required forms of access. - */ - -#define KERN_NO_SPACE 3 -/* The address range specified is already in use, or - * no address range of the size specified could be - * found. - */ - -#define KERN_INVALID_ARGUMENT 4 -/* The function requested was not applicable to this - * type of argument, or an argument is invalid - */ - -#define KERN_FAILURE 5 -/* The function could not be performed. A catch-all. - */ - -#define KERN_RESOURCE_SHORTAGE 6 -/* A system resource could not be allocated to fulfill - * this request. This failure may not be permanent. - */ - -#define KERN_NOT_RECEIVER 7 -/* The task in question does not hold receive rights - * for the port argument. - */ - -#define KERN_NO_ACCESS 8 -/* Bogus access restriction. - */ - -#define KERN_MEMORY_FAILURE 9 -/* During a page fault, the target address refers to a - * memory object that has been destroyed. This - * failure is permanent. - */ - -#define KERN_MEMORY_ERROR 10 -/* During a page fault, the memory object indicated - * that the data could not be returned. This failure - * may be temporary; future attempts to access this - * same data may succeed, as defined by the memory - * object. - */ - -#define KERN_ALREADY_IN_SET 11 -/* The receive right is already a member of the portset. - */ - -#define KERN_NOT_IN_SET 12 -/* The receive right is not a member of a port set. - */ - -#define KERN_NAME_EXISTS 13 -/* The name already denotes a right in the task. - */ - -#define KERN_ABORTED 14 -/* The operation was aborted. Ipc code will - * catch this and reflect it as a message error. - */ - -#define KERN_INVALID_NAME 15 -/* The name doesn't denote a right in the task. - */ - -#define KERN_INVALID_TASK 16 -/* Target task isn't an active task. - */ - -#define KERN_INVALID_RIGHT 17 -/* The name denotes a right, but not an appropriate right. - */ - -#define KERN_INVALID_VALUE 18 -/* A blatant range error. - */ - -#define KERN_UREFS_OVERFLOW 19 -/* Operation would overflow limit on user-references. - */ - -#define KERN_INVALID_CAPABILITY 20 -/* The supplied (port) capability is improper. - */ - -#define KERN_RIGHT_EXISTS 21 -/* The task already has send or receive rights - * for the port under another name. - */ - -#define KERN_INVALID_HOST 22 -/* Target host isn't actually a host. - */ - -#define KERN_MEMORY_PRESENT 23 -/* An attempt was made to supply "precious" data - * for memory that is already present in a - * memory object. - */ - -#define KERN_MEMORY_DATA_MOVED 24 -/* A page was requested of a memory manager via - * memory_object_data_request for an object using - * a MEMORY_OBJECT_COPY_CALL strategy, with the - * VM_PROT_WANTS_COPY flag being used to specify - * that the page desired is for a copy of the - * object, and the memory manager has detected - * the page was pushed into a copy of the object - * while the kernel was walking the shadow chain - * from the copy to the object. This error code - * is delivered via memory_object_data_error - * and is handled by the kernel (it forces the - * kernel to restart the fault). It will not be - * seen by users. - */ - -#define KERN_MEMORY_RESTART_COPY 25 -/* A strategic copy was attempted of an object - * upon which a quicker copy is now possible. - * The caller should retry the copy using - * vm_object_copy_quickly. This error code - * is seen only by the kernel. - */ - -#define KERN_INVALID_PROCESSOR_SET 26 -/* An argument applied to assert processor set privilege - * was not a processor set control port. - */ - -#define KERN_POLICY_LIMIT 27 -/* The specified scheduling attributes exceed the thread's - * limits. - */ - -#define KERN_INVALID_POLICY 28 -/* The specified scheduling policy is not currently - * enabled for the processor set. - */ - -#define KERN_INVALID_OBJECT 29 -/* The external memory manager failed to initialize the - * memory object. - */ - -#define KERN_ALREADY_WAITING 30 -/* A thread is attempting to wait for an event for which - * there is already a waiting thread. - */ - -#define KERN_DEFAULT_SET 31 -/* An attempt was made to destroy the default processor - * set. - */ - -#define KERN_EXCEPTION_PROTECTED 32 -/* An attempt was made to fetch an exception port that is - * protected, or to abort a thread while processing a - * protected exception. - */ - -#define KERN_INVALID_LEDGER 33 -/* A ledger was required but not supplied. - */ - -#define KERN_INVALID_MEMORY_CONTROL 34 -/* The port was not a memory cache control port. - */ - -#define KERN_INVALID_SECURITY 35 -/* An argument supplied to assert security privilege - * was not a host security port. - */ - -#define KERN_NOT_DEPRESSED 36 -/* thread_depress_abort was called on a thread which - * was not currently depressed. - */ - -#define KERN_TERMINATED 37 -/* Object has been terminated and is no longer available - */ - -#define KERN_LOCK_SET_DESTROYED 38 -/* Lock set has been destroyed and is no longer available. - */ - -#define KERN_LOCK_UNSTABLE 39 -/* The thread holding the lock terminated before releasing - * the lock - */ - -#define KERN_LOCK_OWNED 40 -/* The lock is already owned by another thread - */ - -#define KERN_LOCK_OWNED_SELF 41 -/* The lock is already owned by the calling thread - */ - -#define KERN_SEMAPHORE_DESTROYED 42 -/* Semaphore has been destroyed and is no longer available. - */ - -#define KERN_RPC_SERVER_TERMINATED 43 -/* Return from RPC indicating the target server was - * terminated before it successfully replied - */ - -#define KERN_RPC_TERMINATE_ORPHAN 44 -/* Terminate an orphaned activation. - */ - -#define KERN_RPC_CONTINUE_ORPHAN 45 -/* Allow an orphaned activation to continue executing. - */ - -#define KERN_NOT_SUPPORTED 46 -/* Empty thread activation (No thread linked to it) - */ - -#define KERN_NODE_DOWN 47 -/* Remote node down or inaccessible. - */ - -#define KERN_NOT_WAITING 48 -/* A signalled thread was not actually waiting. */ - -#define KERN_OPERATION_TIMED_OUT 49 -/* Some thread-oriented operation (semaphore_wait) timed out - */ - -#define KERN_CODESIGN_ERROR 50 -/* During a page fault, indicates that the page was rejected - * as a result of a signature check. - */ - -#define KERN_POLICY_STATIC 51 -/* The requested property cannot be changed at this time. - */ - -#define KERN_INSUFFICIENT_BUFFER_SIZE 52 -/* The provided buffer is of insufficient size for the requested data. - */ - -#define KERN_RETURN_MAX 0x100 -/* Maximum return value allowable - */ - -#endif /* _MACH_KERN_RETURN_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/mach_init.h b/lib/libc/include/x86_64-macos-gnu/mach/mach_init.h deleted file mode 100644 index d61d6e90b5..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/mach_init.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * Mach Operating System - * Copyright (c) 1991,1990,1989,1988,1987,1986 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ - -/* - * Items provided by the Mach environment initialization. - */ - -#ifndef _MACH_INIT_ -#define _MACH_INIT_ 1 - -#include -#include -#include - -#include - -/* - * Kernel-related ports; how a task/thread controls itself - */ - -__BEGIN_DECLS -extern mach_port_t mach_host_self(void); -extern mach_port_t mach_thread_self(void); -extern kern_return_t host_page_size(host_t, vm_size_t *); - -extern mach_port_t mach_task_self_; -#define mach_task_self() mach_task_self_ -#define current_task() mach_task_self() - -__END_DECLS -#include -__BEGIN_DECLS - -/* - * Other important ports in the Mach user environment - */ - -extern mach_port_t bootstrap_port; - -/* - * Where these ports occur in the "mach_ports_register" - * collection... only servers or the runtime library need know. - */ - -#define NAME_SERVER_SLOT 0 -#define ENVIRONMENT_SLOT 1 -#define SERVICE_SLOT 2 - -#define MACH_PORTS_SLOTS_USED 3 - -/* - * fprintf_stderr uses vprintf_stderr_func to produce - * error messages, this can be overridden by a user - * application to point to a user-specified output function - */ -extern int (*vprintf_stderr_func)(const char *format, va_list ap); - -__END_DECLS - -#endif /* _MACH_INIT_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/mach_port.h b/lib/libc/include/x86_64-macos-gnu/mach/mach_port.h deleted file mode 100644 index fcec114ccf..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/mach_port.h +++ /dev/null @@ -1,1808 +0,0 @@ -#ifndef _mach_port_user_ -#define _mach_port_user_ - -/* Module mach_port */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* BEGIN MIG_STRNCPY_ZEROFILL CODE */ - -#if defined(__has_include) -#if __has_include() -#ifndef USING_MIG_STRNCPY_ZEROFILL -#define USING_MIG_STRNCPY_ZEROFILL -#endif -#ifndef __MIG_STRNCPY_ZEROFILL_FORWARD_TYPE_DECLS__ -#define __MIG_STRNCPY_ZEROFILL_FORWARD_TYPE_DECLS__ -#ifdef __cplusplus -extern "C" { -#endif - extern int mig_strncpy_zerofill(char *dest, const char *src, int len) __attribute__((weak_import)); -#ifdef __cplusplus -} -#endif -#endif /* __MIG_STRNCPY_ZEROFILL_FORWARD_TYPE_DECLS__ */ -#endif /* __has_include() */ -#endif /* __has_include */ - -/* END MIG_STRNCPY_ZEROFILL CODE */ - - -#ifdef AUTOTEST -#ifndef FUNCTION_PTR_T -#define FUNCTION_PTR_T -typedef void (*function_ptr_t)(mach_port_t, char *, mach_msg_type_number_t); -typedef struct { - char *name; - function_ptr_t function; -} function_table_entry; -typedef function_table_entry *function_table_t; -#endif /* FUNCTION_PTR_T */ -#endif /* AUTOTEST */ - -#ifndef mach_port_MSG_COUNT -#define mach_port_MSG_COUNT 40 -#endif /* mach_port_MSG_COUNT */ - -#include -#include -#include -#include -#include - -#ifdef __BeforeMigUserHeader -__BeforeMigUserHeader -#endif /* __BeforeMigUserHeader */ - -#include -__BEGIN_DECLS - - -/* Routine mach_port_names */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_names -( - ipc_space_t task, - mach_port_name_array_t *names, - mach_msg_type_number_t *namesCnt, - mach_port_type_array_t *types, - mach_msg_type_number_t *typesCnt -); - -/* Routine mach_port_type */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_type -( - ipc_space_t task, - mach_port_name_t name, - mach_port_type_t *ptype -); - -/* Routine mach_port_rename */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_rename -( - ipc_space_t task, - mach_port_name_t old_name, - mach_port_name_t new_name -); - -/* Routine mach_port_allocate_name */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t mach_port_allocate_name -( - ipc_space_t task, - mach_port_right_t right, - mach_port_name_t name -); - -/* Routine mach_port_allocate */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_allocate -( - ipc_space_t task, - mach_port_right_t right, - mach_port_name_t *name -); - -/* Routine mach_port_destroy */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_destroy -( - ipc_space_t task, - mach_port_name_t name -); - -/* Routine mach_port_deallocate */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_deallocate -( - ipc_space_t task, - mach_port_name_t name -); - -/* Routine mach_port_get_refs */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_get_refs -( - ipc_space_t task, - mach_port_name_t name, - mach_port_right_t right, - mach_port_urefs_t *refs -); - -/* Routine mach_port_mod_refs */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_mod_refs -( - ipc_space_t task, - mach_port_name_t name, - mach_port_right_t right, - mach_port_delta_t delta -); - -/* Routine mach_port_peek */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_peek -( - ipc_space_t task, - mach_port_name_t name, - mach_msg_trailer_type_t trailer_type, - mach_port_seqno_t *request_seqnop, - mach_msg_size_t *msg_sizep, - mach_msg_id_t *msg_idp, - mach_msg_trailer_info_t trailer_infop, - mach_msg_type_number_t *trailer_infopCnt -); - -/* Routine mach_port_set_mscount */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_set_mscount -( - ipc_space_t task, - mach_port_name_t name, - mach_port_mscount_t mscount -); - -/* Routine mach_port_get_set_status */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_get_set_status -( - ipc_space_inspect_t task, - mach_port_name_t name, - mach_port_name_array_t *members, - mach_msg_type_number_t *membersCnt -); - -/* Routine mach_port_move_member */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_move_member -( - ipc_space_t task, - mach_port_name_t member, - mach_port_name_t after -); - -/* Routine mach_port_request_notification */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_request_notification -( - ipc_space_t task, - mach_port_name_t name, - mach_msg_id_t msgid, - mach_port_mscount_t sync, - mach_port_t notify, - mach_msg_type_name_t notifyPoly, - mach_port_t *previous -); - -/* Routine mach_port_insert_right */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_insert_right -( - ipc_space_t task, - mach_port_name_t name, - mach_port_t poly, - mach_msg_type_name_t polyPoly -); - -/* Routine mach_port_extract_right */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_extract_right -( - ipc_space_t task, - mach_port_name_t name, - mach_msg_type_name_t msgt_name, - mach_port_t *poly, - mach_msg_type_name_t *polyPoly -); - -/* Routine mach_port_set_seqno */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_set_seqno -( - ipc_space_t task, - mach_port_name_t name, - mach_port_seqno_t seqno -); - -/* Routine mach_port_get_attributes */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_get_attributes -( - ipc_space_inspect_t task, - mach_port_name_t name, - mach_port_flavor_t flavor, - mach_port_info_t port_info_out, - mach_msg_type_number_t *port_info_outCnt -); - -/* Routine mach_port_set_attributes */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_set_attributes -( - ipc_space_t task, - mach_port_name_t name, - mach_port_flavor_t flavor, - mach_port_info_t port_info, - mach_msg_type_number_t port_infoCnt -); - -/* Routine mach_port_allocate_qos */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_allocate_qos -( - ipc_space_t task, - mach_port_right_t right, - mach_port_qos_t *qos, - mach_port_name_t *name -); - -/* Routine mach_port_allocate_full */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_allocate_full -( - ipc_space_t task, - mach_port_right_t right, - mach_port_t proto, - mach_port_qos_t *qos, - mach_port_name_t *name -); - -/* Routine task_set_port_space */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t task_set_port_space -( - ipc_space_t task, - int table_entries -); - -/* Routine mach_port_get_srights */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_get_srights -( - ipc_space_t task, - mach_port_name_t name, - mach_port_rights_t *srights -); - -/* Routine mach_port_space_info */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_space_info -( - ipc_space_inspect_t task, - ipc_info_space_t *space_info, - ipc_info_name_array_t *table_info, - mach_msg_type_number_t *table_infoCnt, - ipc_info_tree_name_array_t *tree_info, - mach_msg_type_number_t *tree_infoCnt -); - -/* Routine mach_port_dnrequest_info */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_dnrequest_info -( - ipc_space_t task, - mach_port_name_t name, - unsigned *dnr_total, - unsigned *dnr_used -); - -/* Routine mach_port_kernel_object */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_kernel_object -( - ipc_space_inspect_t task, - mach_port_name_t name, - unsigned *object_type, - unsigned *object_addr -); - -/* Routine mach_port_insert_member */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_insert_member -( - ipc_space_t task, - mach_port_name_t name, - mach_port_name_t pset -); - -/* Routine mach_port_extract_member */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_extract_member -( - ipc_space_t task, - mach_port_name_t name, - mach_port_name_t pset -); - -/* Routine mach_port_get_context */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_get_context -( - ipc_space_inspect_t task, - mach_port_name_t name, - mach_port_context_t *context -); - -/* Routine mach_port_set_context */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_set_context -( - ipc_space_t task, - mach_port_name_t name, - mach_port_context_t context -); - -/* Routine mach_port_kobject */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_kobject -( - ipc_space_inspect_t task, - mach_port_name_t name, - natural_t *object_type, - mach_vm_address_t *object_addr -); - -/* Routine mach_port_construct */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_construct -( - ipc_space_t task, - mach_port_options_ptr_t options, - mach_port_context_t context, - mach_port_name_t *name -); - -/* Routine mach_port_destruct */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_destruct -( - ipc_space_t task, - mach_port_name_t name, - mach_port_delta_t srdelta, - mach_port_context_t guard -); - -/* Routine mach_port_guard */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_guard -( - ipc_space_t task, - mach_port_name_t name, - mach_port_context_t guard, - boolean_t strict -); - -/* Routine mach_port_unguard */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_unguard -( - ipc_space_t task, - mach_port_name_t name, - mach_port_context_t guard -); - -/* Routine mach_port_space_basic_info */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_space_basic_info -( - ipc_space_inspect_t task, - ipc_info_space_basic_t *basic_info -); - -/* Routine mach_port_guard_with_flags */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_guard_with_flags -( - ipc_space_t task, - mach_port_name_t name, - mach_port_context_t guard, - uint64_t flags -); - -/* Routine mach_port_swap_guard */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_swap_guard -( - ipc_space_t task, - mach_port_name_t name, - mach_port_context_t old_guard, - mach_port_context_t new_guard -); - -/* Routine mach_port_kobject_description */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_port_kobject_description -( - ipc_space_inspect_t task, - mach_port_name_t name, - natural_t *object_type, - mach_vm_address_t *object_addr, - kobject_description_t description -); - -__END_DECLS - -/********************** Caution **************************/ -/* The following data types should be used to calculate */ -/* maximum message sizes only. The actual message may be */ -/* smaller, and the position of the arguments within the */ -/* message layout may vary from what is presented here. */ -/* For example, if any of the arguments are variable- */ -/* sized, and less than the maximum is sent, the data */ -/* will be packed tight in the actual message to reduce */ -/* the presence of holes. */ -/********************** Caution **************************/ - -/* typedefs for all requests */ - -#ifndef __Request__mach_port_subsystem__defined -#define __Request__mach_port_subsystem__defined - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__mach_port_names_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - } __Request__mach_port_type_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t old_name; - mach_port_name_t new_name; - } __Request__mach_port_rename_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_right_t right; - mach_port_name_t name; - } __Request__mach_port_allocate_name_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_right_t right; - } __Request__mach_port_allocate_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - } __Request__mach_port_destroy_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - } __Request__mach_port_deallocate_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - mach_port_right_t right; - } __Request__mach_port_get_refs_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - mach_port_right_t right; - mach_port_delta_t delta; - } __Request__mach_port_mod_refs_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - mach_msg_trailer_type_t trailer_type; - mach_port_seqno_t request_seqnop; - mach_msg_type_number_t trailer_infopCnt; - } __Request__mach_port_peek_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - mach_port_mscount_t mscount; - } __Request__mach_port_set_mscount_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - } __Request__mach_port_get_set_status_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t member; - mach_port_name_t after; - } __Request__mach_port_move_member_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t notify; - /* end of the kernel processed data */ - NDR_record_t NDR; - mach_port_name_t name; - mach_msg_id_t msgid; - mach_port_mscount_t sync; - } __Request__mach_port_request_notification_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t poly; - /* end of the kernel processed data */ - NDR_record_t NDR; - mach_port_name_t name; - } __Request__mach_port_insert_right_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - mach_msg_type_name_t msgt_name; - } __Request__mach_port_extract_right_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - mach_port_seqno_t seqno; - } __Request__mach_port_set_seqno_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - mach_port_flavor_t flavor; - mach_msg_type_number_t port_info_outCnt; - } __Request__mach_port_get_attributes_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - mach_port_flavor_t flavor; - mach_msg_type_number_t port_infoCnt; - integer_t port_info[17]; - } __Request__mach_port_set_attributes_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_right_t right; - mach_port_qos_t qos; - } __Request__mach_port_allocate_qos_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t proto; - /* end of the kernel processed data */ - NDR_record_t NDR; - mach_port_right_t right; - mach_port_qos_t qos; - mach_port_name_t name; - } __Request__mach_port_allocate_full_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - int table_entries; - } __Request__task_set_port_space_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - } __Request__mach_port_get_srights_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__mach_port_space_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - } __Request__mach_port_dnrequest_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - } __Request__mach_port_kernel_object_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - mach_port_name_t pset; - } __Request__mach_port_insert_member_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - mach_port_name_t pset; - } __Request__mach_port_extract_member_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - } __Request__mach_port_get_context_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - mach_port_context_t context; - } __Request__mach_port_set_context_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - } __Request__mach_port_kobject_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_ool_descriptor_t options; - /* end of the kernel processed data */ - NDR_record_t NDR; - mach_port_context_t context; - } __Request__mach_port_construct_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - mach_port_delta_t srdelta; - mach_port_context_t guard; - } __Request__mach_port_destruct_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - mach_port_context_t guard; - boolean_t strict; - } __Request__mach_port_guard_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - mach_port_context_t guard; - } __Request__mach_port_unguard_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__mach_port_space_basic_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - mach_port_context_t guard; - uint64_t flags; - } __Request__mach_port_guard_with_flags_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - mach_port_context_t old_guard; - mach_port_context_t new_guard; - } __Request__mach_port_swap_guard_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_port_name_t name; - } __Request__mach_port_kobject_description_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif -#endif /* !__Request__mach_port_subsystem__defined */ - -/* union of all requests */ - -#ifndef __RequestUnion__mach_port_subsystem__defined -#define __RequestUnion__mach_port_subsystem__defined -union __RequestUnion__mach_port_subsystem { - __Request__mach_port_names_t Request_mach_port_names; - __Request__mach_port_type_t Request_mach_port_type; - __Request__mach_port_rename_t Request_mach_port_rename; - __Request__mach_port_allocate_name_t Request_mach_port_allocate_name; - __Request__mach_port_allocate_t Request_mach_port_allocate; - __Request__mach_port_destroy_t Request_mach_port_destroy; - __Request__mach_port_deallocate_t Request_mach_port_deallocate; - __Request__mach_port_get_refs_t Request_mach_port_get_refs; - __Request__mach_port_mod_refs_t Request_mach_port_mod_refs; - __Request__mach_port_peek_t Request_mach_port_peek; - __Request__mach_port_set_mscount_t Request_mach_port_set_mscount; - __Request__mach_port_get_set_status_t Request_mach_port_get_set_status; - __Request__mach_port_move_member_t Request_mach_port_move_member; - __Request__mach_port_request_notification_t Request_mach_port_request_notification; - __Request__mach_port_insert_right_t Request_mach_port_insert_right; - __Request__mach_port_extract_right_t Request_mach_port_extract_right; - __Request__mach_port_set_seqno_t Request_mach_port_set_seqno; - __Request__mach_port_get_attributes_t Request_mach_port_get_attributes; - __Request__mach_port_set_attributes_t Request_mach_port_set_attributes; - __Request__mach_port_allocate_qos_t Request_mach_port_allocate_qos; - __Request__mach_port_allocate_full_t Request_mach_port_allocate_full; - __Request__task_set_port_space_t Request_task_set_port_space; - __Request__mach_port_get_srights_t Request_mach_port_get_srights; - __Request__mach_port_space_info_t Request_mach_port_space_info; - __Request__mach_port_dnrequest_info_t Request_mach_port_dnrequest_info; - __Request__mach_port_kernel_object_t Request_mach_port_kernel_object; - __Request__mach_port_insert_member_t Request_mach_port_insert_member; - __Request__mach_port_extract_member_t Request_mach_port_extract_member; - __Request__mach_port_get_context_t Request_mach_port_get_context; - __Request__mach_port_set_context_t Request_mach_port_set_context; - __Request__mach_port_kobject_t Request_mach_port_kobject; - __Request__mach_port_construct_t Request_mach_port_construct; - __Request__mach_port_destruct_t Request_mach_port_destruct; - __Request__mach_port_guard_t Request_mach_port_guard; - __Request__mach_port_unguard_t Request_mach_port_unguard; - __Request__mach_port_space_basic_info_t Request_mach_port_space_basic_info; - __Request__mach_port_guard_with_flags_t Request_mach_port_guard_with_flags; - __Request__mach_port_swap_guard_t Request_mach_port_swap_guard; - __Request__mach_port_kobject_description_t Request_mach_port_kobject_description; -}; -#endif /* !__RequestUnion__mach_port_subsystem__defined */ -/* typedefs for all replies */ - -#ifndef __Reply__mach_port_subsystem__defined -#define __Reply__mach_port_subsystem__defined - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_ool_descriptor_t names; - mach_msg_ool_descriptor_t types; - /* end of the kernel processed data */ - NDR_record_t NDR; - mach_msg_type_number_t namesCnt; - mach_msg_type_number_t typesCnt; - } __Reply__mach_port_names_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - mach_port_type_t ptype; - } __Reply__mach_port_type_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__mach_port_rename_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__mach_port_allocate_name_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - mach_port_name_t name; - } __Reply__mach_port_allocate_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__mach_port_destroy_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__mach_port_deallocate_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - mach_port_urefs_t refs; - } __Reply__mach_port_get_refs_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__mach_port_mod_refs_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - mach_port_seqno_t request_seqnop; - mach_msg_size_t msg_sizep; - mach_msg_id_t msg_idp; - mach_msg_type_number_t trailer_infopCnt; - char trailer_infop[68]; - } __Reply__mach_port_peek_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__mach_port_set_mscount_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_ool_descriptor_t members; - /* end of the kernel processed data */ - NDR_record_t NDR; - mach_msg_type_number_t membersCnt; - } __Reply__mach_port_get_set_status_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__mach_port_move_member_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t previous; - /* end of the kernel processed data */ - } __Reply__mach_port_request_notification_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__mach_port_insert_right_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t poly; - /* end of the kernel processed data */ - } __Reply__mach_port_extract_right_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__mach_port_set_seqno_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - mach_msg_type_number_t port_info_outCnt; - integer_t port_info_out[17]; - } __Reply__mach_port_get_attributes_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__mach_port_set_attributes_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - mach_port_qos_t qos; - mach_port_name_t name; - } __Reply__mach_port_allocate_qos_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - mach_port_qos_t qos; - mach_port_name_t name; - } __Reply__mach_port_allocate_full_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__task_set_port_space_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - mach_port_rights_t srights; - } __Reply__mach_port_get_srights_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_ool_descriptor_t table_info; - mach_msg_ool_descriptor_t tree_info; - /* end of the kernel processed data */ - NDR_record_t NDR; - ipc_info_space_t space_info; - mach_msg_type_number_t table_infoCnt; - mach_msg_type_number_t tree_infoCnt; - } __Reply__mach_port_space_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - unsigned dnr_total; - unsigned dnr_used; - } __Reply__mach_port_dnrequest_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - unsigned object_type; - unsigned object_addr; - } __Reply__mach_port_kernel_object_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__mach_port_insert_member_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__mach_port_extract_member_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - mach_port_context_t context; - } __Reply__mach_port_get_context_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__mach_port_set_context_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - natural_t object_type; - mach_vm_address_t object_addr; - } __Reply__mach_port_kobject_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - mach_port_name_t name; - } __Reply__mach_port_construct_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__mach_port_destruct_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__mach_port_guard_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__mach_port_unguard_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - ipc_info_space_basic_t basic_info; - } __Reply__mach_port_space_basic_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__mach_port_guard_with_flags_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__mach_port_swap_guard_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - natural_t object_type; - mach_vm_address_t object_addr; - mach_msg_type_number_t descriptionOffset; /* MiG doesn't use it */ - mach_msg_type_number_t descriptionCnt; - char description[512]; - } __Reply__mach_port_kobject_description_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif -#endif /* !__Reply__mach_port_subsystem__defined */ - -/* union of all replies */ - -#ifndef __ReplyUnion__mach_port_subsystem__defined -#define __ReplyUnion__mach_port_subsystem__defined -union __ReplyUnion__mach_port_subsystem { - __Reply__mach_port_names_t Reply_mach_port_names; - __Reply__mach_port_type_t Reply_mach_port_type; - __Reply__mach_port_rename_t Reply_mach_port_rename; - __Reply__mach_port_allocate_name_t Reply_mach_port_allocate_name; - __Reply__mach_port_allocate_t Reply_mach_port_allocate; - __Reply__mach_port_destroy_t Reply_mach_port_destroy; - __Reply__mach_port_deallocate_t Reply_mach_port_deallocate; - __Reply__mach_port_get_refs_t Reply_mach_port_get_refs; - __Reply__mach_port_mod_refs_t Reply_mach_port_mod_refs; - __Reply__mach_port_peek_t Reply_mach_port_peek; - __Reply__mach_port_set_mscount_t Reply_mach_port_set_mscount; - __Reply__mach_port_get_set_status_t Reply_mach_port_get_set_status; - __Reply__mach_port_move_member_t Reply_mach_port_move_member; - __Reply__mach_port_request_notification_t Reply_mach_port_request_notification; - __Reply__mach_port_insert_right_t Reply_mach_port_insert_right; - __Reply__mach_port_extract_right_t Reply_mach_port_extract_right; - __Reply__mach_port_set_seqno_t Reply_mach_port_set_seqno; - __Reply__mach_port_get_attributes_t Reply_mach_port_get_attributes; - __Reply__mach_port_set_attributes_t Reply_mach_port_set_attributes; - __Reply__mach_port_allocate_qos_t Reply_mach_port_allocate_qos; - __Reply__mach_port_allocate_full_t Reply_mach_port_allocate_full; - __Reply__task_set_port_space_t Reply_task_set_port_space; - __Reply__mach_port_get_srights_t Reply_mach_port_get_srights; - __Reply__mach_port_space_info_t Reply_mach_port_space_info; - __Reply__mach_port_dnrequest_info_t Reply_mach_port_dnrequest_info; - __Reply__mach_port_kernel_object_t Reply_mach_port_kernel_object; - __Reply__mach_port_insert_member_t Reply_mach_port_insert_member; - __Reply__mach_port_extract_member_t Reply_mach_port_extract_member; - __Reply__mach_port_get_context_t Reply_mach_port_get_context; - __Reply__mach_port_set_context_t Reply_mach_port_set_context; - __Reply__mach_port_kobject_t Reply_mach_port_kobject; - __Reply__mach_port_construct_t Reply_mach_port_construct; - __Reply__mach_port_destruct_t Reply_mach_port_destruct; - __Reply__mach_port_guard_t Reply_mach_port_guard; - __Reply__mach_port_unguard_t Reply_mach_port_unguard; - __Reply__mach_port_space_basic_info_t Reply_mach_port_space_basic_info; - __Reply__mach_port_guard_with_flags_t Reply_mach_port_guard_with_flags; - __Reply__mach_port_swap_guard_t Reply_mach_port_swap_guard; - __Reply__mach_port_kobject_description_t Reply_mach_port_kobject_description; -}; -#endif /* !__RequestUnion__mach_port_subsystem__defined */ - -#ifndef subsystem_to_name_map_mach_port -#define subsystem_to_name_map_mach_port \ - { "mach_port_names", 3200 },\ - { "mach_port_type", 3201 },\ - { "mach_port_rename", 3202 },\ - { "mach_port_allocate_name", 3203 },\ - { "mach_port_allocate", 3204 },\ - { "mach_port_destroy", 3205 },\ - { "mach_port_deallocate", 3206 },\ - { "mach_port_get_refs", 3207 },\ - { "mach_port_mod_refs", 3208 },\ - { "mach_port_peek", 3209 },\ - { "mach_port_set_mscount", 3210 },\ - { "mach_port_get_set_status", 3211 },\ - { "mach_port_move_member", 3212 },\ - { "mach_port_request_notification", 3213 },\ - { "mach_port_insert_right", 3214 },\ - { "mach_port_extract_right", 3215 },\ - { "mach_port_set_seqno", 3216 },\ - { "mach_port_get_attributes", 3217 },\ - { "mach_port_set_attributes", 3218 },\ - { "mach_port_allocate_qos", 3219 },\ - { "mach_port_allocate_full", 3220 },\ - { "task_set_port_space", 3221 },\ - { "mach_port_get_srights", 3222 },\ - { "mach_port_space_info", 3223 },\ - { "mach_port_dnrequest_info", 3224 },\ - { "mach_port_kernel_object", 3225 },\ - { "mach_port_insert_member", 3226 },\ - { "mach_port_extract_member", 3227 },\ - { "mach_port_get_context", 3228 },\ - { "mach_port_set_context", 3229 },\ - { "mach_port_kobject", 3230 },\ - { "mach_port_construct", 3231 },\ - { "mach_port_destruct", 3232 },\ - { "mach_port_guard", 3233 },\ - { "mach_port_unguard", 3234 },\ - { "mach_port_space_basic_info", 3235 },\ - { "mach_port_guard_with_flags", 3237 },\ - { "mach_port_swap_guard", 3238 },\ - { "mach_port_kobject_description", 3239 } -#endif - -#ifdef __AfterMigUserHeader -__AfterMigUserHeader -#endif /* __AfterMigUserHeader */ - -#endif /* _mach_port_user_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/mach_traps.h b/lib/libc/include/x86_64-macos-gnu/mach/mach_traps.h deleted file mode 100644 index d3aaf577ed..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/mach_traps.h +++ /dev/null @@ -1,303 +0,0 @@ -/* - * Copyright (c) 2000-2019 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * @OSF_COPYRIGHT@ - */ -/* - * Mach Operating System - * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ -/* - */ -/* - * Definitions of general Mach system traps. - * - * These are the definitions as seen from user-space. - * The kernel definitions are in . - * Kernel RPC functions are defined in . - */ - -#ifndef _MACH_MACH_TRAPS_H_ -#define _MACH_MACH_TRAPS_H_ - -#include - -#include -#include -#include -#include -#include -#include - -#include - -#include - -__BEGIN_DECLS - - - -extern kern_return_t clock_sleep_trap( - mach_port_name_t clock_name, - sleep_type_t sleep_type, - int sleep_sec, - int sleep_nsec, - mach_timespec_t *wakeup_time); - -extern kern_return_t _kernelrpc_mach_vm_allocate_trap( - mach_port_name_t target, - mach_vm_offset_t *addr, - mach_vm_size_t size, - int flags); - -extern kern_return_t _kernelrpc_mach_vm_deallocate_trap( - mach_port_name_t target, - mach_vm_address_t address, - mach_vm_size_t size - ); - -extern kern_return_t _kernelrpc_mach_vm_protect_trap( - mach_port_name_t target, - mach_vm_address_t address, - mach_vm_size_t size, - boolean_t set_maximum, - vm_prot_t new_protection - ); - -extern kern_return_t _kernelrpc_mach_vm_map_trap( - mach_port_name_t target, - mach_vm_offset_t *address, - mach_vm_size_t size, - mach_vm_offset_t mask, - int flags, - vm_prot_t cur_protection - ); - -extern kern_return_t _kernelrpc_mach_vm_purgable_control_trap( - mach_port_name_t target, - mach_vm_offset_t address, - vm_purgable_t control, - int *state); - -extern kern_return_t _kernelrpc_mach_port_allocate_trap( - mach_port_name_t target, - mach_port_right_t right, - mach_port_name_t *name - ); - - -extern kern_return_t _kernelrpc_mach_port_destroy_trap( - mach_port_name_t target, - mach_port_name_t name - ); - -extern kern_return_t _kernelrpc_mach_port_deallocate_trap( - mach_port_name_t target, - mach_port_name_t name - ); - -extern kern_return_t _kernelrpc_mach_port_mod_refs_trap( - mach_port_name_t target, - mach_port_name_t name, - mach_port_right_t right, - mach_port_delta_t delta - ); - -extern kern_return_t _kernelrpc_mach_port_move_member_trap( - mach_port_name_t target, - mach_port_name_t member, - mach_port_name_t after - ); - -extern kern_return_t _kernelrpc_mach_port_insert_right_trap( - mach_port_name_t target, - mach_port_name_t name, - mach_port_name_t poly, - mach_msg_type_name_t polyPoly - ); - -extern kern_return_t _kernelrpc_mach_port_get_attributes_trap( - mach_port_name_t target, - mach_port_name_t name, - mach_port_flavor_t flavor, - mach_port_info_t port_info_out, - mach_msg_type_number_t *port_info_outCnt - ); - -extern kern_return_t _kernelrpc_mach_port_insert_member_trap( - mach_port_name_t target, - mach_port_name_t name, - mach_port_name_t pset - ); - -extern kern_return_t _kernelrpc_mach_port_extract_member_trap( - mach_port_name_t target, - mach_port_name_t name, - mach_port_name_t pset - ); - -extern kern_return_t _kernelrpc_mach_port_construct_trap( - mach_port_name_t target, - mach_port_options_t *options, - uint64_t context, - mach_port_name_t *name - ); - -extern kern_return_t _kernelrpc_mach_port_destruct_trap( - mach_port_name_t target, - mach_port_name_t name, - mach_port_delta_t srdelta, - uint64_t guard - ); - -extern kern_return_t _kernelrpc_mach_port_guard_trap( - mach_port_name_t target, - mach_port_name_t name, - uint64_t guard, - boolean_t strict - ); - -extern kern_return_t _kernelrpc_mach_port_unguard_trap( - mach_port_name_t target, - mach_port_name_t name, - uint64_t guard - ); - -extern kern_return_t mach_generate_activity_id( - mach_port_name_t target, - int count, - uint64_t *activity_id - ); - -extern kern_return_t macx_swapon( - uint64_t filename, - int flags, - int size, - int priority); - -extern kern_return_t macx_swapoff( - uint64_t filename, - int flags); - -extern kern_return_t macx_triggers( - int hi_water, - int low_water, - int flags, - mach_port_t alert_port); - -extern kern_return_t macx_backing_store_suspend( - boolean_t suspend); - -extern kern_return_t macx_backing_store_recovery( - int pid); - -extern boolean_t swtch_pri(int pri); - -extern boolean_t swtch(void); - -extern kern_return_t thread_switch( - mach_port_name_t thread_name, - int option, - mach_msg_timeout_t option_time); - -extern mach_port_name_t task_self_trap(void); - -extern kern_return_t host_create_mach_voucher_trap( - mach_port_name_t host, - mach_voucher_attr_raw_recipe_array_t recipes, - int recipes_size, - mach_port_name_t *voucher); - -extern kern_return_t mach_voucher_extract_attr_recipe_trap( - mach_port_name_t voucher_name, - mach_voucher_attr_key_t key, - mach_voucher_attr_raw_recipe_t recipe, - mach_msg_type_number_t *recipe_size); - -extern kern_return_t _kernelrpc_mach_port_type_trap( - ipc_space_t task, - mach_port_name_t name, - mach_port_type_t *ptype); - -extern kern_return_t _kernelrpc_mach_port_request_notification_trap( - ipc_space_t task, - mach_port_name_t name, - mach_msg_id_t msgid, - mach_port_mscount_t sync, - mach_port_name_t notify, - mach_msg_type_name_t notifyPoly, - mach_port_name_t *previous); - -/* - * Obsolete interfaces. - */ - -extern kern_return_t task_for_pid( - mach_port_name_t target_tport, - int pid, - mach_port_name_t *t); - -extern kern_return_t task_name_for_pid( - mach_port_name_t target_tport, - int pid, - mach_port_name_t *tn); - -extern kern_return_t pid_for_task( - mach_port_name_t t, - int *x); - -extern kern_return_t debug_control_port_for_pid( - mach_port_name_t target_tport, - int pid, - mach_port_name_t *t); - - -__END_DECLS - -#endif /* _MACH_MACH_TRAPS_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/mach_types.h b/lib/libc/include/x86_64-macos-gnu/mach/mach_types.h deleted file mode 100644 index 0c35705acf..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/mach_types.h +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Copyright (c) 2000-2018 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * @OSF_COPYRIGHT@ - */ -/* - * Mach Operating System - * Copyright (c) 1991,1990,1989,1988 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ -/* - */ -/* - * NOTICE: This file was modified by SPARTA, Inc. in 2005 to introduce - * support for mandatory and extensible security protections. This notice - * is included in support of clause 2.2 (b) of the Apple Public License, - * Version 2.0. - */ -/* - * File: mach/mach_types.h - * Author: Avadis Tevanian, Jr., Michael Wayne Young - * Date: 1986 - * - * Mach external interface definitions. - * - */ - -#ifndef _MACH_MACH_TYPES_H_ -#define _MACH_MACH_TYPES_H_ - -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -/* - * If we are not in the kernel, then these will all be represented by - * ports at user-space. - */ -typedef mach_port_t task_t; -typedef mach_port_t task_name_t; -typedef mach_port_t task_inspect_t; -typedef mach_port_t task_suspension_token_t; -typedef mach_port_t thread_t; -typedef mach_port_t thread_act_t; -typedef mach_port_t thread_inspect_t; -typedef mach_port_t ipc_space_t; -typedef mach_port_t ipc_space_inspect_t; -typedef mach_port_t coalition_t; -typedef mach_port_t host_t; -typedef mach_port_t host_priv_t; -typedef mach_port_t host_security_t; -typedef mach_port_t processor_t; -typedef mach_port_t processor_set_t; -typedef mach_port_t processor_set_control_t; -typedef mach_port_t semaphore_t; -typedef mach_port_t lock_set_t; -typedef mach_port_t ledger_t; -typedef mach_port_t alarm_t; -typedef mach_port_t clock_serv_t; -typedef mach_port_t clock_ctrl_t; -typedef mach_port_t arcade_register_t; -typedef mach_port_t suid_cred_t; - - -/* - * These aren't really unique types. They are just called - * out as unique types at one point in history. So we list - * them here for compatibility. - */ -typedef processor_set_t processor_set_name_t; - -/* - * These types are just hard-coded as ports - */ -typedef mach_port_t clock_reply_t; -typedef mach_port_t bootstrap_t; -typedef mach_port_t mem_entry_name_port_t; -typedef mach_port_t exception_handler_t; -typedef exception_handler_t *exception_handler_array_t; -typedef mach_port_t vm_task_entry_t; -typedef mach_port_t io_master_t; -typedef mach_port_t UNDServerRef; - -/* - * Mig doesn't translate the components of an array. - * For example, Mig won't use the thread_t translations - * to translate a thread_array_t argument. So, these definitions - * are not completely accurate at the moment for other kernel - * components. - */ -typedef task_t *task_array_t; -typedef thread_t *thread_array_t; -typedef processor_set_t *processor_set_array_t; -typedef processor_set_t *processor_set_name_array_t; -typedef processor_t *processor_array_t; -typedef thread_act_t *thread_act_array_t; -typedef ledger_t *ledger_array_t; - -/* - * However the real mach_types got declared, we also have to declare - * types with "port" in the name for compatability with the way OSF - * had declared the user interfaces at one point. Someday these should - * go away. - */ -typedef task_t task_port_t; -typedef task_array_t task_port_array_t; -typedef thread_t thread_port_t; -typedef thread_array_t thread_port_array_t; -typedef ipc_space_t ipc_space_port_t; -typedef host_t host_name_t; -typedef host_t host_name_port_t; -typedef processor_set_t processor_set_port_t; -typedef processor_set_t processor_set_name_port_t; -typedef processor_set_array_t processor_set_name_port_array_t; -typedef processor_set_t processor_set_control_port_t; -typedef processor_t processor_port_t; -typedef processor_array_t processor_port_array_t; -typedef thread_act_t thread_act_port_t; -typedef thread_act_array_t thread_act_port_array_t; -typedef semaphore_t semaphore_port_t; -typedef lock_set_t lock_set_port_t; -typedef ledger_t ledger_port_t; -typedef ledger_array_t ledger_port_array_t; -typedef alarm_t alarm_port_t; -typedef clock_serv_t clock_serv_port_t; -typedef clock_ctrl_t clock_ctrl_port_t; -typedef exception_handler_t exception_port_t; -typedef exception_handler_array_t exception_port_arrary_t; -typedef char vfs_path_t[4096]; -typedef char nspace_path_t[1024]; /* 1024 == PATH_MAX */ -typedef char suid_cred_path_t[1024]; -typedef uint32_t suid_cred_uid_t; - -#define TASK_NULL ((task_t) 0) -#define TASK_NAME_NULL ((task_name_t) 0) -#define TASK_INSPECT_NULL ((task_inspect_t) 0) -#define THREAD_NULL ((thread_t) 0) -#define THREAD_INSPECT_NULL ((thread_inspect_t) 0) -#define TID_NULL ((uint64_t) 0) -#define THR_ACT_NULL ((thread_act_t) 0) -#define IPC_SPACE_NULL ((ipc_space_t) 0) -#define IPC_SPACE_INSPECT_NULL ((ipc_space_inspect_t) 0) -#define COALITION_NULL ((coalition_t) 0) -#define HOST_NULL ((host_t) 0) -#define HOST_PRIV_NULL ((host_priv_t) 0) -#define HOST_SECURITY_NULL ((host_security_t) 0) -#define PROCESSOR_SET_NULL ((processor_set_t) 0) -#define PROCESSOR_NULL ((processor_t) 0) -#define SEMAPHORE_NULL ((semaphore_t) 0) -#define LOCK_SET_NULL ((lock_set_t) 0) -#define LEDGER_NULL ((ledger_t) 0) -#define ALARM_NULL ((alarm_t) 0) -#define CLOCK_NULL ((clock_t) 0) -#define UND_SERVER_NULL ((UNDServerRef) 0) -#define ARCADE_REG_NULL ((arcade_register_t) 0) -#define SUID_CRED_NULL ((suid_cred_t) 0) - -/* DEPRECATED */ -typedef natural_t ledger_item_t; -#define LEDGER_ITEM_INFINITY ((ledger_item_t) (~0)) - -typedef int64_t ledger_amount_t; -#define LEDGER_LIMIT_INFINITY ((ledger_amount_t)((1ULL << 63) - 1)) - -typedef mach_vm_offset_t *emulation_vector_t; -typedef char *user_subsystem_t; - -typedef char *labelstr_t; -/* - * Backwards compatibility, for those programs written - * before mach/{std,mach}_types.{defs,h} were set up. - */ -#include - -#endif /* _MACH_MACH_TYPES_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/machine.h b/lib/libc/include/x86_64-macos-gnu/mach/machine.h deleted file mode 100644 index 30aafcc812..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/machine.h +++ /dev/null @@ -1,395 +0,0 @@ -/* - * Copyright (c) 2007-2016 Apple, Inc. All rights reserved. - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * Mach Operating System - * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ -/* File: machine.h - * Author: Avadis Tevanian, Jr. - * Date: 1986 - * - * Machine independent machine abstraction. - */ - -#ifndef _MACH_MACHINE_H_ -#define _MACH_MACHINE_H_ - -#ifndef __ASSEMBLER__ - -#include -#include -#include - -typedef integer_t cpu_type_t; -typedef integer_t cpu_subtype_t; -typedef integer_t cpu_threadtype_t; - -#define CPU_STATE_MAX 4 - -#define CPU_STATE_USER 0 -#define CPU_STATE_SYSTEM 1 -#define CPU_STATE_IDLE 2 -#define CPU_STATE_NICE 3 - - - -/* - * Capability bits used in the definition of cpu_type. - */ -#define CPU_ARCH_MASK 0xff000000 /* mask for architecture bits */ -#define CPU_ARCH_ABI64 0x01000000 /* 64 bit ABI */ -#define CPU_ARCH_ABI64_32 0x02000000 /* ABI for 64-bit hardware with 32-bit types; LP32 */ - -/* - * Machine types known by all. - */ - -#define CPU_TYPE_ANY ((cpu_type_t) -1) - -#define CPU_TYPE_VAX ((cpu_type_t) 1) -/* skip ((cpu_type_t) 2) */ -/* skip ((cpu_type_t) 3) */ -/* skip ((cpu_type_t) 4) */ -/* skip ((cpu_type_t) 5) */ -#define CPU_TYPE_MC680x0 ((cpu_type_t) 6) -#define CPU_TYPE_X86 ((cpu_type_t) 7) -#define CPU_TYPE_I386 CPU_TYPE_X86 /* compatibility */ -#define CPU_TYPE_X86_64 (CPU_TYPE_X86 | CPU_ARCH_ABI64) - -/* skip CPU_TYPE_MIPS ((cpu_type_t) 8) */ -/* skip ((cpu_type_t) 9) */ -#define CPU_TYPE_MC98000 ((cpu_type_t) 10) -#define CPU_TYPE_HPPA ((cpu_type_t) 11) -#define CPU_TYPE_ARM ((cpu_type_t) 12) -#define CPU_TYPE_ARM64 (CPU_TYPE_ARM | CPU_ARCH_ABI64) -#define CPU_TYPE_ARM64_32 (CPU_TYPE_ARM | CPU_ARCH_ABI64_32) -#define CPU_TYPE_MC88000 ((cpu_type_t) 13) -#define CPU_TYPE_SPARC ((cpu_type_t) 14) -#define CPU_TYPE_I860 ((cpu_type_t) 15) -/* skip CPU_TYPE_ALPHA ((cpu_type_t) 16) */ -/* skip ((cpu_type_t) 17) */ -#define CPU_TYPE_POWERPC ((cpu_type_t) 18) -#define CPU_TYPE_POWERPC64 (CPU_TYPE_POWERPC | CPU_ARCH_ABI64) -/* skip ((cpu_type_t) 19) */ - -/* - * Machine subtypes (these are defined here, instead of in a machine - * dependent directory, so that any program can get all definitions - * regardless of where is it compiled). - */ - -/* - * Capability bits used in the definition of cpu_subtype. - */ -#define CPU_SUBTYPE_MASK 0xff000000 /* mask for feature flags */ -#define CPU_SUBTYPE_LIB64 0x80000000 /* 64 bit libraries */ - - -/* - * Object files that are hand-crafted to run on any - * implementation of an architecture are tagged with - * CPU_SUBTYPE_MULTIPLE. This functions essentially the same as - * the "ALL" subtype of an architecture except that it allows us - * to easily find object files that may need to be modified - * whenever a new implementation of an architecture comes out. - * - * It is the responsibility of the implementor to make sure the - * software handles unsupported implementations elegantly. - */ -#define CPU_SUBTYPE_MULTIPLE ((cpu_subtype_t) -1) -#define CPU_SUBTYPE_LITTLE_ENDIAN ((cpu_subtype_t) 0) -#define CPU_SUBTYPE_BIG_ENDIAN ((cpu_subtype_t) 1) - -/* - * Machine threadtypes. - * This is none - not defined - for most machine types/subtypes. - */ -#define CPU_THREADTYPE_NONE ((cpu_threadtype_t) 0) - -/* - * VAX subtypes (these do *not* necessary conform to the actual cpu - * ID assigned by DEC available via the SID register). - */ - -#define CPU_SUBTYPE_VAX_ALL ((cpu_subtype_t) 0) -#define CPU_SUBTYPE_VAX780 ((cpu_subtype_t) 1) -#define CPU_SUBTYPE_VAX785 ((cpu_subtype_t) 2) -#define CPU_SUBTYPE_VAX750 ((cpu_subtype_t) 3) -#define CPU_SUBTYPE_VAX730 ((cpu_subtype_t) 4) -#define CPU_SUBTYPE_UVAXI ((cpu_subtype_t) 5) -#define CPU_SUBTYPE_UVAXII ((cpu_subtype_t) 6) -#define CPU_SUBTYPE_VAX8200 ((cpu_subtype_t) 7) -#define CPU_SUBTYPE_VAX8500 ((cpu_subtype_t) 8) -#define CPU_SUBTYPE_VAX8600 ((cpu_subtype_t) 9) -#define CPU_SUBTYPE_VAX8650 ((cpu_subtype_t) 10) -#define CPU_SUBTYPE_VAX8800 ((cpu_subtype_t) 11) -#define CPU_SUBTYPE_UVAXIII ((cpu_subtype_t) 12) - -/* - * 680x0 subtypes - * - * The subtype definitions here are unusual for historical reasons. - * NeXT used to consider 68030 code as generic 68000 code. For - * backwards compatability: - * - * CPU_SUBTYPE_MC68030 symbol has been preserved for source code - * compatability. - * - * CPU_SUBTYPE_MC680x0_ALL has been defined to be the same - * subtype as CPU_SUBTYPE_MC68030 for binary comatability. - * - * CPU_SUBTYPE_MC68030_ONLY has been added to allow new object - * files to be tagged as containing 68030-specific instructions. - */ - -#define CPU_SUBTYPE_MC680x0_ALL ((cpu_subtype_t) 1) -#define CPU_SUBTYPE_MC68030 ((cpu_subtype_t) 1) /* compat */ -#define CPU_SUBTYPE_MC68040 ((cpu_subtype_t) 2) -#define CPU_SUBTYPE_MC68030_ONLY ((cpu_subtype_t) 3) - -/* - * I386 subtypes - */ - -#define CPU_SUBTYPE_INTEL(f, m) ((cpu_subtype_t) (f) + ((m) << 4)) - -#define CPU_SUBTYPE_I386_ALL CPU_SUBTYPE_INTEL(3, 0) -#define CPU_SUBTYPE_386 CPU_SUBTYPE_INTEL(3, 0) -#define CPU_SUBTYPE_486 CPU_SUBTYPE_INTEL(4, 0) -#define CPU_SUBTYPE_486SX CPU_SUBTYPE_INTEL(4, 8) // 8 << 4 = 128 -#define CPU_SUBTYPE_586 CPU_SUBTYPE_INTEL(5, 0) -#define CPU_SUBTYPE_PENT CPU_SUBTYPE_INTEL(5, 0) -#define CPU_SUBTYPE_PENTPRO CPU_SUBTYPE_INTEL(6, 1) -#define CPU_SUBTYPE_PENTII_M3 CPU_SUBTYPE_INTEL(6, 3) -#define CPU_SUBTYPE_PENTII_M5 CPU_SUBTYPE_INTEL(6, 5) -#define CPU_SUBTYPE_CELERON CPU_SUBTYPE_INTEL(7, 6) -#define CPU_SUBTYPE_CELERON_MOBILE CPU_SUBTYPE_INTEL(7, 7) -#define CPU_SUBTYPE_PENTIUM_3 CPU_SUBTYPE_INTEL(8, 0) -#define CPU_SUBTYPE_PENTIUM_3_M CPU_SUBTYPE_INTEL(8, 1) -#define CPU_SUBTYPE_PENTIUM_3_XEON CPU_SUBTYPE_INTEL(8, 2) -#define CPU_SUBTYPE_PENTIUM_M CPU_SUBTYPE_INTEL(9, 0) -#define CPU_SUBTYPE_PENTIUM_4 CPU_SUBTYPE_INTEL(10, 0) -#define CPU_SUBTYPE_PENTIUM_4_M CPU_SUBTYPE_INTEL(10, 1) -#define CPU_SUBTYPE_ITANIUM CPU_SUBTYPE_INTEL(11, 0) -#define CPU_SUBTYPE_ITANIUM_2 CPU_SUBTYPE_INTEL(11, 1) -#define CPU_SUBTYPE_XEON CPU_SUBTYPE_INTEL(12, 0) -#define CPU_SUBTYPE_XEON_MP CPU_SUBTYPE_INTEL(12, 1) - -#define CPU_SUBTYPE_INTEL_FAMILY(x) ((x) & 15) -#define CPU_SUBTYPE_INTEL_FAMILY_MAX 15 - -#define CPU_SUBTYPE_INTEL_MODEL(x) ((x) >> 4) -#define CPU_SUBTYPE_INTEL_MODEL_ALL 0 - -/* - * X86 subtypes. - */ - -#define CPU_SUBTYPE_X86_ALL ((cpu_subtype_t)3) -#define CPU_SUBTYPE_X86_64_ALL ((cpu_subtype_t)3) -#define CPU_SUBTYPE_X86_ARCH1 ((cpu_subtype_t)4) -#define CPU_SUBTYPE_X86_64_H ((cpu_subtype_t)8) /* Haswell feature subset */ - - -#define CPU_THREADTYPE_INTEL_HTT ((cpu_threadtype_t) 1) - -/* - * Mips subtypes. - */ - -#define CPU_SUBTYPE_MIPS_ALL ((cpu_subtype_t) 0) -#define CPU_SUBTYPE_MIPS_R2300 ((cpu_subtype_t) 1) -#define CPU_SUBTYPE_MIPS_R2600 ((cpu_subtype_t) 2) -#define CPU_SUBTYPE_MIPS_R2800 ((cpu_subtype_t) 3) -#define CPU_SUBTYPE_MIPS_R2000a ((cpu_subtype_t) 4) /* pmax */ -#define CPU_SUBTYPE_MIPS_R2000 ((cpu_subtype_t) 5) -#define CPU_SUBTYPE_MIPS_R3000a ((cpu_subtype_t) 6) /* 3max */ -#define CPU_SUBTYPE_MIPS_R3000 ((cpu_subtype_t) 7) - -/* - * MC98000 (PowerPC) subtypes - */ -#define CPU_SUBTYPE_MC98000_ALL ((cpu_subtype_t) 0) -#define CPU_SUBTYPE_MC98601 ((cpu_subtype_t) 1) - -/* - * HPPA subtypes for Hewlett-Packard HP-PA family of - * risc processors. Port by NeXT to 700 series. - */ - -#define CPU_SUBTYPE_HPPA_ALL ((cpu_subtype_t) 0) -#define CPU_SUBTYPE_HPPA_7100 ((cpu_subtype_t) 0) /* compat */ -#define CPU_SUBTYPE_HPPA_7100LC ((cpu_subtype_t) 1) - -/* - * MC88000 subtypes. - */ -#define CPU_SUBTYPE_MC88000_ALL ((cpu_subtype_t) 0) -#define CPU_SUBTYPE_MC88100 ((cpu_subtype_t) 1) -#define CPU_SUBTYPE_MC88110 ((cpu_subtype_t) 2) - -/* - * SPARC subtypes - */ -#define CPU_SUBTYPE_SPARC_ALL ((cpu_subtype_t) 0) - -/* - * I860 subtypes - */ -#define CPU_SUBTYPE_I860_ALL ((cpu_subtype_t) 0) -#define CPU_SUBTYPE_I860_860 ((cpu_subtype_t) 1) - -/* - * PowerPC subtypes - */ -#define CPU_SUBTYPE_POWERPC_ALL ((cpu_subtype_t) 0) -#define CPU_SUBTYPE_POWERPC_601 ((cpu_subtype_t) 1) -#define CPU_SUBTYPE_POWERPC_602 ((cpu_subtype_t) 2) -#define CPU_SUBTYPE_POWERPC_603 ((cpu_subtype_t) 3) -#define CPU_SUBTYPE_POWERPC_603e ((cpu_subtype_t) 4) -#define CPU_SUBTYPE_POWERPC_603ev ((cpu_subtype_t) 5) -#define CPU_SUBTYPE_POWERPC_604 ((cpu_subtype_t) 6) -#define CPU_SUBTYPE_POWERPC_604e ((cpu_subtype_t) 7) -#define CPU_SUBTYPE_POWERPC_620 ((cpu_subtype_t) 8) -#define CPU_SUBTYPE_POWERPC_750 ((cpu_subtype_t) 9) -#define CPU_SUBTYPE_POWERPC_7400 ((cpu_subtype_t) 10) -#define CPU_SUBTYPE_POWERPC_7450 ((cpu_subtype_t) 11) -#define CPU_SUBTYPE_POWERPC_970 ((cpu_subtype_t) 100) - -/* - * ARM subtypes - */ -#define CPU_SUBTYPE_ARM_ALL ((cpu_subtype_t) 0) -#define CPU_SUBTYPE_ARM_V4T ((cpu_subtype_t) 5) -#define CPU_SUBTYPE_ARM_V6 ((cpu_subtype_t) 6) -#define CPU_SUBTYPE_ARM_V5TEJ ((cpu_subtype_t) 7) -#define CPU_SUBTYPE_ARM_XSCALE ((cpu_subtype_t) 8) -#define CPU_SUBTYPE_ARM_V7 ((cpu_subtype_t) 9) /* ARMv7-A and ARMv7-R */ -#define CPU_SUBTYPE_ARM_V7F ((cpu_subtype_t) 10) /* Cortex A9 */ -#define CPU_SUBTYPE_ARM_V7S ((cpu_subtype_t) 11) /* Swift */ -#define CPU_SUBTYPE_ARM_V7K ((cpu_subtype_t) 12) -#define CPU_SUBTYPE_ARM_V8 ((cpu_subtype_t) 13) -#define CPU_SUBTYPE_ARM_V6M ((cpu_subtype_t) 14) /* Not meant to be run under xnu */ -#define CPU_SUBTYPE_ARM_V7M ((cpu_subtype_t) 15) /* Not meant to be run under xnu */ -#define CPU_SUBTYPE_ARM_V7EM ((cpu_subtype_t) 16) /* Not meant to be run under xnu */ -#define CPU_SUBTYPE_ARM_V8M ((cpu_subtype_t) 17) /* Not meant to be run under xnu */ - -/* - * ARM64 subtypes - */ -#define CPU_SUBTYPE_ARM64_ALL ((cpu_subtype_t) 0) -#define CPU_SUBTYPE_ARM64_V8 ((cpu_subtype_t) 1) -#define CPU_SUBTYPE_ARM64E ((cpu_subtype_t) 2) - -/* CPU subtype feature flags for ptrauth on arm64e platforms */ -#define CPU_SUBTYPE_ARM64_PTR_AUTH_MASK 0x0f000000 -#define CPU_SUBTYPE_ARM64_PTR_AUTH_VERSION(x) (((x) & CPU_SUBTYPE_ARM64_PTR_AUTH_MASK) >> 24) - -/* - * ARM64_32 subtypes - */ -#define CPU_SUBTYPE_ARM64_32_ALL ((cpu_subtype_t) 0) -#define CPU_SUBTYPE_ARM64_32_V8 ((cpu_subtype_t) 1) - -#endif /* !__ASSEMBLER__ */ - -/* - * CPU families (sysctl hw.cpufamily) - * - * These are meant to identify the CPU's marketing name - an - * application can map these to (possibly) localized strings. - * NB: the encodings of the CPU families are intentionally arbitrary. - * There is no ordering, and you should never try to deduce whether - * or not some feature is available based on the family. - * Use feature flags (eg, hw.optional.altivec) to test for optional - * functionality. - */ -#define CPUFAMILY_UNKNOWN 0 -#define CPUFAMILY_POWERPC_G3 0xcee41549 -#define CPUFAMILY_POWERPC_G4 0x77c184ae -#define CPUFAMILY_POWERPC_G5 0xed76d8aa -#define CPUFAMILY_INTEL_6_13 0xaa33392b -#define CPUFAMILY_INTEL_PENRYN 0x78ea4fbc -#define CPUFAMILY_INTEL_NEHALEM 0x6b5a4cd2 -#define CPUFAMILY_INTEL_WESTMERE 0x573b5eec -#define CPUFAMILY_INTEL_SANDYBRIDGE 0x5490b78c -#define CPUFAMILY_INTEL_IVYBRIDGE 0x1f65e835 -#define CPUFAMILY_INTEL_HASWELL 0x10b282dc -#define CPUFAMILY_INTEL_BROADWELL 0x582ed09c -#define CPUFAMILY_INTEL_SKYLAKE 0x37fc219f -#define CPUFAMILY_INTEL_KABYLAKE 0x0f817246 -#if !defined(RC_HIDE_XNU_ICELAKE) -#define CPUFAMILY_INTEL_ICELAKE 0x38435547 -#endif /* not RC_HIDE_XNU_ICELAKE */ -#if !defined(RC_HIDE_XNU_COMETLAKE) -#define CPUFAMILY_INTEL_COMETLAKE 0x1cf8a03e -#endif /* not RC_HIDE_XNU_COMETLAKE */ -#define CPUFAMILY_ARM_9 0xe73283ae -#define CPUFAMILY_ARM_11 0x8ff620d8 -#define CPUFAMILY_ARM_XSCALE 0x53b005f5 -#define CPUFAMILY_ARM_12 0xbd1b0ae9 -#define CPUFAMILY_ARM_13 0x0cc90e64 -#define CPUFAMILY_ARM_14 0x96077ef1 -#define CPUFAMILY_ARM_15 0xa8511bca -#define CPUFAMILY_ARM_SWIFT 0x1e2d6381 -#define CPUFAMILY_ARM_CYCLONE 0x37a09642 -#define CPUFAMILY_ARM_TYPHOON 0x2c91a47e -#define CPUFAMILY_ARM_TWISTER 0x92fb37c8 -#define CPUFAMILY_ARM_HURRICANE 0x67ceee93 -#define CPUFAMILY_ARM_MONSOON_MISTRAL 0xe81e7ef6 -#define CPUFAMILY_ARM_VORTEX_TEMPEST 0x07d34b9f -#define CPUFAMILY_ARM_LIGHTNING_THUNDER 0x462504d2 - -/* The following synonyms are deprecated: */ -#define CPUFAMILY_INTEL_6_23 CPUFAMILY_INTEL_PENRYN -#define CPUFAMILY_INTEL_6_26 CPUFAMILY_INTEL_NEHALEM - - -#endif /* _MACH_MACHINE_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/machine/_structs.h b/lib/libc/include/x86_64-macos-gnu/mach/machine/_structs.h deleted file mode 100644 index 0a61125417..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/machine/_structs.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2017 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ - -#ifndef _MACH_MACHINE__STRUCTS_H_ -#define _MACH_MACHINE__STRUCTS_H_ - -#if defined (__i386__) || defined(__x86_64__) -#include "mach/i386/_structs.h" -#else -#error architecture not supported -#endif - -#endif /* _MACH_MACHINE__STRUCTS_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/machine/boolean.h b/lib/libc/include/x86_64-macos-gnu/mach/machine/boolean.h deleted file mode 100644 index d373913b40..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/machine/boolean.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2000-2007 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ - -#ifndef _MACH_MACHINE_BOOLEAN_H_ -#define _MACH_MACHINE_BOOLEAN_H_ - -#if defined (__i386__) || defined(__x86_64__) -#include "mach/i386/boolean.h" -#else -#error architecture not supported -#endif - -#endif /* _MACH_MACHINE_BOOLEAN_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/machine/exception.h b/lib/libc/include/x86_64-macos-gnu/mach/machine/exception.h deleted file mode 100644 index f3e960d436..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/machine/exception.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2000-2007 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ - -#ifndef _MACH_MACHINE_EXCEPTION_H_ -#define _MACH_MACHINE_EXCEPTION_H_ - -#if defined (__i386__) || defined(__x86_64__) -#include "mach/i386/exception.h" -#else -#error architecture not supported -#endif - -#endif /* _MACH_MACHINE_EXCEPTION_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/machine/kern_return.h b/lib/libc/include/x86_64-macos-gnu/mach/machine/kern_return.h deleted file mode 100644 index b764492d29..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/machine/kern_return.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2000-2007 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ - -#ifndef _MACH_MACHINE_KERN_RETURN_H_ -#define _MACH_MACHINE_KERN_RETURN_H_ - -#if defined (__i386__) || defined(__x86_64__) -#include "mach/i386/kern_return.h" -#else -#error architecture not supported -#endif - -#endif /* _MACH_MACHINE_KERN_RETURN_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/machine/processor_info.h b/lib/libc/include/x86_64-macos-gnu/mach/machine/processor_info.h deleted file mode 100644 index 4e5028d24d..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/machine/processor_info.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2000-2007 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ - -#ifndef _MACH_MACHINE_PROCESSOR_INFO_H_ -#define _MACH_MACHINE_PROCESSOR_INFO_H_ - -#if defined (__i386__) || defined(__x86_64__) -#include "mach/i386/processor_info.h" -#else -#error architecture not supported -#endif - -#endif /* _MACH_MACHINE_PROCESSOR_INFO_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/machine/rpc.h b/lib/libc/include/x86_64-macos-gnu/mach/machine/rpc.h deleted file mode 100644 index 7d6ccee5f8..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/machine/rpc.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2000-2007 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ - -#ifndef _MACH_MACHINE_RPC_H_ -#define _MACH_MACHINE_RPC_H_ - -#if defined (__i386__) || defined(__x86_64__) -#include "mach/i386/rpc.h" -#else -#error architecture not supported -#endif - -#endif /* _MACH_MACHINE_RPC_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/machine/thread_state.h b/lib/libc/include/x86_64-macos-gnu/mach/machine/thread_state.h deleted file mode 100644 index 91daad8671..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/machine/thread_state.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2000-2007 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ - -#ifndef _MACH_MACHINE_THREAD_STATE_H_ -#define _MACH_MACHINE_THREAD_STATE_H_ - -#if defined (__i386__) || defined(__x86_64__) -#include "mach/i386/thread_state.h" -#else -#error architecture not supported -#endif - -#endif /* _MACH_MACHINE_THREAD_STATE_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/machine/thread_status.h b/lib/libc/include/x86_64-macos-gnu/mach/machine/thread_status.h deleted file mode 100644 index 7e65df246e..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/machine/thread_status.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2000-2007 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ - -#ifndef _MACH_MACHINE_THREAD_STATUS_H_ -#define _MACH_MACHINE_THREAD_STATUS_H_ - -#if defined (__i386__) || defined(__x86_64__) -#include "mach/i386/thread_status.h" -#else -#error architecture not supported -#endif - -#endif /* _MACH_MACHINE_THREAD_STATUS_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/machine/vm_param.h b/lib/libc/include/x86_64-macos-gnu/mach/machine/vm_param.h deleted file mode 100644 index 7f272f5b70..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/machine/vm_param.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2000-2007 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ - -#ifndef _MACH_MACHINE_VM_PARAM_H_ -#define _MACH_MACHINE_VM_PARAM_H_ - -#if defined (__i386__) || defined(__x86_64__) -#include "mach/i386/vm_param.h" -#else -#error architecture not supported -#endif - -#endif /* _MACH_MACHINE_VM_PARAM_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/machine/vm_types.h b/lib/libc/include/x86_64-macos-gnu/mach/machine/vm_types.h deleted file mode 100644 index 5d16a871ea..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/machine/vm_types.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2000-2007 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ - -#ifndef _MACH_MACHINE_VM_TYPES_H_ -#define _MACH_MACHINE_VM_TYPES_H_ - -#if defined (__i386__) || defined(__x86_64__) -#include "mach/i386/vm_types.h" -#else -#error architecture not supported -#endif - -#endif /* _MACH_MACHINE_VM_TYPES_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/memory_object_types.h b/lib/libc/include/x86_64-macos-gnu/mach/memory_object_types.h deleted file mode 100644 index fec6e53593..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/memory_object_types.h +++ /dev/null @@ -1,299 +0,0 @@ -/* - * Copyright (c) 2000-2016 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * @OSF_COPYRIGHT@ - */ -/* - * Mach Operating System - * Copyright (c) 1991,1990,1989,1988 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ -/* - */ -/* - * File: memory_object.h - * Author: Michael Wayne Young - * - * External memory management interface definition. - */ - -#ifndef _MACH_MEMORY_OBJECT_TYPES_H_ -#define _MACH_MEMORY_OBJECT_TYPES_H_ - -/* - * User-visible types used in the external memory - * management interface: - */ - -#include -#include -#include -#include -#include -#include - -#include - -#define VM_64_BIT_DATA_OBJECTS - -typedef unsigned long long memory_object_offset_t; -typedef unsigned long long memory_object_size_t; -typedef natural_t memory_object_cluster_size_t; -typedef natural_t * memory_object_fault_info_t; - -typedef unsigned long long vm_object_id_t; - - -/* - * Temporary until real EMMI version gets re-implemented - */ - - -typedef mach_port_t memory_object_t; -typedef mach_port_t memory_object_control_t; - - -typedef memory_object_t *memory_object_array_t; -/* A memory object ... */ -/* Used by the kernel to retrieve */ -/* or store data */ - -typedef mach_port_t memory_object_name_t; -/* Used to describe the memory ... */ -/* object in vm_regions() calls */ - -typedef mach_port_t memory_object_default_t; -/* Registered with the host ... */ -/* for creating new internal objects */ - -#define MEMORY_OBJECT_NULL ((memory_object_t) 0) -#define MEMORY_OBJECT_CONTROL_NULL ((memory_object_control_t) 0) -#define MEMORY_OBJECT_NAME_NULL ((memory_object_name_t) 0) -#define MEMORY_OBJECT_DEFAULT_NULL ((memory_object_default_t) 0) - - -typedef int memory_object_copy_strategy_t; -/* How memory manager handles copy: */ -#define MEMORY_OBJECT_COPY_NONE 0 -/* ... No special support */ -#define MEMORY_OBJECT_COPY_CALL 1 -/* ... Make call on memory manager */ -#define MEMORY_OBJECT_COPY_DELAY 2 -/* ... Memory manager doesn't - * change data externally. - */ -#define MEMORY_OBJECT_COPY_TEMPORARY 3 -/* ... Memory manager doesn't - * change data externally, and - * doesn't need to see changes. - */ -#define MEMORY_OBJECT_COPY_SYMMETRIC 4 -/* ... Memory manager doesn't - * change data externally, - * doesn't need to see changes, - * and object will not be - * multiply mapped. - * - * XXX - * Not yet safe for non-kernel use. - */ - -#define MEMORY_OBJECT_COPY_INVALID 5 -/* ... An invalid copy strategy, - * for external objects which - * have not been initialized. - * Allows copy_strategy to be - * examined without also - * examining pager_ready and - * internal. - */ - -typedef int memory_object_return_t; -/* Which pages to return to manager - * this time (lock_request) */ -#define MEMORY_OBJECT_RETURN_NONE 0 -/* ... don't return any. */ -#define MEMORY_OBJECT_RETURN_DIRTY 1 -/* ... only dirty pages. */ -#define MEMORY_OBJECT_RETURN_ALL 2 -/* ... dirty and precious pages. */ -#define MEMORY_OBJECT_RETURN_ANYTHING 3 -/* ... any resident page. */ - -/* - * Data lock request flags - */ - -#define MEMORY_OBJECT_DATA_FLUSH 0x1 -#define MEMORY_OBJECT_DATA_NO_CHANGE 0x2 -#define MEMORY_OBJECT_DATA_PURGE 0x4 -#define MEMORY_OBJECT_COPY_SYNC 0x8 -#define MEMORY_OBJECT_DATA_SYNC 0x10 -#define MEMORY_OBJECT_IO_SYNC 0x20 -#define MEMORY_OBJECT_DATA_FLUSH_ALL 0x40 - -/* - * Types for the memory object flavor interfaces - */ - -#define MEMORY_OBJECT_INFO_MAX (1024) -typedef int *memory_object_info_t; -typedef int memory_object_flavor_t; -typedef int memory_object_info_data_t[MEMORY_OBJECT_INFO_MAX]; - - -#define MEMORY_OBJECT_PERFORMANCE_INFO 11 -#define MEMORY_OBJECT_ATTRIBUTE_INFO 14 -#define MEMORY_OBJECT_BEHAVIOR_INFO 15 - - -struct memory_object_perf_info { - memory_object_cluster_size_t cluster_size; - boolean_t may_cache; -}; - -struct memory_object_attr_info { - memory_object_copy_strategy_t copy_strategy; - memory_object_cluster_size_t cluster_size; - boolean_t may_cache_object; - boolean_t temporary; -}; - -struct memory_object_behave_info { - memory_object_copy_strategy_t copy_strategy; - boolean_t temporary; - boolean_t invalidate; - boolean_t silent_overwrite; - boolean_t advisory_pageout; -}; - - -typedef struct memory_object_behave_info *memory_object_behave_info_t; -typedef struct memory_object_behave_info memory_object_behave_info_data_t; - -typedef struct memory_object_perf_info *memory_object_perf_info_t; -typedef struct memory_object_perf_info memory_object_perf_info_data_t; - -typedef struct memory_object_attr_info *memory_object_attr_info_t; -typedef struct memory_object_attr_info memory_object_attr_info_data_t; - -#define MEMORY_OBJECT_BEHAVE_INFO_COUNT ((mach_msg_type_number_t) \ - (sizeof(memory_object_behave_info_data_t)/sizeof(int))) -#define MEMORY_OBJECT_PERF_INFO_COUNT ((mach_msg_type_number_t) \ - (sizeof(memory_object_perf_info_data_t)/sizeof(int))) -#define MEMORY_OBJECT_ATTR_INFO_COUNT ((mach_msg_type_number_t) \ - (sizeof(memory_object_attr_info_data_t)/sizeof(int))) - -#define invalid_memory_object_flavor(f) \ - (f != MEMORY_OBJECT_ATTRIBUTE_INFO && \ - f != MEMORY_OBJECT_PERFORMANCE_INFO && \ - f != OLD_MEMORY_OBJECT_BEHAVIOR_INFO && \ - f != MEMORY_OBJECT_BEHAVIOR_INFO && \ - f != OLD_MEMORY_OBJECT_ATTRIBUTE_INFO) - - -/* - * Used to support options on memory_object_release_name call - */ -#define MEMORY_OBJECT_TERMINATE_IDLE 0x1 -#define MEMORY_OBJECT_RESPECT_CACHE 0x2 -#define MEMORY_OBJECT_RELEASE_NO_OP 0x4 - - -/* named entry processor mapping options */ -/* enumerated */ -#define MAP_MEM_NOOP 0 -#define MAP_MEM_COPYBACK 1 -#define MAP_MEM_IO 2 -#define MAP_MEM_WTHRU 3 -#define MAP_MEM_WCOMB 4 /* Write combining mode */ - /* aka store gather */ -#define MAP_MEM_INNERWBACK 5 -#define MAP_MEM_POSTED 6 -#define MAP_MEM_RT 7 -#define MAP_MEM_POSTED_REORDERED 8 -#define MAP_MEM_POSTED_COMBINED_REORDERED 9 - -#define GET_MAP_MEM(flags) \ - ((((unsigned int)(flags)) >> 24) & 0xFF) - -#define SET_MAP_MEM(caching, flags) \ - ((flags) = ((((unsigned int)(caching)) << 24) \ - & 0xFF000000) | ((flags) & 0xFFFFFF)); - -/* leave room for vm_prot bits (0xFF ?) */ -#define MAP_MEM_LEDGER_TAGGED 0x002000 /* object owned by a specific task and ledger */ -#define MAP_MEM_PURGABLE_KERNEL_ONLY 0x004000 /* volatility controlled by kernel */ -#define MAP_MEM_GRAB_SECLUDED 0x008000 /* can grab secluded pages */ -#define MAP_MEM_ONLY 0x010000 /* change processor caching */ -#define MAP_MEM_NAMED_CREATE 0x020000 /* create extant object */ -#define MAP_MEM_PURGABLE 0x040000 /* create a purgable VM object */ -#define MAP_MEM_NAMED_REUSE 0x080000 /* reuse provided entry if identical */ -#define MAP_MEM_USE_DATA_ADDR 0x100000 /* preserve address of data, rather than base of page */ -#define MAP_MEM_VM_COPY 0x200000 /* make a copy of a VM range */ -#define MAP_MEM_VM_SHARE 0x400000 /* extract a VM range for remap */ -#define MAP_MEM_4K_DATA_ADDR 0x800000 /* preserve 4K aligned address of data */ - -#define MAP_MEM_FLAGS_MASK 0x00FFFF00 -#define MAP_MEM_FLAGS_USER ( \ - MAP_MEM_PURGABLE_KERNEL_ONLY | \ - MAP_MEM_GRAB_SECLUDED | \ - MAP_MEM_ONLY | \ - MAP_MEM_NAMED_CREATE | \ - MAP_MEM_PURGABLE | \ - MAP_MEM_NAMED_REUSE | \ - MAP_MEM_USE_DATA_ADDR | \ - MAP_MEM_VM_COPY | \ - MAP_MEM_VM_SHARE | \ - MAP_MEM_LEDGER_TAGGED | \ - MAP_MEM_4K_DATA_ADDR) -#define MAP_MEM_FLAGS_ALL ( \ - MAP_MEM_FLAGS_USER) - - -#endif /* _MACH_MEMORY_OBJECT_TYPES_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/message.h b/lib/libc/include/x86_64-macos-gnu/mach/message.h deleted file mode 100644 index 3f9f9a0605..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/message.h +++ /dev/null @@ -1,902 +0,0 @@ -/* - * Copyright (c) 2000-2005 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * @OSF_COPYRIGHT@ - */ -/* - * Mach Operating System - * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ -/* - * NOTICE: This file was modified by McAfee Research in 2004 to introduce - * support for mandatory and extensible security protections. This notice - * is included in support of clause 2.2 (b) of the Apple Public License, - * Version 2.0. - * Copyright (c) 2005 SPARTA, Inc. - */ -/* - */ -/* - * File: mach/message.h - * - * Mach IPC message and primitive function definitions. - */ - -#ifndef _MACH_MESSAGE_H_ -#define _MACH_MESSAGE_H_ - -#include -#include -#include -#include -#include - -#include -#include -#include - -/* - * The timeout mechanism uses mach_msg_timeout_t values, - * passed by value. The timeout units are milliseconds. - * It is controlled with the MACH_SEND_TIMEOUT - * and MACH_RCV_TIMEOUT options. - */ - -typedef natural_t mach_msg_timeout_t; - -/* - * The value to be used when there is no timeout. - * (No MACH_SEND_TIMEOUT/MACH_RCV_TIMEOUT option.) - */ - -#define MACH_MSG_TIMEOUT_NONE ((mach_msg_timeout_t) 0) - -/* - * The kernel uses MACH_MSGH_BITS_COMPLEX as a hint. If it isn't on, it - * assumes the body of the message doesn't contain port rights or OOL - * data. The field is set in received messages. A user task must - * use caution in interpreting the body of a message if the bit isn't - * on, because the mach_msg_type's in the body might "lie" about the - * contents. If the bit isn't on, but the mach_msg_types - * in the body specify rights or OOL data, the behavior is undefined. - * (Ie, an error may or may not be produced.) - * - * The value of MACH_MSGH_BITS_REMOTE determines the interpretation - * of the msgh_remote_port field. It is handled like a msgt_name, - * but must result in a send or send-once type right. - * - * The value of MACH_MSGH_BITS_LOCAL determines the interpretation - * of the msgh_local_port field. It is handled like a msgt_name, - * and also must result in a send or send-once type right. - * - * The value of MACH_MSGH_BITS_VOUCHER determines the interpretation - * of the msgh_voucher_port field. It is handled like a msgt_name, - * but must result in a send right (and the msgh_voucher_port field - * must be the name of a send right to a Mach voucher kernel object. - * - * MACH_MSGH_BITS() combines two MACH_MSG_TYPE_* values, for the remote - * and local fields, into a single value suitable for msgh_bits. - * - * MACH_MSGH_BITS_CIRCULAR should be zero; is is used internally. - * - * The unused bits should be zero and are reserved for the kernel - * or for future interface expansion. - */ - -#define MACH_MSGH_BITS_ZERO 0x00000000 - -#define MACH_MSGH_BITS_REMOTE_MASK 0x0000001f -#define MACH_MSGH_BITS_LOCAL_MASK 0x00001f00 -#define MACH_MSGH_BITS_VOUCHER_MASK 0x001f0000 - -#define MACH_MSGH_BITS_PORTS_MASK \ - (MACH_MSGH_BITS_REMOTE_MASK | \ - MACH_MSGH_BITS_LOCAL_MASK | \ - MACH_MSGH_BITS_VOUCHER_MASK) - -#define MACH_MSGH_BITS_COMPLEX 0x80000000U /* message is complex */ - -#define MACH_MSGH_BITS_USER 0x801f1f1fU /* allowed bits user->kernel */ - -#define MACH_MSGH_BITS_RAISEIMP 0x20000000U /* importance raised due to msg */ -#define MACH_MSGH_BITS_DENAP MACH_MSGH_BITS_RAISEIMP - -#define MACH_MSGH_BITS_IMPHOLDASRT 0x10000000U /* assertion help, userland private */ -#define MACH_MSGH_BITS_DENAPHOLDASRT MACH_MSGH_BITS_IMPHOLDASRT - -#define MACH_MSGH_BITS_CIRCULAR 0x10000000U /* message circular, kernel private */ - -#define MACH_MSGH_BITS_USED 0xb01f1f1fU - -/* setter macros for the bits */ -#define MACH_MSGH_BITS(remote, local) /* legacy */ \ - ((remote) | ((local) << 8)) -#define MACH_MSGH_BITS_SET_PORTS(remote, local, voucher) \ - (((remote) & MACH_MSGH_BITS_REMOTE_MASK) | \ - (((local) << 8) & MACH_MSGH_BITS_LOCAL_MASK) | \ - (((voucher) << 16) & MACH_MSGH_BITS_VOUCHER_MASK)) -#define MACH_MSGH_BITS_SET(remote, local, voucher, other) \ - (MACH_MSGH_BITS_SET_PORTS((remote), (local), (voucher)) \ - | ((other) &~ MACH_MSGH_BITS_PORTS_MASK)) - -/* getter macros for pulling values out of the bits field */ -#define MACH_MSGH_BITS_REMOTE(bits) \ - ((bits) & MACH_MSGH_BITS_REMOTE_MASK) -#define MACH_MSGH_BITS_LOCAL(bits) \ - (((bits) & MACH_MSGH_BITS_LOCAL_MASK) >> 8) -#define MACH_MSGH_BITS_VOUCHER(bits) \ - (((bits) & MACH_MSGH_BITS_VOUCHER_MASK) >> 16) -#define MACH_MSGH_BITS_PORTS(bits) \ - ((bits) & MACH_MSGH_BITS_PORTS_MASK) -#define MACH_MSGH_BITS_OTHER(bits) \ - ((bits) &~ MACH_MSGH_BITS_PORTS_MASK) - -/* checking macros */ -#define MACH_MSGH_BITS_HAS_REMOTE(bits) \ - (MACH_MSGH_BITS_REMOTE(bits) != MACH_MSGH_BITS_ZERO) -#define MACH_MSGH_BITS_HAS_LOCAL(bits) \ - (MACH_MSGH_BITS_LOCAL(bits) != MACH_MSGH_BITS_ZERO) -#define MACH_MSGH_BITS_HAS_VOUCHER(bits) \ - (MACH_MSGH_BITS_VOUCHER(bits) != MACH_MSGH_BITS_ZERO) -#define MACH_MSGH_BITS_IS_COMPLEX(bits) \ - (((bits) & MACH_MSGH_BITS_COMPLEX) != MACH_MSGH_BITS_ZERO) - -/* importance checking macros */ -#define MACH_MSGH_BITS_RAISED_IMPORTANCE(bits) \ - (((bits) & MACH_MSGH_BITS_RAISEIMP) != MACH_MSGH_BITS_ZERO) -#define MACH_MSGH_BITS_HOLDS_IMPORTANCE_ASSERTION(bits) \ - (((bits) & MACH_MSGH_BITS_IMPHOLDASRT) != MACH_MSGH_BITS_ZERO) - -/* - * Every message starts with a message header. - * Following the message header, if the message is complex, are a count - * of type descriptors and the type descriptors themselves - * (mach_msg_descriptor_t). The size of the message must be specified in - * bytes, and includes the message header, descriptor count, descriptors, - * and inline data. - * - * The msgh_remote_port field specifies the destination of the message. - * It must specify a valid send or send-once right for a port. - * - * The msgh_local_port field specifies a "reply port". Normally, - * This field carries a send-once right that the receiver will use - * to reply to the message. It may carry the values MACH_PORT_NULL, - * MACH_PORT_DEAD, a send-once right, or a send right. - * - * The msgh_voucher_port field specifies a Mach voucher port. Only - * send rights to kernel-implemented Mach Voucher kernel objects in - * addition to MACH_PORT_NULL or MACH_PORT_DEAD may be passed. - * - * The msgh_id field is uninterpreted by the message primitives. - * It normally carries information specifying the format - * or meaning of the message. - */ - -typedef unsigned int mach_msg_bits_t; -typedef natural_t mach_msg_size_t; -typedef integer_t mach_msg_id_t; - -#define MACH_MSG_SIZE_NULL (mach_msg_size_t *) 0 - -typedef unsigned int mach_msg_priority_t; - -#define MACH_MSG_PRIORITY_UNSPECIFIED (mach_msg_priority_t) 0 - -typedef unsigned int mach_msg_type_name_t; - -#define MACH_MSG_TYPE_MOVE_RECEIVE 16 /* Must hold receive right */ -#define MACH_MSG_TYPE_MOVE_SEND 17 /* Must hold send right(s) */ -#define MACH_MSG_TYPE_MOVE_SEND_ONCE 18 /* Must hold sendonce right */ -#define MACH_MSG_TYPE_COPY_SEND 19 /* Must hold send right(s) */ -#define MACH_MSG_TYPE_MAKE_SEND 20 /* Must hold receive right */ -#define MACH_MSG_TYPE_MAKE_SEND_ONCE 21 /* Must hold receive right */ -#define MACH_MSG_TYPE_COPY_RECEIVE 22 /* NOT VALID */ -#define MACH_MSG_TYPE_DISPOSE_RECEIVE 24 /* must hold receive right */ -#define MACH_MSG_TYPE_DISPOSE_SEND 25 /* must hold send right(s) */ -#define MACH_MSG_TYPE_DISPOSE_SEND_ONCE 26 /* must hold sendonce right */ - -typedef unsigned int mach_msg_copy_options_t; - -#define MACH_MSG_PHYSICAL_COPY 0 -#define MACH_MSG_VIRTUAL_COPY 1 -#define MACH_MSG_ALLOCATE 2 -#define MACH_MSG_OVERWRITE 3 /* deprecated */ -#ifdef MACH_KERNEL -#define MACH_MSG_KALLOC_COPY_T 4 -#endif /* MACH_KERNEL */ - -#define MACH_MSG_GUARD_FLAGS_NONE 0x0000 -#define MACH_MSG_GUARD_FLAGS_IMMOVABLE_RECEIVE 0x0001 /* Move the receive right and mark it as immovable */ -#define MACH_MSG_GUARD_FLAGS_UNGUARDED_ON_SEND 0x0002 /* Verify that the port is unguarded */ -#define MACH_MSG_GUARD_FLAGS_MASK 0x0003 /* Valid flag bits */ -typedef unsigned int mach_msg_guard_flags_t; - -/* - * In a complex mach message, the mach_msg_header_t is followed by - * a descriptor count, then an array of that number of descriptors - * (mach_msg_*_descriptor_t). The type field of mach_msg_type_descriptor_t - * (which any descriptor can be cast to) indicates the flavor of the - * descriptor. - * - * Note that in LP64, the various types of descriptors are no longer all - * the same size as mach_msg_descriptor_t, so the array cannot be indexed - * as expected. - */ - -typedef unsigned int mach_msg_descriptor_type_t; - -#define MACH_MSG_PORT_DESCRIPTOR 0 -#define MACH_MSG_OOL_DESCRIPTOR 1 -#define MACH_MSG_OOL_PORTS_DESCRIPTOR 2 -#define MACH_MSG_OOL_VOLATILE_DESCRIPTOR 3 -#define MACH_MSG_GUARDED_PORT_DESCRIPTOR 4 - -#pragma pack(push, 4) - -typedef struct{ - natural_t pad1; - mach_msg_size_t pad2; - unsigned int pad3 : 24; - mach_msg_descriptor_type_t type : 8; -} mach_msg_type_descriptor_t; - -typedef struct{ - mach_port_t name; -// Pad to 8 bytes everywhere except the K64 kernel where mach_port_t is 8 bytes - mach_msg_size_t pad1; - unsigned int pad2 : 16; - mach_msg_type_name_t disposition : 8; - mach_msg_descriptor_type_t type : 8; -} mach_msg_port_descriptor_t; - -typedef struct{ - uint32_t address; - mach_msg_size_t size; - boolean_t deallocate: 8; - mach_msg_copy_options_t copy: 8; - unsigned int pad1: 8; - mach_msg_descriptor_type_t type: 8; -} mach_msg_ool_descriptor32_t; - -typedef struct{ - uint64_t address; - boolean_t deallocate: 8; - mach_msg_copy_options_t copy: 8; - unsigned int pad1: 8; - mach_msg_descriptor_type_t type: 8; - mach_msg_size_t size; -} mach_msg_ool_descriptor64_t; - -typedef struct{ - void* address; -#if !defined(__LP64__) - mach_msg_size_t size; -#endif - boolean_t deallocate: 8; - mach_msg_copy_options_t copy: 8; - unsigned int pad1: 8; - mach_msg_descriptor_type_t type: 8; -#if defined(__LP64__) - mach_msg_size_t size; -#endif -} mach_msg_ool_descriptor_t; - -typedef struct{ - uint32_t address; - mach_msg_size_t count; - boolean_t deallocate: 8; - mach_msg_copy_options_t copy: 8; - mach_msg_type_name_t disposition : 8; - mach_msg_descriptor_type_t type : 8; -} mach_msg_ool_ports_descriptor32_t; - -typedef struct{ - uint64_t address; - boolean_t deallocate: 8; - mach_msg_copy_options_t copy: 8; - mach_msg_type_name_t disposition : 8; - mach_msg_descriptor_type_t type : 8; - mach_msg_size_t count; -} mach_msg_ool_ports_descriptor64_t; - -typedef struct{ - void* address; -#if !defined(__LP64__) - mach_msg_size_t count; -#endif - boolean_t deallocate: 8; - mach_msg_copy_options_t copy: 8; - mach_msg_type_name_t disposition : 8; - mach_msg_descriptor_type_t type : 8; -#if defined(__LP64__) - mach_msg_size_t count; -#endif -} mach_msg_ool_ports_descriptor_t; - -typedef struct{ - uint32_t context; - mach_port_name_t name; - mach_msg_guard_flags_t flags : 16; - mach_msg_type_name_t disposition : 8; - mach_msg_descriptor_type_t type : 8; -} mach_msg_guarded_port_descriptor32_t; - -typedef struct{ - uint64_t context; - mach_msg_guard_flags_t flags : 16; - mach_msg_type_name_t disposition : 8; - mach_msg_descriptor_type_t type : 8; - mach_port_name_t name; -} mach_msg_guarded_port_descriptor64_t; - -typedef struct{ - mach_port_context_t context; -#if !defined(__LP64__) - mach_port_name_t name; -#endif - mach_msg_guard_flags_t flags : 16; - mach_msg_type_name_t disposition : 8; - mach_msg_descriptor_type_t type : 8; -#if defined(__LP64__) - mach_port_name_t name; -#endif /* defined(__LP64__) */ -} mach_msg_guarded_port_descriptor_t; - -/* - * LP64support - This union definition is not really - * appropriate in LP64 mode because not all descriptors - * are of the same size in that environment. - */ -typedef union{ - mach_msg_port_descriptor_t port; - mach_msg_ool_descriptor_t out_of_line; - mach_msg_ool_ports_descriptor_t ool_ports; - mach_msg_type_descriptor_t type; - mach_msg_guarded_port_descriptor_t guarded_port; -} mach_msg_descriptor_t; - -typedef struct{ - mach_msg_size_t msgh_descriptor_count; -} mach_msg_body_t; - -#define MACH_MSG_BODY_NULL (mach_msg_body_t *) 0 -#define MACH_MSG_DESCRIPTOR_NULL (mach_msg_descriptor_t *) 0 - -typedef struct{ - mach_msg_bits_t msgh_bits; - mach_msg_size_t msgh_size; - mach_port_t msgh_remote_port; - mach_port_t msgh_local_port; - mach_port_name_t msgh_voucher_port; - mach_msg_id_t msgh_id; -} mach_msg_header_t; - -#define msgh_reserved msgh_voucher_port -#define MACH_MSG_NULL (mach_msg_header_t *) 0 - -typedef struct{ - mach_msg_header_t header; - mach_msg_body_t body; -} mach_msg_base_t; - -typedef unsigned int mach_msg_trailer_type_t; - -#define MACH_MSG_TRAILER_FORMAT_0 0 - -typedef unsigned int mach_msg_trailer_size_t; -typedef char *mach_msg_trailer_info_t; - -typedef struct{ - mach_msg_trailer_type_t msgh_trailer_type; - mach_msg_trailer_size_t msgh_trailer_size; -} mach_msg_trailer_t; - -/* - * The msgh_seqno field carries a sequence number - * associated with the received-from port. A port's - * sequence number is incremented every time a message - * is received from it and included in the received - * trailer to help put messages back in sequence if - * multiple threads receive and/or process received - * messages. - */ -typedef struct{ - mach_msg_trailer_type_t msgh_trailer_type; - mach_msg_trailer_size_t msgh_trailer_size; - mach_port_seqno_t msgh_seqno; -} mach_msg_seqno_trailer_t; - -typedef struct{ - unsigned int val[2]; -} security_token_t; - -typedef struct{ - mach_msg_trailer_type_t msgh_trailer_type; - mach_msg_trailer_size_t msgh_trailer_size; - mach_port_seqno_t msgh_seqno; - security_token_t msgh_sender; -} mach_msg_security_trailer_t; - -/* - * The audit token is an opaque token which identifies - * Mach tasks and senders of Mach messages as subjects - * to the BSM audit system. Only the appropriate BSM - * library routines should be used to interpret the - * contents of the audit token as the representation - * of the subject identity within the token may change - * over time. - */ -typedef struct{ - unsigned int val[8]; -} audit_token_t; - -typedef struct{ - mach_msg_trailer_type_t msgh_trailer_type; - mach_msg_trailer_size_t msgh_trailer_size; - mach_port_seqno_t msgh_seqno; - security_token_t msgh_sender; - audit_token_t msgh_audit; -} mach_msg_audit_trailer_t; - -typedef struct{ - mach_msg_trailer_type_t msgh_trailer_type; - mach_msg_trailer_size_t msgh_trailer_size; - mach_port_seqno_t msgh_seqno; - security_token_t msgh_sender; - audit_token_t msgh_audit; - mach_port_context_t msgh_context; -} mach_msg_context_trailer_t; - - - -typedef struct{ - mach_port_name_t sender; -} msg_labels_t; - -/* - * Trailer type to pass MAC policy label info as a mach message trailer. - * - */ - -typedef struct{ - mach_msg_trailer_type_t msgh_trailer_type; - mach_msg_trailer_size_t msgh_trailer_size; - mach_port_seqno_t msgh_seqno; - security_token_t msgh_sender; - audit_token_t msgh_audit; - mach_port_context_t msgh_context; - int msgh_ad; - msg_labels_t msgh_labels; -} mach_msg_mac_trailer_t; - - -#define MACH_MSG_TRAILER_MINIMUM_SIZE sizeof(mach_msg_trailer_t) - -/* - * These values can change from release to release - but clearly - * code cannot request additional trailer elements one was not - * compiled to understand. Therefore, it is safe to use this - * constant when the same module specified the receive options. - * Otherwise, you run the risk that the options requested by - * another module may exceed the local modules notion of - * MAX_TRAILER_SIZE. - */ - -typedef mach_msg_mac_trailer_t mach_msg_max_trailer_t; -#define MAX_TRAILER_SIZE ((mach_msg_size_t)sizeof(mach_msg_max_trailer_t)) - -/* - * Legacy requirements keep us from ever updating these defines (even - * when the format_0 trailers gain new option data fields in the future). - * Therefore, they shouldn't be used going forward. Instead, the sizes - * should be compared against the specific element size requested using - * REQUESTED_TRAILER_SIZE. - */ -typedef mach_msg_security_trailer_t mach_msg_format_0_trailer_t; - -/*typedef mach_msg_mac_trailer_t mach_msg_format_0_trailer_t; - */ - -#define MACH_MSG_TRAILER_FORMAT_0_SIZE sizeof(mach_msg_format_0_trailer_t) - -#define KERNEL_SECURITY_TOKEN_VALUE { {0, 1} } -extern const security_token_t KERNEL_SECURITY_TOKEN; - -#define KERNEL_AUDIT_TOKEN_VALUE { {0, 0, 0, 0, 0, 0, 0, 0} } -extern const audit_token_t KERNEL_AUDIT_TOKEN; - -typedef integer_t mach_msg_options_t; - -typedef struct{ - mach_msg_header_t header; -} mach_msg_empty_send_t; - -typedef struct{ - mach_msg_header_t header; - mach_msg_trailer_t trailer; -} mach_msg_empty_rcv_t; - -typedef union{ - mach_msg_empty_send_t send; - mach_msg_empty_rcv_t rcv; -} mach_msg_empty_t; - -#pragma pack(pop) - -/* utility to round the message size - will become machine dependent */ -#define round_msg(x) (((mach_msg_size_t)(x) + sizeof (natural_t) - 1) & \ - ~(sizeof (natural_t) - 1)) - - -/* - * There is no fixed upper bound to the size of Mach messages. - */ -#define MACH_MSG_SIZE_MAX ((mach_msg_size_t) ~0) - -#if defined(__APPLE_API_PRIVATE) -/* - * But architectural limits of a given implementation, or - * temporal conditions may cause unpredictable send failures - * for messages larger than MACH_MSG_SIZE_RELIABLE. - * - * In either case, waiting for memory is [currently] outside - * the scope of send timeout values provided to IPC. - */ -#define MACH_MSG_SIZE_RELIABLE ((mach_msg_size_t) 256 * 1024) -#endif -/* - * Compatibility definitions, for code written - * when there was a msgh_kind instead of msgh_seqno. - */ -#define MACH_MSGH_KIND_NORMAL 0x00000000 -#define MACH_MSGH_KIND_NOTIFICATION 0x00000001 -#define msgh_kind msgh_seqno -#define mach_msg_kind_t mach_port_seqno_t - -typedef natural_t mach_msg_type_size_t; -typedef natural_t mach_msg_type_number_t; - -/* - * Values received/carried in messages. Tells the receiver what - * sort of port right he now has. - * - * MACH_MSG_TYPE_PORT_NAME is used to transfer a port name - * which should remain uninterpreted by the kernel. (Port rights - * are not transferred, just the port name.) - */ - -#define MACH_MSG_TYPE_PORT_NONE 0 - -#define MACH_MSG_TYPE_PORT_NAME 15 -#define MACH_MSG_TYPE_PORT_RECEIVE MACH_MSG_TYPE_MOVE_RECEIVE -#define MACH_MSG_TYPE_PORT_SEND MACH_MSG_TYPE_MOVE_SEND -#define MACH_MSG_TYPE_PORT_SEND_ONCE MACH_MSG_TYPE_MOVE_SEND_ONCE - -#define MACH_MSG_TYPE_LAST 22 /* Last assigned */ - -/* - * A dummy value. Mostly used to indicate that the actual value - * will be filled in later, dynamically. - */ - -#define MACH_MSG_TYPE_POLYMORPHIC ((mach_msg_type_name_t) -1) - -/* - * Is a given item a port type? - */ - -#define MACH_MSG_TYPE_PORT_ANY(x) \ - (((x) >= MACH_MSG_TYPE_MOVE_RECEIVE) && \ - ((x) <= MACH_MSG_TYPE_MAKE_SEND_ONCE)) - -#define MACH_MSG_TYPE_PORT_ANY_SEND(x) \ - (((x) >= MACH_MSG_TYPE_MOVE_SEND) && \ - ((x) <= MACH_MSG_TYPE_MAKE_SEND_ONCE)) - -#define MACH_MSG_TYPE_PORT_ANY_RIGHT(x) \ - (((x) >= MACH_MSG_TYPE_MOVE_RECEIVE) && \ - ((x) <= MACH_MSG_TYPE_MOVE_SEND_ONCE)) - -typedef integer_t mach_msg_option_t; - -#define MACH_MSG_OPTION_NONE 0x00000000 - -#define MACH_SEND_MSG 0x00000001 -#define MACH_RCV_MSG 0x00000002 - -#define MACH_RCV_LARGE 0x00000004 /* report large message sizes */ -#define MACH_RCV_LARGE_IDENTITY 0x00000008 /* identify source of large messages */ - -#define MACH_SEND_TIMEOUT 0x00000010 /* timeout value applies to send */ -#define MACH_SEND_OVERRIDE 0x00000020 /* priority override for send */ -#define MACH_SEND_INTERRUPT 0x00000040 /* don't restart interrupted sends */ -#define MACH_SEND_NOTIFY 0x00000080 /* arm send-possible notify */ -#define MACH_SEND_ALWAYS 0x00010000 /* ignore qlimits - kernel only */ -#define MACH_SEND_TRAILER 0x00020000 /* sender-provided trailer */ -#define MACH_SEND_NOIMPORTANCE 0x00040000 /* msg won't carry importance */ -#define MACH_SEND_NODENAP MACH_SEND_NOIMPORTANCE -#define MACH_SEND_IMPORTANCE 0x00080000 /* msg carries importance - kernel only */ -#define MACH_SEND_SYNC_OVERRIDE 0x00100000 /* msg should do sync ipc override */ -#define MACH_SEND_PROPAGATE_QOS 0x00200000 /* IPC should propagate the caller's QoS */ -#define MACH_SEND_SYNC_USE_THRPRI MACH_SEND_PROPAGATE_QOS /* obsolete name */ -#define MACH_SEND_KERNEL 0x00400000 /* full send from kernel space - kernel only */ -#define MACH_SEND_SYNC_BOOTSTRAP_CHECKIN 0x00800000 /* special reply port should boost thread doing sync bootstrap checkin */ - -#define MACH_RCV_TIMEOUT 0x00000100 /* timeout value applies to receive */ -#define MACH_RCV_NOTIFY 0x00000000 /* legacy name (value was: 0x00000200) */ -#define MACH_RCV_INTERRUPT 0x00000400 /* don't restart interrupted receive */ -#define MACH_RCV_VOUCHER 0x00000800 /* willing to receive voucher port */ -#define MACH_RCV_OVERWRITE 0x00000000 /* scatter receive (deprecated) */ -#define MACH_RCV_GUARDED_DESC 0x00001000 /* Can receive new guarded descriptor */ -#define MACH_RCV_SYNC_WAIT 0x00004000 /* sync waiter waiting for rcv */ -#define MACH_RCV_SYNC_PEEK 0x00008000 /* sync waiter waiting to peek */ - -#define MACH_MSG_STRICT_REPLY 0x00000200 /* Enforce specific properties about the reply port, and - * the context in which a thread replies to a message. - * This flag must be passed on both the SEND and RCV */ - - -/* - * NOTE: a 0x00------ RCV mask implies to ask for - * a MACH_MSG_TRAILER_FORMAT_0 with 0 Elements, - * which is equivalent to a mach_msg_trailer_t. - * - * XXXMAC: unlike the rest of the MACH_RCV_* flags, MACH_RCV_TRAILER_LABELS - * needs its own private bit since we only calculate its fields when absolutely - * required. - */ -#define MACH_RCV_TRAILER_NULL 0 -#define MACH_RCV_TRAILER_SEQNO 1 -#define MACH_RCV_TRAILER_SENDER 2 -#define MACH_RCV_TRAILER_AUDIT 3 -#define MACH_RCV_TRAILER_CTX 4 -#define MACH_RCV_TRAILER_AV 7 -#define MACH_RCV_TRAILER_LABELS 8 - -#define MACH_RCV_TRAILER_TYPE(x) (((x) & 0xf) << 28) -#define MACH_RCV_TRAILER_ELEMENTS(x) (((x) & 0xf) << 24) -#define MACH_RCV_TRAILER_MASK ((0xf << 24)) - -#define GET_RCV_ELEMENTS(y) (((y) >> 24) & 0xf) - - -/* - * XXXMAC: note that in the case of MACH_RCV_TRAILER_LABELS, - * we just fall through to mach_msg_max_trailer_t. - * This is correct behavior since mach_msg_max_trailer_t is defined as - * mac_msg_mac_trailer_t which is used for the LABELS trailer. - * It also makes things work properly if MACH_RCV_TRAILER_LABELS is ORed - * with one of the other options. - */ - -#define REQUESTED_TRAILER_SIZE_NATIVE(y) \ - ((mach_msg_trailer_size_t) \ - ((GET_RCV_ELEMENTS(y) == MACH_RCV_TRAILER_NULL) ? \ - sizeof(mach_msg_trailer_t) : \ - ((GET_RCV_ELEMENTS(y) == MACH_RCV_TRAILER_SEQNO) ? \ - sizeof(mach_msg_seqno_trailer_t) : \ - ((GET_RCV_ELEMENTS(y) == MACH_RCV_TRAILER_SENDER) ? \ - sizeof(mach_msg_security_trailer_t) : \ - ((GET_RCV_ELEMENTS(y) == MACH_RCV_TRAILER_AUDIT) ? \ - sizeof(mach_msg_audit_trailer_t) : \ - ((GET_RCV_ELEMENTS(y) == MACH_RCV_TRAILER_CTX) ? \ - sizeof(mach_msg_context_trailer_t) : \ - ((GET_RCV_ELEMENTS(y) == MACH_RCV_TRAILER_AV) ? \ - sizeof(mach_msg_mac_trailer_t) : \ - sizeof(mach_msg_max_trailer_t)))))))) - - -#define REQUESTED_TRAILER_SIZE(y) REQUESTED_TRAILER_SIZE_NATIVE(y) - -/* - * Much code assumes that mach_msg_return_t == kern_return_t. - * This definition is useful for descriptive purposes. - * - * See for the format of error codes. - * IPC errors are system 4. Send errors are subsystem 0; - * receive errors are subsystem 1. The code field is always non-zero. - * The high bits of the code field communicate extra information - * for some error codes. MACH_MSG_MASK masks off these special bits. - */ - -typedef kern_return_t mach_msg_return_t; - -#define MACH_MSG_SUCCESS 0x00000000 - - -#define MACH_MSG_MASK 0x00003e00 -/* All special error code bits defined below. */ -#define MACH_MSG_IPC_SPACE 0x00002000 -/* No room in IPC name space for another capability name. */ -#define MACH_MSG_VM_SPACE 0x00001000 -/* No room in VM address space for out-of-line memory. */ -#define MACH_MSG_IPC_KERNEL 0x00000800 -/* Kernel resource shortage handling an IPC capability. */ -#define MACH_MSG_VM_KERNEL 0x00000400 -/* Kernel resource shortage handling out-of-line memory. */ - -#define MACH_SEND_IN_PROGRESS 0x10000001 -/* Thread is waiting to send. (Internal use only.) */ -#define MACH_SEND_INVALID_DATA 0x10000002 -/* Bogus in-line data. */ -#define MACH_SEND_INVALID_DEST 0x10000003 -/* Bogus destination port. */ -#define MACH_SEND_TIMED_OUT 0x10000004 -/* Message not sent before timeout expired. */ -#define MACH_SEND_INVALID_VOUCHER 0x10000005 -/* Bogus voucher port. */ -#define MACH_SEND_INTERRUPTED 0x10000007 -/* Software interrupt. */ -#define MACH_SEND_MSG_TOO_SMALL 0x10000008 -/* Data doesn't contain a complete message. */ -#define MACH_SEND_INVALID_REPLY 0x10000009 -/* Bogus reply port. */ -#define MACH_SEND_INVALID_RIGHT 0x1000000a -/* Bogus port rights in the message body. */ -#define MACH_SEND_INVALID_NOTIFY 0x1000000b -/* Bogus notify port argument. */ -#define MACH_SEND_INVALID_MEMORY 0x1000000c -/* Invalid out-of-line memory pointer. */ -#define MACH_SEND_NO_BUFFER 0x1000000d -/* No message buffer is available. */ -#define MACH_SEND_TOO_LARGE 0x1000000e -/* Send is too large for port */ -#define MACH_SEND_INVALID_TYPE 0x1000000f -/* Invalid msg-type specification. */ -#define MACH_SEND_INVALID_HEADER 0x10000010 -/* A field in the header had a bad value. */ -#define MACH_SEND_INVALID_TRAILER 0x10000011 -/* The trailer to be sent does not match kernel format. */ -#define MACH_SEND_INVALID_CONTEXT 0x10000012 -/* The sending thread context did not match the context on the dest port */ -#define MACH_SEND_INVALID_RT_OOL_SIZE 0x10000015 -/* compatibility: no longer a returned error */ -#define MACH_SEND_NO_GRANT_DEST 0x10000016 -/* The destination port doesn't accept ports in body */ - -#define MACH_RCV_IN_PROGRESS 0x10004001 -/* Thread is waiting for receive. (Internal use only.) */ -#define MACH_RCV_INVALID_NAME 0x10004002 -/* Bogus name for receive port/port-set. */ -#define MACH_RCV_TIMED_OUT 0x10004003 -/* Didn't get a message within the timeout value. */ -#define MACH_RCV_TOO_LARGE 0x10004004 -/* Message buffer is not large enough for inline data. */ -#define MACH_RCV_INTERRUPTED 0x10004005 -/* Software interrupt. */ -#define MACH_RCV_PORT_CHANGED 0x10004006 -/* compatibility: no longer a returned error */ -#define MACH_RCV_INVALID_NOTIFY 0x10004007 -/* Bogus notify port argument. */ -#define MACH_RCV_INVALID_DATA 0x10004008 -/* Bogus message buffer for inline data. */ -#define MACH_RCV_PORT_DIED 0x10004009 -/* Port/set was sent away/died during receive. */ -#define MACH_RCV_IN_SET 0x1000400a -/* compatibility: no longer a returned error */ -#define MACH_RCV_HEADER_ERROR 0x1000400b -/* Error receiving message header. See special bits. */ -#define MACH_RCV_BODY_ERROR 0x1000400c -/* Error receiving message body. See special bits. */ -#define MACH_RCV_INVALID_TYPE 0x1000400d -/* Invalid msg-type specification in scatter list. */ -#define MACH_RCV_SCATTER_SMALL 0x1000400e -/* Out-of-line overwrite region is not large enough */ -#define MACH_RCV_INVALID_TRAILER 0x1000400f -/* trailer type or number of trailer elements not supported */ -#define MACH_RCV_IN_PROGRESS_TIMED 0x10004011 -/* Waiting for receive with timeout. (Internal use only.) */ -#define MACH_RCV_INVALID_REPLY 0x10004012 -/* invalid reply port used in a STRICT_REPLY message */ - - - -__BEGIN_DECLS - -/* - * Routine: mach_msg_overwrite - * Purpose: - * Send and/or receive a message. If the message operation - * is interrupted, and the user did not request an indication - * of that fact, then restart the appropriate parts of the - * operation silently (trap version does not restart). - * - * Distinct send and receive buffers may be specified. If - * no separate receive buffer is specified, the msg parameter - * will be used for both send and receive operations. - * - * In addition to a distinct receive buffer, that buffer may - * already contain scatter control information to direct the - * receiving of the message. - */ -__WATCHOS_PROHIBITED __TVOS_PROHIBITED -extern mach_msg_return_t mach_msg_overwrite( - mach_msg_header_t *msg, - mach_msg_option_t option, - mach_msg_size_t send_size, - mach_msg_size_t rcv_size, - mach_port_name_t rcv_name, - mach_msg_timeout_t timeout, - mach_port_name_t notify, - mach_msg_header_t *rcv_msg, - mach_msg_size_t rcv_limit); - - -/* - * Routine: mach_msg - * Purpose: - * Send and/or receive a message. If the message operation - * is interrupted, and the user did not request an indication - * of that fact, then restart the appropriate parts of the - * operation silently (trap version does not restart). - */ -__WATCHOS_PROHIBITED __TVOS_PROHIBITED -extern mach_msg_return_t mach_msg( - mach_msg_header_t *msg, - mach_msg_option_t option, - mach_msg_size_t send_size, - mach_msg_size_t rcv_size, - mach_port_name_t rcv_name, - mach_msg_timeout_t timeout, - mach_port_name_t notify); - -/* - * Routine: mach_voucher_deallocate - * Purpose: - * Deallocate a mach voucher created or received in a message. Drops - * one (send right) reference to the voucher. - */ -__WATCHOS_PROHIBITED __TVOS_PROHIBITED -extern kern_return_t mach_voucher_deallocate( - mach_port_name_t voucher); - - -__END_DECLS - -#endif /* _MACH_MESSAGE_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/port.h b/lib/libc/include/x86_64-macos-gnu/mach/port.h deleted file mode 100644 index 3547576e80..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/port.h +++ /dev/null @@ -1,422 +0,0 @@ -/* - * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * @OSF_COPYRIGHT@ - */ -/* - * Mach Operating System - * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ -/* - * NOTICE: This file was modified by McAfee Research in 2004 to introduce - * support for mandatory and extensible security protections. This notice - * is included in support of clause 2.2 (b) of the Apple Public License, - * Version 2.0. - */ -/* - */ -/* - * File: mach/port.h - * - * Definition of a Mach port - * - * Mach ports are the endpoints to Mach-implemented communications - * channels (usually uni-directional message queues, but other types - * also exist). - * - * Unique collections of these endpoints are maintained for each - * Mach task. Each Mach port in the task's collection is given a - * [task-local] name to identify it - and the the various "rights" - * held by the task for that specific endpoint. - * - * This header defines the types used to identify these Mach ports - * and the various rights associated with them. For more info see: - * - * - manipulation of port rights in a given space - * - message queue [and port right passing] mechanism - * - */ - -#ifndef _MACH_PORT_H_ -#define _MACH_PORT_H_ - -#include -#include -#include -#include - -/* - * mach_port_name_t - the local identity for a Mach port - * - * The name is Mach port namespace specific. It is used to - * identify the rights held for that port by the task whose - * namespace is implied [or specifically provided]. - * - * Use of this type usually implies just a name - no rights. - * See mach_port_t for a type that implies a "named right." - * - */ - -typedef natural_t mach_port_name_t; -typedef mach_port_name_t *mach_port_name_array_t; - - -/* - * mach_port_t - a named port right - * - * In user-space, "rights" are represented by the name of the - * right in the Mach port namespace. Even so, this type is - * presented as a unique one to more clearly denote the presence - * of a right coming along with the name. - * - * Often, various rights for a port held in a single name space - * will coalesce and are, therefore, be identified by a single name - * [this is the case for send and receive rights]. But not - * always [send-once rights currently get a unique name for - * each right]. - * - */ - -#include -#include - - -typedef mach_port_t *mach_port_array_t; - -/* - * MACH_PORT_NULL is a legal value that can be carried in messages. - * It indicates the absence of any port or port rights. (A port - * argument keeps the message from being "simple", even if the - * value is MACH_PORT_NULL.) The value MACH_PORT_DEAD is also a legal - * value that can be carried in messages. It indicates - * that a port right was present, but it died. - */ - -#define MACH_PORT_NULL 0 /* intentional loose typing */ -#define MACH_PORT_DEAD ((mach_port_name_t) ~0) -#define MACH_PORT_VALID(name) \ - (((name) != MACH_PORT_NULL) && \ - ((name) != MACH_PORT_DEAD)) - - -/* - * For kernel-selected [assigned] port names, the name is - * comprised of two parts: a generation number and an index. - * This approach keeps the exact same name from being generated - * and reused too quickly [to catch right/reference counting bugs]. - * The dividing line between the constituent parts is exposed so - * that efficient "mach_port_name_t to data structure pointer" - * conversion implementation can be made. But it is possible - * for user-level code to assign their own names to Mach ports. - * These are not required to participate in this algorithm. So - * care should be taken before "assuming" this model. - * - */ - -#ifndef NO_PORT_GEN - -#define MACH_PORT_INDEX(name) ((name) >> 8) -#define MACH_PORT_GEN(name) (((name) & 0xff) << 24) -#define MACH_PORT_MAKE(index, gen) \ - (((index) << 8) | (gen) >> 24) - -#else /* NO_PORT_GEN */ - -#define MACH_PORT_INDEX(name) (name) -#define MACH_PORT_GEN(name) (0) -#define MACH_PORT_MAKE(index, gen) (index) - -#endif /* NO_PORT_GEN */ - - -/* - * These are the different rights a task may have for a port. - * The MACH_PORT_RIGHT_* definitions are used as arguments - * to mach_port_allocate, mach_port_get_refs, etc, to specify - * a particular right to act upon. The mach_port_names and - * mach_port_type calls return bitmasks using the MACH_PORT_TYPE_* - * definitions. This is because a single name may denote - * multiple rights. - */ - -typedef natural_t mach_port_right_t; - -#define MACH_PORT_RIGHT_SEND ((mach_port_right_t) 0) -#define MACH_PORT_RIGHT_RECEIVE ((mach_port_right_t) 1) -#define MACH_PORT_RIGHT_SEND_ONCE ((mach_port_right_t) 2) -#define MACH_PORT_RIGHT_PORT_SET ((mach_port_right_t) 3) -#define MACH_PORT_RIGHT_DEAD_NAME ((mach_port_right_t) 4) -#define MACH_PORT_RIGHT_LABELH ((mach_port_right_t) 5) /* obsolete right */ -#define MACH_PORT_RIGHT_NUMBER ((mach_port_right_t) 6) /* right not implemented */ - - -typedef natural_t mach_port_type_t; -typedef mach_port_type_t *mach_port_type_array_t; - -#define MACH_PORT_TYPE(right) \ - ((mach_port_type_t)(((mach_port_type_t) 1) \ - << ((right) + ((mach_port_right_t) 16)))) -#define MACH_PORT_TYPE_NONE ((mach_port_type_t) 0L) -#define MACH_PORT_TYPE_SEND MACH_PORT_TYPE(MACH_PORT_RIGHT_SEND) -#define MACH_PORT_TYPE_RECEIVE MACH_PORT_TYPE(MACH_PORT_RIGHT_RECEIVE) -#define MACH_PORT_TYPE_SEND_ONCE MACH_PORT_TYPE(MACH_PORT_RIGHT_SEND_ONCE) -#define MACH_PORT_TYPE_PORT_SET MACH_PORT_TYPE(MACH_PORT_RIGHT_PORT_SET) -#define MACH_PORT_TYPE_DEAD_NAME MACH_PORT_TYPE(MACH_PORT_RIGHT_DEAD_NAME) -#define MACH_PORT_TYPE_LABELH MACH_PORT_TYPE(MACH_PORT_RIGHT_LABELH) /* obsolete */ - - - -/* Convenient combinations. */ - -#define MACH_PORT_TYPE_SEND_RECEIVE \ - (MACH_PORT_TYPE_SEND|MACH_PORT_TYPE_RECEIVE) -#define MACH_PORT_TYPE_SEND_RIGHTS \ - (MACH_PORT_TYPE_SEND|MACH_PORT_TYPE_SEND_ONCE) -#define MACH_PORT_TYPE_PORT_RIGHTS \ - (MACH_PORT_TYPE_SEND_RIGHTS|MACH_PORT_TYPE_RECEIVE) -#define MACH_PORT_TYPE_PORT_OR_DEAD \ - (MACH_PORT_TYPE_PORT_RIGHTS|MACH_PORT_TYPE_DEAD_NAME) -#define MACH_PORT_TYPE_ALL_RIGHTS \ - (MACH_PORT_TYPE_PORT_OR_DEAD|MACH_PORT_TYPE_PORT_SET) - -/* Dummy type bits that mach_port_type/mach_port_names can return. */ - -#define MACH_PORT_TYPE_DNREQUEST 0x80000000 -#define MACH_PORT_TYPE_SPREQUEST 0x40000000 -#define MACH_PORT_TYPE_SPREQUEST_DELAYED 0x20000000 - -/* User-references for capabilities. */ - -typedef natural_t mach_port_urefs_t; -typedef integer_t mach_port_delta_t; /* change in urefs */ - -/* Attributes of ports. (See mach_port_get_receive_status.) */ - -typedef natural_t mach_port_seqno_t; /* sequence number */ -typedef natural_t mach_port_mscount_t; /* make-send count */ -typedef natural_t mach_port_msgcount_t; /* number of msgs */ -typedef natural_t mach_port_rights_t; /* number of rights */ - -/* - * Are there outstanding send rights for a given port? - */ -#define MACH_PORT_SRIGHTS_NONE 0 /* no srights */ -#define MACH_PORT_SRIGHTS_PRESENT 1 /* srights */ -typedef unsigned int mach_port_srights_t; /* status of send rights */ - -typedef struct mach_port_status { - mach_port_rights_t mps_pset; /* count of containing port sets */ - mach_port_seqno_t mps_seqno; /* sequence number */ - mach_port_mscount_t mps_mscount; /* make-send count */ - mach_port_msgcount_t mps_qlimit; /* queue limit */ - mach_port_msgcount_t mps_msgcount; /* number in the queue */ - mach_port_rights_t mps_sorights; /* how many send-once rights */ - boolean_t mps_srights; /* do send rights exist? */ - boolean_t mps_pdrequest; /* port-deleted requested? */ - boolean_t mps_nsrequest; /* no-senders requested? */ - natural_t mps_flags; /* port flags */ -} mach_port_status_t; - -/* System-wide values for setting queue limits on a port */ -#define MACH_PORT_QLIMIT_ZERO (0) -#define MACH_PORT_QLIMIT_BASIC (5) -#define MACH_PORT_QLIMIT_SMALL (16) -#define MACH_PORT_QLIMIT_LARGE (1024) -#define MACH_PORT_QLIMIT_KERNEL (65534) -#define MACH_PORT_QLIMIT_MIN MACH_PORT_QLIMIT_ZERO -#define MACH_PORT_QLIMIT_DEFAULT MACH_PORT_QLIMIT_BASIC -#define MACH_PORT_QLIMIT_MAX MACH_PORT_QLIMIT_LARGE - -typedef struct mach_port_limits { - mach_port_msgcount_t mpl_qlimit; /* number of msgs */ -} mach_port_limits_t; - -/* Possible values for mps_flags (part of mach_port_status_t) */ -#define MACH_PORT_STATUS_FLAG_TEMPOWNER 0x01 -#define MACH_PORT_STATUS_FLAG_GUARDED 0x02 -#define MACH_PORT_STATUS_FLAG_STRICT_GUARD 0x04 -#define MACH_PORT_STATUS_FLAG_IMP_DONATION 0x08 -#define MACH_PORT_STATUS_FLAG_REVIVE 0x10 -#define MACH_PORT_STATUS_FLAG_TASKPTR 0x20 -#define MACH_PORT_STATUS_FLAG_GUARD_IMMOVABLE_RECEIVE 0x40 -#define MACH_PORT_STATUS_FLAG_NO_GRANT 0x80 - -typedef struct mach_port_info_ext { - mach_port_status_t mpie_status; - mach_port_msgcount_t mpie_boost_cnt; - uint32_t reserved[6]; -} mach_port_info_ext_t; - -typedef integer_t *mach_port_info_t; /* varying array of natural_t */ - -/* Flavors for mach_port_get/set_attributes() */ -typedef int mach_port_flavor_t; -#define MACH_PORT_LIMITS_INFO 1 /* uses mach_port_limits_t */ -#define MACH_PORT_RECEIVE_STATUS 2 /* uses mach_port_status_t */ -#define MACH_PORT_DNREQUESTS_SIZE 3 /* info is int */ -#define MACH_PORT_TEMPOWNER 4 /* indicates receive right will be reassigned to another task */ -#define MACH_PORT_IMPORTANCE_RECEIVER 5 /* indicates recieve right accepts priority donation */ -#define MACH_PORT_DENAP_RECEIVER 6 /* indicates receive right accepts de-nap donation */ -#define MACH_PORT_INFO_EXT 7 /* uses mach_port_info_ext_t */ - -#define MACH_PORT_LIMITS_INFO_COUNT ((natural_t) \ - (sizeof(mach_port_limits_t)/sizeof(natural_t))) -#define MACH_PORT_RECEIVE_STATUS_COUNT ((natural_t) \ - (sizeof(mach_port_status_t)/sizeof(natural_t))) -#define MACH_PORT_DNREQUESTS_SIZE_COUNT 1 -#define MACH_PORT_INFO_EXT_COUNT ((natural_t) \ - (sizeof(mach_port_info_ext_t)/sizeof(natural_t))) -/* - * Structure used to pass information about port allocation requests. - * Must be padded to 64-bits total length. - */ -typedef struct mach_port_qos { - unsigned int name:1; /* name given */ - unsigned int prealloc:1; /* prealloced message */ - boolean_t pad1:30; - natural_t len; -} mach_port_qos_t; - -/* Mach Port Guarding definitions */ - -/* - * Flags for mach_port_options (used for - * invocation of mach_port_construct). - * Indicates attributes to be set for the newly - * allocated port. - */ -#define MPO_CONTEXT_AS_GUARD 0x01 /* Add guard to the port */ -#define MPO_QLIMIT 0x02 /* Set qlimit for the port msg queue */ -#define MPO_TEMPOWNER 0x04 /* Set the tempowner bit of the port */ -#define MPO_IMPORTANCE_RECEIVER 0x08 /* Mark the port as importance receiver */ -#define MPO_INSERT_SEND_RIGHT 0x10 /* Insert a send right for the port */ -#define MPO_STRICT 0x20 /* Apply strict guarding for port */ -#define MPO_DENAP_RECEIVER 0x40 /* Mark the port as App de-nap receiver */ -#define MPO_IMMOVABLE_RECEIVE 0x80 /* Mark the port as immovable; protected by the guard context */ -/* - * Structure to define optional attributes for a newly - * constructed port. - */ -typedef struct mach_port_options { - uint32_t flags; /* Flags defining attributes for port */ - mach_port_limits_t mpl; /* Message queue limit for port */ - uint64_t reserved[2]; /* Reserved */ -}mach_port_options_t; - -typedef mach_port_options_t *mach_port_options_ptr_t; - -/* - * EXC_GUARD represents a guard violation for both - * mach ports and file descriptors. GUARD_TYPE_ is used - * to differentiate among them. - */ -#define GUARD_TYPE_MACH_PORT 0x1 - -/* Reasons for exception for a guarded mach port */ -enum mach_port_guard_exception_codes { - kGUARD_EXC_DESTROY = 1u << 0, - kGUARD_EXC_MOD_REFS = 1u << 1, - kGUARD_EXC_SET_CONTEXT = 1u << 2, - kGUARD_EXC_UNGUARDED = 1u << 3, - kGUARD_EXC_INCORRECT_GUARD = 1u << 4, - kGUARD_EXC_IMMOVABLE = 1u << 5, - kGUARD_EXC_STRICT_REPLY = 1u << 6, - /* start of [optionally] non-fatal guards */ - kGUARD_EXC_INVALID_RIGHT = 1u << 8, - kGUARD_EXC_INVALID_NAME = 1u << 9, - kGUARD_EXC_INVALID_VALUE = 1u << 10, - kGUARD_EXC_INVALID_ARGUMENT = 1u << 11, - kGUARD_EXC_RIGHT_EXISTS = 1u << 12, - kGUARD_EXC_KERN_NO_SPACE = 1u << 13, - kGUARD_EXC_KERN_FAILURE = 1u << 14, - kGUARD_EXC_KERN_RESOURCE = 1u << 15, - kGUARD_EXC_SEND_INVALID_REPLY = 1u << 16, - kGUARD_EXC_SEND_INVALID_VOUCHER = 1u << 17, - kGUARD_EXC_SEND_INVALID_RIGHT = 1u << 18, - kGUARD_EXC_RCV_INVALID_NAME = 1u << 19, - kGUARD_EXC_RCV_GUARDED_DESC = 1u << 20, /* should never be fatal; for development only */ -}; - -#define MAX_FATAL_kGUARD_EXC_CODE (1u << 6) - -/* - * These flags are used as bits in the subcode of kGUARD_EXC_STRICT_REPLY exceptions. - */ -#define MPG_FLAGS_STRICT_REPLY_INVALID_REPLY_DISP (0x01ull << 56) -#define MPG_FLAGS_STRICT_REPLY_INVALID_REPLY_PORT (0x02ull << 56) -#define MPG_FLAGS_STRICT_REPLY_INVALID_VOUCHER (0x04ull << 56) -#define MPG_FLAGS_STRICT_REPLY_NO_BANK_ATTR (0x08ull << 56) -#define MPG_FLAGS_STRICT_REPLY_MISMATCHED_PERSONA (0x10ull << 56) -#define MPG_FLAGS_STRICT_REPLY_MASK (0xffull << 56) - -/* - * Flags for mach_port_guard_with_flags. These flags extend - * the attributes associated with a guarded port. - */ -#define MPG_STRICT 0x01 /* Apply strict guarding for a port */ -#define MPG_IMMOVABLE_RECEIVE 0x02 /* Receive right cannot be moved out of the space */ - -#if !__DARWIN_UNIX03 && !defined(_NO_PORT_T_FROM_MACH) -/* - * Mach 3.0 renamed everything to have mach_ in front of it. - * These types and macros are provided for backward compatibility - * but are deprecated. - */ -typedef mach_port_t port_t; -typedef mach_port_name_t port_name_t; -typedef mach_port_name_t *port_name_array_t; - -#define PORT_NULL ((port_t) 0) -#define PORT_DEAD ((port_t) ~0) -#define PORT_VALID(name) \ - ((port_t)(name) != PORT_NULL && (port_t)(name) != PORT_DEAD) - -#endif /* !__DARWIN_UNIX03 && !_NO_PORT_T_FROM_MACH */ - -#endif /* _MACH_PORT_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/processor_set.h b/lib/libc/include/x86_64-macos-gnu/mach/processor_set.h deleted file mode 100644 index c7637d1f19..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/processor_set.h +++ /dev/null @@ -1,540 +0,0 @@ -#ifndef _processor_set_user_ -#define _processor_set_user_ - -/* Module processor_set */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* BEGIN MIG_STRNCPY_ZEROFILL CODE */ - -#if defined(__has_include) -#if __has_include() -#ifndef USING_MIG_STRNCPY_ZEROFILL -#define USING_MIG_STRNCPY_ZEROFILL -#endif -#ifndef __MIG_STRNCPY_ZEROFILL_FORWARD_TYPE_DECLS__ -#define __MIG_STRNCPY_ZEROFILL_FORWARD_TYPE_DECLS__ -#ifdef __cplusplus -extern "C" { -#endif - extern int mig_strncpy_zerofill(char *dest, const char *src, int len) __attribute__((weak_import)); -#ifdef __cplusplus -} -#endif -#endif /* __MIG_STRNCPY_ZEROFILL_FORWARD_TYPE_DECLS__ */ -#endif /* __has_include() */ -#endif /* __has_include */ - -/* END MIG_STRNCPY_ZEROFILL CODE */ - - -#ifdef AUTOTEST -#ifndef FUNCTION_PTR_T -#define FUNCTION_PTR_T -typedef void (*function_ptr_t)(mach_port_t, char *, mach_msg_type_number_t); -typedef struct { - char *name; - function_ptr_t function; -} function_table_entry; -typedef function_table_entry *function_table_t; -#endif /* FUNCTION_PTR_T */ -#endif /* AUTOTEST */ - -#ifndef processor_set_MSG_COUNT -#define processor_set_MSG_COUNT 10 -#endif /* processor_set_MSG_COUNT */ - -#include -#include -#include -#include - -#ifdef __BeforeMigUserHeader -__BeforeMigUserHeader -#endif /* __BeforeMigUserHeader */ - -#include -__BEGIN_DECLS - - -/* Routine processor_set_statistics */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t processor_set_statistics -( - processor_set_name_t pset, - processor_set_flavor_t flavor, - processor_set_info_t info_out, - mach_msg_type_number_t *info_outCnt -); - -/* Routine processor_set_destroy */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t processor_set_destroy -( - processor_set_t set -); - -/* Routine processor_set_max_priority */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t processor_set_max_priority -( - processor_set_t processor_set, - int max_priority, - boolean_t change_threads -); - -/* Routine processor_set_policy_enable */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t processor_set_policy_enable -( - processor_set_t processor_set, - int policy -); - -/* Routine processor_set_policy_disable */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t processor_set_policy_disable -( - processor_set_t processor_set, - int policy, - boolean_t change_threads -); - -/* Routine processor_set_tasks */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t processor_set_tasks -( - processor_set_t processor_set, - task_array_t *task_list, - mach_msg_type_number_t *task_listCnt -); - -/* Routine processor_set_threads */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t processor_set_threads -( - processor_set_t processor_set, - thread_act_array_t *thread_list, - mach_msg_type_number_t *thread_listCnt -); - -/* Routine processor_set_policy_control */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t processor_set_policy_control -( - processor_set_t pset, - processor_set_flavor_t flavor, - processor_set_info_t policy_info, - mach_msg_type_number_t policy_infoCnt, - boolean_t change -); - -/* Routine processor_set_stack_usage */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t processor_set_stack_usage -( - processor_set_t pset, - unsigned *ltotal, - vm_size_t *space, - vm_size_t *resident, - vm_size_t *maxusage, - vm_offset_t *maxstack -); - -/* Routine processor_set_info */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t processor_set_info -( - processor_set_name_t set_name, - int flavor, - host_t *host, - processor_set_info_t info_out, - mach_msg_type_number_t *info_outCnt -); - -__END_DECLS - -/********************** Caution **************************/ -/* The following data types should be used to calculate */ -/* maximum message sizes only. The actual message may be */ -/* smaller, and the position of the arguments within the */ -/* message layout may vary from what is presented here. */ -/* For example, if any of the arguments are variable- */ -/* sized, and less than the maximum is sent, the data */ -/* will be packed tight in the actual message to reduce */ -/* the presence of holes. */ -/********************** Caution **************************/ - -/* typedefs for all requests */ - -#ifndef __Request__processor_set_subsystem__defined -#define __Request__processor_set_subsystem__defined - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - processor_set_flavor_t flavor; - mach_msg_type_number_t info_outCnt; - } __Request__processor_set_statistics_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__processor_set_destroy_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - int max_priority; - boolean_t change_threads; - } __Request__processor_set_max_priority_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - int policy; - } __Request__processor_set_policy_enable_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - int policy; - boolean_t change_threads; - } __Request__processor_set_policy_disable_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__processor_set_tasks_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__processor_set_threads_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - processor_set_flavor_t flavor; - mach_msg_type_number_t policy_infoCnt; - integer_t policy_info[5]; - boolean_t change; - } __Request__processor_set_policy_control_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__processor_set_stack_usage_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - int flavor; - mach_msg_type_number_t info_outCnt; - } __Request__processor_set_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif -#endif /* !__Request__processor_set_subsystem__defined */ - -/* union of all requests */ - -#ifndef __RequestUnion__processor_set_subsystem__defined -#define __RequestUnion__processor_set_subsystem__defined -union __RequestUnion__processor_set_subsystem { - __Request__processor_set_statistics_t Request_processor_set_statistics; - __Request__processor_set_destroy_t Request_processor_set_destroy; - __Request__processor_set_max_priority_t Request_processor_set_max_priority; - __Request__processor_set_policy_enable_t Request_processor_set_policy_enable; - __Request__processor_set_policy_disable_t Request_processor_set_policy_disable; - __Request__processor_set_tasks_t Request_processor_set_tasks; - __Request__processor_set_threads_t Request_processor_set_threads; - __Request__processor_set_policy_control_t Request_processor_set_policy_control; - __Request__processor_set_stack_usage_t Request_processor_set_stack_usage; - __Request__processor_set_info_t Request_processor_set_info; -}; -#endif /* !__RequestUnion__processor_set_subsystem__defined */ -/* typedefs for all replies */ - -#ifndef __Reply__processor_set_subsystem__defined -#define __Reply__processor_set_subsystem__defined - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - mach_msg_type_number_t info_outCnt; - integer_t info_out[5]; - } __Reply__processor_set_statistics_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__processor_set_destroy_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__processor_set_max_priority_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__processor_set_policy_enable_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__processor_set_policy_disable_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_ool_ports_descriptor_t task_list; - /* end of the kernel processed data */ - NDR_record_t NDR; - mach_msg_type_number_t task_listCnt; - } __Reply__processor_set_tasks_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_ool_ports_descriptor_t thread_list; - /* end of the kernel processed data */ - NDR_record_t NDR; - mach_msg_type_number_t thread_listCnt; - } __Reply__processor_set_threads_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__processor_set_policy_control_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - unsigned ltotal; - vm_size_t space; - vm_size_t resident; - vm_size_t maxusage; - vm_offset_t maxstack; - } __Reply__processor_set_stack_usage_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t host; - /* end of the kernel processed data */ - NDR_record_t NDR; - mach_msg_type_number_t info_outCnt; - integer_t info_out[5]; - } __Reply__processor_set_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif -#endif /* !__Reply__processor_set_subsystem__defined */ - -/* union of all replies */ - -#ifndef __ReplyUnion__processor_set_subsystem__defined -#define __ReplyUnion__processor_set_subsystem__defined -union __ReplyUnion__processor_set_subsystem { - __Reply__processor_set_statistics_t Reply_processor_set_statistics; - __Reply__processor_set_destroy_t Reply_processor_set_destroy; - __Reply__processor_set_max_priority_t Reply_processor_set_max_priority; - __Reply__processor_set_policy_enable_t Reply_processor_set_policy_enable; - __Reply__processor_set_policy_disable_t Reply_processor_set_policy_disable; - __Reply__processor_set_tasks_t Reply_processor_set_tasks; - __Reply__processor_set_threads_t Reply_processor_set_threads; - __Reply__processor_set_policy_control_t Reply_processor_set_policy_control; - __Reply__processor_set_stack_usage_t Reply_processor_set_stack_usage; - __Reply__processor_set_info_t Reply_processor_set_info; -}; -#endif /* !__RequestUnion__processor_set_subsystem__defined */ - -#ifndef subsystem_to_name_map_processor_set -#define subsystem_to_name_map_processor_set \ - { "processor_set_statistics", 4000 },\ - { "processor_set_destroy", 4001 },\ - { "processor_set_max_priority", 4002 },\ - { "processor_set_policy_enable", 4003 },\ - { "processor_set_policy_disable", 4004 },\ - { "processor_set_tasks", 4005 },\ - { "processor_set_threads", 4006 },\ - { "processor_set_policy_control", 4007 },\ - { "processor_set_stack_usage", 4008 },\ - { "processor_set_info", 4009 } -#endif - -#ifdef __AfterMigUserHeader -__AfterMigUserHeader -#endif /* __AfterMigUserHeader */ - -#endif /* _processor_set_user_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/task.h b/lib/libc/include/x86_64-macos-gnu/mach/task.h deleted file mode 100644 index 5f0de2dcd5..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/task.h +++ /dev/null @@ -1,2523 +0,0 @@ -#ifndef _task_user_ -#define _task_user_ - -/* Module task */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* BEGIN MIG_STRNCPY_ZEROFILL CODE */ - -#if defined(__has_include) -#if __has_include() -#ifndef USING_MIG_STRNCPY_ZEROFILL -#define USING_MIG_STRNCPY_ZEROFILL -#endif -#ifndef __MIG_STRNCPY_ZEROFILL_FORWARD_TYPE_DECLS__ -#define __MIG_STRNCPY_ZEROFILL_FORWARD_TYPE_DECLS__ -#ifdef __cplusplus -extern "C" { -#endif - extern int mig_strncpy_zerofill(char *dest, const char *src, int len) __attribute__((weak_import)); -#ifdef __cplusplus -} -#endif -#endif /* __MIG_STRNCPY_ZEROFILL_FORWARD_TYPE_DECLS__ */ -#endif /* __has_include() */ -#endif /* __has_include */ - -/* END MIG_STRNCPY_ZEROFILL CODE */ - - -#ifdef AUTOTEST -#ifndef FUNCTION_PTR_T -#define FUNCTION_PTR_T -typedef void (*function_ptr_t)(mach_port_t, char *, mach_msg_type_number_t); -typedef struct { - char *name; - function_ptr_t function; -} function_table_entry; -typedef function_table_entry *function_table_t; -#endif /* FUNCTION_PTR_T */ -#endif /* AUTOTEST */ - -#ifndef task_MSG_COUNT -#define task_MSG_COUNT 55 -#endif /* task_MSG_COUNT */ - -#include -#include -#include -#include -#include - -#ifdef __BeforeMigUserHeader -__BeforeMigUserHeader -#endif /* __BeforeMigUserHeader */ - -#include -__BEGIN_DECLS - - -/* Routine task_create */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_create -( - task_t target_task, - ledger_array_t ledgers, - mach_msg_type_number_t ledgersCnt, - boolean_t inherit_memory, - task_t *child_task -); - -/* Routine task_terminate */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_terminate -( - task_t target_task -); - -/* Routine task_threads */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_threads -( - task_inspect_t target_task, - thread_act_array_t *act_list, - mach_msg_type_number_t *act_listCnt -); - -/* Routine mach_ports_register */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t mach_ports_register -( - task_t target_task, - mach_port_array_t init_port_set, - mach_msg_type_number_t init_port_setCnt -); - -/* Routine mach_ports_lookup */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t mach_ports_lookup -( - task_t target_task, - mach_port_array_t *init_port_set, - mach_msg_type_number_t *init_port_setCnt -); - -/* Routine task_info */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_info -( - task_name_t target_task, - task_flavor_t flavor, - task_info_t task_info_out, - mach_msg_type_number_t *task_info_outCnt -); - -/* Routine task_set_info */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t task_set_info -( - task_t target_task, - task_flavor_t flavor, - task_info_t task_info_in, - mach_msg_type_number_t task_info_inCnt -); - -/* Routine task_suspend */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t task_suspend -( - task_t target_task -); - -/* Routine task_resume */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t task_resume -( - task_t target_task -); - -/* Routine task_get_special_port */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t task_get_special_port -( - task_inspect_t task, - int which_port, - mach_port_t *special_port -); - -/* Routine task_set_special_port */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t task_set_special_port -( - task_t task, - int which_port, - mach_port_t special_port -); - -/* Routine thread_create */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t thread_create -( - task_t parent_task, - thread_act_t *child_act -); - -/* Routine thread_create_running */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t thread_create_running -( - task_t parent_task, - thread_state_flavor_t flavor, - thread_state_t new_state, - mach_msg_type_number_t new_stateCnt, - thread_act_t *child_act -); - -/* Routine task_set_exception_ports */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t task_set_exception_ports -( - task_t task, - exception_mask_t exception_mask, - mach_port_t new_port, - exception_behavior_t behavior, - thread_state_flavor_t new_flavor -); - -/* Routine task_get_exception_ports */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t task_get_exception_ports -( - task_inspect_t task, - exception_mask_t exception_mask, - exception_mask_array_t masks, - mach_msg_type_number_t *masksCnt, - exception_handler_array_t old_handlers, - exception_behavior_array_t old_behaviors, - exception_flavor_array_t old_flavors -); - -/* Routine task_swap_exception_ports */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t task_swap_exception_ports -( - task_t task, - exception_mask_t exception_mask, - mach_port_t new_port, - exception_behavior_t behavior, - thread_state_flavor_t new_flavor, - exception_mask_array_t masks, - mach_msg_type_number_t *masksCnt, - exception_handler_array_t old_handlerss, - exception_behavior_array_t old_behaviors, - exception_flavor_array_t old_flavors -); - -/* Routine lock_set_create */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t lock_set_create -( - task_t task, - lock_set_t *new_lock_set, - int n_ulocks, - int policy -); - -/* Routine lock_set_destroy */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t lock_set_destroy -( - task_t task, - lock_set_t lock_set -); - -/* Routine semaphore_create */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t semaphore_create -( - task_t task, - semaphore_t *semaphore, - int policy, - int value -); - -/* Routine semaphore_destroy */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t semaphore_destroy -( - task_t task, - semaphore_t semaphore -); - -/* Routine task_policy_set */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t task_policy_set -( - task_t task, - task_policy_flavor_t flavor, - task_policy_t policy_info, - mach_msg_type_number_t policy_infoCnt -); - -/* Routine task_policy_get */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t task_policy_get -( - task_t task, - task_policy_flavor_t flavor, - task_policy_t policy_info, - mach_msg_type_number_t *policy_infoCnt, - boolean_t *get_default -); - -/* Routine task_sample */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_sample -( - task_t task, - mach_port_t reply -); - -/* Routine task_policy */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_policy -( - task_t task, - policy_t policy, - policy_base_t base, - mach_msg_type_number_t baseCnt, - boolean_t set_limit, - boolean_t change -); - -/* Routine task_set_emulation */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_set_emulation -( - task_t target_port, - vm_address_t routine_entry_pt, - int routine_number -); - -/* Routine task_get_emulation_vector */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_get_emulation_vector -( - task_t task, - int *vector_start, - emulation_vector_t *emulation_vector, - mach_msg_type_number_t *emulation_vectorCnt -); - -/* Routine task_set_emulation_vector */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_set_emulation_vector -( - task_t task, - int vector_start, - emulation_vector_t emulation_vector, - mach_msg_type_number_t emulation_vectorCnt -); - -/* Routine task_set_ras_pc */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_set_ras_pc -( - task_t target_task, - vm_address_t basepc, - vm_address_t boundspc -); - -/* Routine task_zone_info */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t task_zone_info -( - task_t target_task, - mach_zone_name_array_t *names, - mach_msg_type_number_t *namesCnt, - task_zone_info_array_t *info, - mach_msg_type_number_t *infoCnt -); - -/* Routine task_assign */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_assign -( - task_t task, - processor_set_t new_set, - boolean_t assign_threads -); - -/* Routine task_assign_default */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_assign_default -( - task_t task, - boolean_t assign_threads -); - -/* Routine task_get_assignment */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_get_assignment -( - task_t task, - processor_set_name_t *assigned_set -); - -/* Routine task_set_policy */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_set_policy -( - task_t task, - processor_set_t pset, - policy_t policy, - policy_base_t base, - mach_msg_type_number_t baseCnt, - policy_limit_t limit, - mach_msg_type_number_t limitCnt, - boolean_t change -); - -/* Routine task_get_state */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t task_get_state -( - task_t task, - thread_state_flavor_t flavor, - thread_state_t old_state, - mach_msg_type_number_t *old_stateCnt -); - -/* Routine task_set_state */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t task_set_state -( - task_t task, - thread_state_flavor_t flavor, - thread_state_t new_state, - mach_msg_type_number_t new_stateCnt -); - -/* Routine task_set_phys_footprint_limit */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t task_set_phys_footprint_limit -( - task_t task, - int new_limit, - int *old_limit -); - -/* Routine task_suspend2 */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t task_suspend2 -( - task_t target_task, - task_suspension_token_t *suspend_token -); - -/* Routine task_resume2 */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t task_resume2 -( - task_suspension_token_t suspend_token -); - -/* Routine task_purgable_info */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_purgable_info -( - task_t task, - task_purgable_info_t *stats -); - -/* Routine task_get_mach_voucher */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t task_get_mach_voucher -( - task_t task, - mach_voucher_selector_t which, - ipc_voucher_t *voucher -); - -/* Routine task_set_mach_voucher */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t task_set_mach_voucher -( - task_t task, - ipc_voucher_t voucher -); - -/* Routine task_swap_mach_voucher */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t task_swap_mach_voucher -( - task_t task, - ipc_voucher_t new_voucher, - ipc_voucher_t *old_voucher -); - -/* Routine task_generate_corpse */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_generate_corpse -( - task_t task, - mach_port_t *corpse_task_port -); - -/* Routine task_map_corpse_info */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_map_corpse_info -( - task_t task, - task_t corspe_task, - vm_address_t *kcd_addr_begin, - uint32_t *kcd_size -); - -/* Routine task_register_dyld_image_infos */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_register_dyld_image_infos -( - task_t task, - dyld_kernel_image_info_array_t dyld_images, - mach_msg_type_number_t dyld_imagesCnt -); - -/* Routine task_unregister_dyld_image_infos */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_unregister_dyld_image_infos -( - task_t task, - dyld_kernel_image_info_array_t dyld_images, - mach_msg_type_number_t dyld_imagesCnt -); - -/* Routine task_get_dyld_image_infos */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_get_dyld_image_infos -( - task_inspect_t task, - dyld_kernel_image_info_array_t *dyld_images, - mach_msg_type_number_t *dyld_imagesCnt -); - -/* Routine task_register_dyld_shared_cache_image_info */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_register_dyld_shared_cache_image_info -( - task_t task, - dyld_kernel_image_info_t dyld_cache_image, - boolean_t no_cache, - boolean_t private_cache -); - -/* Routine task_register_dyld_set_dyld_state */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_register_dyld_set_dyld_state -( - task_t task, - uint8_t dyld_state -); - -/* Routine task_register_dyld_get_process_state */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_register_dyld_get_process_state -( - task_t task, - dyld_kernel_process_info_t *dyld_process_state -); - -/* Routine task_map_corpse_info_64 */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_map_corpse_info_64 -( - task_t task, - task_t corspe_task, - mach_vm_address_t *kcd_addr_begin, - mach_vm_size_t *kcd_size -); - -/* Routine task_inspect */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_inspect -( - task_inspect_t task, - task_inspect_flavor_t flavor, - task_inspect_info_t info_out, - mach_msg_type_number_t *info_outCnt -); - -/* Routine task_get_exc_guard_behavior */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_get_exc_guard_behavior -( - task_inspect_t task, - task_exc_guard_behavior_t *behavior -); - -/* Routine task_set_exc_guard_behavior */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_set_exc_guard_behavior -( - task_t task, - task_exc_guard_behavior_t behavior -); - -/* Routine task_create_suid_cred */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t task_create_suid_cred -( - task_t task, - suid_cred_path_t path, - suid_cred_uid_t uid, - suid_cred_t *delegation -); - -__END_DECLS - -/********************** Caution **************************/ -/* The following data types should be used to calculate */ -/* maximum message sizes only. The actual message may be */ -/* smaller, and the position of the arguments within the */ -/* message layout may vary from what is presented here. */ -/* For example, if any of the arguments are variable- */ -/* sized, and less than the maximum is sent, the data */ -/* will be packed tight in the actual message to reduce */ -/* the presence of holes. */ -/********************** Caution **************************/ - -/* typedefs for all requests */ - -#ifndef __Request__task_subsystem__defined -#define __Request__task_subsystem__defined - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_ool_ports_descriptor_t ledgers; - /* end of the kernel processed data */ - NDR_record_t NDR; - mach_msg_type_number_t ledgersCnt; - boolean_t inherit_memory; - } __Request__task_create_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__task_terminate_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__task_threads_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_ool_ports_descriptor_t init_port_set; - /* end of the kernel processed data */ - NDR_record_t NDR; - mach_msg_type_number_t init_port_setCnt; - } __Request__mach_ports_register_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__mach_ports_lookup_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - task_flavor_t flavor; - mach_msg_type_number_t task_info_outCnt; - } __Request__task_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - task_flavor_t flavor; - mach_msg_type_number_t task_info_inCnt; - integer_t task_info_in[87]; - } __Request__task_set_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__task_suspend_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__task_resume_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - int which_port; - } __Request__task_get_special_port_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t special_port; - /* end of the kernel processed data */ - NDR_record_t NDR; - int which_port; - } __Request__task_set_special_port_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__thread_create_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - thread_state_flavor_t flavor; - mach_msg_type_number_t new_stateCnt; - natural_t new_state[614]; - } __Request__thread_create_running_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t new_port; - /* end of the kernel processed data */ - NDR_record_t NDR; - exception_mask_t exception_mask; - exception_behavior_t behavior; - thread_state_flavor_t new_flavor; - } __Request__task_set_exception_ports_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - exception_mask_t exception_mask; - } __Request__task_get_exception_ports_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t new_port; - /* end of the kernel processed data */ - NDR_record_t NDR; - exception_mask_t exception_mask; - exception_behavior_t behavior; - thread_state_flavor_t new_flavor; - } __Request__task_swap_exception_ports_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - int n_ulocks; - int policy; - } __Request__lock_set_create_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t lock_set; - /* end of the kernel processed data */ - } __Request__lock_set_destroy_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - int policy; - int value; - } __Request__semaphore_create_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t semaphore; - /* end of the kernel processed data */ - } __Request__semaphore_destroy_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - task_policy_flavor_t flavor; - mach_msg_type_number_t policy_infoCnt; - integer_t policy_info[16]; - } __Request__task_policy_set_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - task_policy_flavor_t flavor; - mach_msg_type_number_t policy_infoCnt; - boolean_t get_default; - } __Request__task_policy_get_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t reply; - /* end of the kernel processed data */ - } __Request__task_sample_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - policy_t policy; - mach_msg_type_number_t baseCnt; - integer_t base[5]; - boolean_t set_limit; - boolean_t change; - } __Request__task_policy_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - vm_address_t routine_entry_pt; - int routine_number; - } __Request__task_set_emulation_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__task_get_emulation_vector_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_ool_descriptor_t emulation_vector; - /* end of the kernel processed data */ - NDR_record_t NDR; - int vector_start; - mach_msg_type_number_t emulation_vectorCnt; - } __Request__task_set_emulation_vector_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - vm_address_t basepc; - vm_address_t boundspc; - } __Request__task_set_ras_pc_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__task_zone_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t new_set; - /* end of the kernel processed data */ - NDR_record_t NDR; - boolean_t assign_threads; - } __Request__task_assign_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - boolean_t assign_threads; - } __Request__task_assign_default_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__task_get_assignment_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t pset; - /* end of the kernel processed data */ - NDR_record_t NDR; - policy_t policy; - mach_msg_type_number_t baseCnt; - integer_t base[5]; - mach_msg_type_number_t limitCnt; - integer_t limit[1]; - boolean_t change; - } __Request__task_set_policy_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - thread_state_flavor_t flavor; - mach_msg_type_number_t old_stateCnt; - } __Request__task_get_state_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - thread_state_flavor_t flavor; - mach_msg_type_number_t new_stateCnt; - natural_t new_state[614]; - } __Request__task_set_state_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - int new_limit; - } __Request__task_set_phys_footprint_limit_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__task_suspend2_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__task_resume2_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__task_purgable_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_voucher_selector_t which; - } __Request__task_get_mach_voucher_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t voucher; - /* end of the kernel processed data */ - } __Request__task_set_mach_voucher_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t new_voucher; - mach_msg_port_descriptor_t old_voucher; - /* end of the kernel processed data */ - } __Request__task_swap_mach_voucher_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__task_generate_corpse_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t corspe_task; - /* end of the kernel processed data */ - } __Request__task_map_corpse_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_ool_descriptor_t dyld_images; - /* end of the kernel processed data */ - NDR_record_t NDR; - mach_msg_type_number_t dyld_imagesCnt; - } __Request__task_register_dyld_image_infos_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_ool_descriptor_t dyld_images; - /* end of the kernel processed data */ - NDR_record_t NDR; - mach_msg_type_number_t dyld_imagesCnt; - } __Request__task_unregister_dyld_image_infos_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__task_get_dyld_image_infos_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - dyld_kernel_image_info_t dyld_cache_image; - boolean_t no_cache; - boolean_t private_cache; - } __Request__task_register_dyld_shared_cache_image_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - uint8_t dyld_state; - char dyld_statePad[3]; - } __Request__task_register_dyld_set_dyld_state_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__task_register_dyld_get_process_state_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t corspe_task; - /* end of the kernel processed data */ - } __Request__task_map_corpse_info_64_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - task_inspect_flavor_t flavor; - mach_msg_type_number_t info_outCnt; - } __Request__task_inspect_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__task_get_exc_guard_behavior_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - task_exc_guard_behavior_t behavior; - } __Request__task_set_exc_guard_behavior_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_msg_type_number_t pathOffset; /* MiG doesn't use it */ - mach_msg_type_number_t pathCnt; - char path[1024]; - suid_cred_uid_t uid; - } __Request__task_create_suid_cred_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif -#endif /* !__Request__task_subsystem__defined */ - -/* union of all requests */ - -#ifndef __RequestUnion__task_subsystem__defined -#define __RequestUnion__task_subsystem__defined -union __RequestUnion__task_subsystem { - __Request__task_create_t Request_task_create; - __Request__task_terminate_t Request_task_terminate; - __Request__task_threads_t Request_task_threads; - __Request__mach_ports_register_t Request_mach_ports_register; - __Request__mach_ports_lookup_t Request_mach_ports_lookup; - __Request__task_info_t Request_task_info; - __Request__task_set_info_t Request_task_set_info; - __Request__task_suspend_t Request_task_suspend; - __Request__task_resume_t Request_task_resume; - __Request__task_get_special_port_t Request_task_get_special_port; - __Request__task_set_special_port_t Request_task_set_special_port; - __Request__thread_create_t Request_thread_create; - __Request__thread_create_running_t Request_thread_create_running; - __Request__task_set_exception_ports_t Request_task_set_exception_ports; - __Request__task_get_exception_ports_t Request_task_get_exception_ports; - __Request__task_swap_exception_ports_t Request_task_swap_exception_ports; - __Request__lock_set_create_t Request_lock_set_create; - __Request__lock_set_destroy_t Request_lock_set_destroy; - __Request__semaphore_create_t Request_semaphore_create; - __Request__semaphore_destroy_t Request_semaphore_destroy; - __Request__task_policy_set_t Request_task_policy_set; - __Request__task_policy_get_t Request_task_policy_get; - __Request__task_sample_t Request_task_sample; - __Request__task_policy_t Request_task_policy; - __Request__task_set_emulation_t Request_task_set_emulation; - __Request__task_get_emulation_vector_t Request_task_get_emulation_vector; - __Request__task_set_emulation_vector_t Request_task_set_emulation_vector; - __Request__task_set_ras_pc_t Request_task_set_ras_pc; - __Request__task_zone_info_t Request_task_zone_info; - __Request__task_assign_t Request_task_assign; - __Request__task_assign_default_t Request_task_assign_default; - __Request__task_get_assignment_t Request_task_get_assignment; - __Request__task_set_policy_t Request_task_set_policy; - __Request__task_get_state_t Request_task_get_state; - __Request__task_set_state_t Request_task_set_state; - __Request__task_set_phys_footprint_limit_t Request_task_set_phys_footprint_limit; - __Request__task_suspend2_t Request_task_suspend2; - __Request__task_resume2_t Request_task_resume2; - __Request__task_purgable_info_t Request_task_purgable_info; - __Request__task_get_mach_voucher_t Request_task_get_mach_voucher; - __Request__task_set_mach_voucher_t Request_task_set_mach_voucher; - __Request__task_swap_mach_voucher_t Request_task_swap_mach_voucher; - __Request__task_generate_corpse_t Request_task_generate_corpse; - __Request__task_map_corpse_info_t Request_task_map_corpse_info; - __Request__task_register_dyld_image_infos_t Request_task_register_dyld_image_infos; - __Request__task_unregister_dyld_image_infos_t Request_task_unregister_dyld_image_infos; - __Request__task_get_dyld_image_infos_t Request_task_get_dyld_image_infos; - __Request__task_register_dyld_shared_cache_image_info_t Request_task_register_dyld_shared_cache_image_info; - __Request__task_register_dyld_set_dyld_state_t Request_task_register_dyld_set_dyld_state; - __Request__task_register_dyld_get_process_state_t Request_task_register_dyld_get_process_state; - __Request__task_map_corpse_info_64_t Request_task_map_corpse_info_64; - __Request__task_inspect_t Request_task_inspect; - __Request__task_get_exc_guard_behavior_t Request_task_get_exc_guard_behavior; - __Request__task_set_exc_guard_behavior_t Request_task_set_exc_guard_behavior; - __Request__task_create_suid_cred_t Request_task_create_suid_cred; -}; -#endif /* !__RequestUnion__task_subsystem__defined */ -/* typedefs for all replies */ - -#ifndef __Reply__task_subsystem__defined -#define __Reply__task_subsystem__defined - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t child_task; - /* end of the kernel processed data */ - } __Reply__task_create_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__task_terminate_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_ool_ports_descriptor_t act_list; - /* end of the kernel processed data */ - NDR_record_t NDR; - mach_msg_type_number_t act_listCnt; - } __Reply__task_threads_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__mach_ports_register_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_ool_ports_descriptor_t init_port_set; - /* end of the kernel processed data */ - NDR_record_t NDR; - mach_msg_type_number_t init_port_setCnt; - } __Reply__mach_ports_lookup_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - mach_msg_type_number_t task_info_outCnt; - integer_t task_info_out[87]; - } __Reply__task_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__task_set_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__task_suspend_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__task_resume_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t special_port; - /* end of the kernel processed data */ - } __Reply__task_get_special_port_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__task_set_special_port_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t child_act; - /* end of the kernel processed data */ - } __Reply__thread_create_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t child_act; - /* end of the kernel processed data */ - } __Reply__thread_create_running_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__task_set_exception_ports_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t old_handlers[32]; - /* end of the kernel processed data */ - NDR_record_t NDR; - mach_msg_type_number_t masksCnt; - exception_mask_t masks[32]; - exception_behavior_t old_behaviors[32]; - thread_state_flavor_t old_flavors[32]; - } __Reply__task_get_exception_ports_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t old_handlerss[32]; - /* end of the kernel processed data */ - NDR_record_t NDR; - mach_msg_type_number_t masksCnt; - exception_mask_t masks[32]; - exception_behavior_t old_behaviors[32]; - thread_state_flavor_t old_flavors[32]; - } __Reply__task_swap_exception_ports_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t new_lock_set; - /* end of the kernel processed data */ - } __Reply__lock_set_create_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__lock_set_destroy_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t semaphore; - /* end of the kernel processed data */ - } __Reply__semaphore_create_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__semaphore_destroy_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__task_policy_set_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - mach_msg_type_number_t policy_infoCnt; - integer_t policy_info[16]; - boolean_t get_default; - } __Reply__task_policy_get_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__task_sample_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__task_policy_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__task_set_emulation_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_ool_descriptor_t emulation_vector; - /* end of the kernel processed data */ - NDR_record_t NDR; - int vector_start; - mach_msg_type_number_t emulation_vectorCnt; - } __Reply__task_get_emulation_vector_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__task_set_emulation_vector_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__task_set_ras_pc_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_ool_descriptor_t names; - mach_msg_ool_descriptor_t info; - /* end of the kernel processed data */ - NDR_record_t NDR; - mach_msg_type_number_t namesCnt; - mach_msg_type_number_t infoCnt; - } __Reply__task_zone_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__task_assign_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__task_assign_default_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t assigned_set; - /* end of the kernel processed data */ - } __Reply__task_get_assignment_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__task_set_policy_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - mach_msg_type_number_t old_stateCnt; - natural_t old_state[614]; - } __Reply__task_get_state_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__task_set_state_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - int old_limit; - } __Reply__task_set_phys_footprint_limit_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t suspend_token; - /* end of the kernel processed data */ - } __Reply__task_suspend2_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__task_resume2_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - task_purgable_info_t stats; - } __Reply__task_purgable_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t voucher; - /* end of the kernel processed data */ - } __Reply__task_get_mach_voucher_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__task_set_mach_voucher_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t old_voucher; - /* end of the kernel processed data */ - } __Reply__task_swap_mach_voucher_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t corpse_task_port; - /* end of the kernel processed data */ - } __Reply__task_generate_corpse_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - vm_address_t kcd_addr_begin; - uint32_t kcd_size; - } __Reply__task_map_corpse_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__task_register_dyld_image_infos_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__task_unregister_dyld_image_infos_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_ool_descriptor_t dyld_images; - /* end of the kernel processed data */ - NDR_record_t NDR; - mach_msg_type_number_t dyld_imagesCnt; - } __Reply__task_get_dyld_image_infos_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__task_register_dyld_shared_cache_image_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__task_register_dyld_set_dyld_state_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - dyld_kernel_process_info_t dyld_process_state; - } __Reply__task_register_dyld_get_process_state_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - mach_vm_address_t kcd_addr_begin; - mach_vm_size_t kcd_size; - } __Reply__task_map_corpse_info_64_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - mach_msg_type_number_t info_outCnt; - integer_t info_out[4]; - } __Reply__task_inspect_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - task_exc_guard_behavior_t behavior; - } __Reply__task_get_exc_guard_behavior_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__task_set_exc_guard_behavior_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t delegation; - /* end of the kernel processed data */ - } __Reply__task_create_suid_cred_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif -#endif /* !__Reply__task_subsystem__defined */ - -/* union of all replies */ - -#ifndef __ReplyUnion__task_subsystem__defined -#define __ReplyUnion__task_subsystem__defined -union __ReplyUnion__task_subsystem { - __Reply__task_create_t Reply_task_create; - __Reply__task_terminate_t Reply_task_terminate; - __Reply__task_threads_t Reply_task_threads; - __Reply__mach_ports_register_t Reply_mach_ports_register; - __Reply__mach_ports_lookup_t Reply_mach_ports_lookup; - __Reply__task_info_t Reply_task_info; - __Reply__task_set_info_t Reply_task_set_info; - __Reply__task_suspend_t Reply_task_suspend; - __Reply__task_resume_t Reply_task_resume; - __Reply__task_get_special_port_t Reply_task_get_special_port; - __Reply__task_set_special_port_t Reply_task_set_special_port; - __Reply__thread_create_t Reply_thread_create; - __Reply__thread_create_running_t Reply_thread_create_running; - __Reply__task_set_exception_ports_t Reply_task_set_exception_ports; - __Reply__task_get_exception_ports_t Reply_task_get_exception_ports; - __Reply__task_swap_exception_ports_t Reply_task_swap_exception_ports; - __Reply__lock_set_create_t Reply_lock_set_create; - __Reply__lock_set_destroy_t Reply_lock_set_destroy; - __Reply__semaphore_create_t Reply_semaphore_create; - __Reply__semaphore_destroy_t Reply_semaphore_destroy; - __Reply__task_policy_set_t Reply_task_policy_set; - __Reply__task_policy_get_t Reply_task_policy_get; - __Reply__task_sample_t Reply_task_sample; - __Reply__task_policy_t Reply_task_policy; - __Reply__task_set_emulation_t Reply_task_set_emulation; - __Reply__task_get_emulation_vector_t Reply_task_get_emulation_vector; - __Reply__task_set_emulation_vector_t Reply_task_set_emulation_vector; - __Reply__task_set_ras_pc_t Reply_task_set_ras_pc; - __Reply__task_zone_info_t Reply_task_zone_info; - __Reply__task_assign_t Reply_task_assign; - __Reply__task_assign_default_t Reply_task_assign_default; - __Reply__task_get_assignment_t Reply_task_get_assignment; - __Reply__task_set_policy_t Reply_task_set_policy; - __Reply__task_get_state_t Reply_task_get_state; - __Reply__task_set_state_t Reply_task_set_state; - __Reply__task_set_phys_footprint_limit_t Reply_task_set_phys_footprint_limit; - __Reply__task_suspend2_t Reply_task_suspend2; - __Reply__task_resume2_t Reply_task_resume2; - __Reply__task_purgable_info_t Reply_task_purgable_info; - __Reply__task_get_mach_voucher_t Reply_task_get_mach_voucher; - __Reply__task_set_mach_voucher_t Reply_task_set_mach_voucher; - __Reply__task_swap_mach_voucher_t Reply_task_swap_mach_voucher; - __Reply__task_generate_corpse_t Reply_task_generate_corpse; - __Reply__task_map_corpse_info_t Reply_task_map_corpse_info; - __Reply__task_register_dyld_image_infos_t Reply_task_register_dyld_image_infos; - __Reply__task_unregister_dyld_image_infos_t Reply_task_unregister_dyld_image_infos; - __Reply__task_get_dyld_image_infos_t Reply_task_get_dyld_image_infos; - __Reply__task_register_dyld_shared_cache_image_info_t Reply_task_register_dyld_shared_cache_image_info; - __Reply__task_register_dyld_set_dyld_state_t Reply_task_register_dyld_set_dyld_state; - __Reply__task_register_dyld_get_process_state_t Reply_task_register_dyld_get_process_state; - __Reply__task_map_corpse_info_64_t Reply_task_map_corpse_info_64; - __Reply__task_inspect_t Reply_task_inspect; - __Reply__task_get_exc_guard_behavior_t Reply_task_get_exc_guard_behavior; - __Reply__task_set_exc_guard_behavior_t Reply_task_set_exc_guard_behavior; - __Reply__task_create_suid_cred_t Reply_task_create_suid_cred; -}; -#endif /* !__RequestUnion__task_subsystem__defined */ - -#ifndef subsystem_to_name_map_task -#define subsystem_to_name_map_task \ - { "task_create", 3400 },\ - { "task_terminate", 3401 },\ - { "task_threads", 3402 },\ - { "mach_ports_register", 3403 },\ - { "mach_ports_lookup", 3404 },\ - { "task_info", 3405 },\ - { "task_set_info", 3406 },\ - { "task_suspend", 3407 },\ - { "task_resume", 3408 },\ - { "task_get_special_port", 3409 },\ - { "task_set_special_port", 3410 },\ - { "thread_create", 3411 },\ - { "thread_create_running", 3412 },\ - { "task_set_exception_ports", 3413 },\ - { "task_get_exception_ports", 3414 },\ - { "task_swap_exception_ports", 3415 },\ - { "lock_set_create", 3416 },\ - { "lock_set_destroy", 3417 },\ - { "semaphore_create", 3418 },\ - { "semaphore_destroy", 3419 },\ - { "task_policy_set", 3420 },\ - { "task_policy_get", 3421 },\ - { "task_sample", 3422 },\ - { "task_policy", 3423 },\ - { "task_set_emulation", 3424 },\ - { "task_get_emulation_vector", 3425 },\ - { "task_set_emulation_vector", 3426 },\ - { "task_set_ras_pc", 3427 },\ - { "task_zone_info", 3428 },\ - { "task_assign", 3429 },\ - { "task_assign_default", 3430 },\ - { "task_get_assignment", 3431 },\ - { "task_set_policy", 3432 },\ - { "task_get_state", 3433 },\ - { "task_set_state", 3434 },\ - { "task_set_phys_footprint_limit", 3435 },\ - { "task_suspend2", 3436 },\ - { "task_resume2", 3437 },\ - { "task_purgable_info", 3438 },\ - { "task_get_mach_voucher", 3439 },\ - { "task_set_mach_voucher", 3440 },\ - { "task_swap_mach_voucher", 3441 },\ - { "task_generate_corpse", 3442 },\ - { "task_map_corpse_info", 3443 },\ - { "task_register_dyld_image_infos", 3444 },\ - { "task_unregister_dyld_image_infos", 3445 },\ - { "task_get_dyld_image_infos", 3446 },\ - { "task_register_dyld_shared_cache_image_info", 3447 },\ - { "task_register_dyld_set_dyld_state", 3448 },\ - { "task_register_dyld_get_process_state", 3449 },\ - { "task_map_corpse_info_64", 3450 },\ - { "task_inspect", 3451 },\ - { "task_get_exc_guard_behavior", 3452 },\ - { "task_set_exc_guard_behavior", 3453 },\ - { "task_create_suid_cred", 3454 } -#endif - -#ifdef __AfterMigUserHeader -__AfterMigUserHeader -#endif /* __AfterMigUserHeader */ - -#endif /* _task_user_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/task_info.h b/lib/libc/include/x86_64-macos-gnu/mach/task_info.h deleted file mode 100644 index 5b2046a700..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/task_info.h +++ /dev/null @@ -1,478 +0,0 @@ -/* - * Copyright (c) 2000-2007, 2015 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * @OSF_COPYRIGHT@ - */ -/* - * Mach Operating System - * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ -/* - * Machine-independent task information structures and definitions. - * - * The definitions in this file are exported to the user. The kernel - * will translate its internal data structures to these structures - * as appropriate. - * - */ - -#ifndef _MACH_TASK_INFO_H_ -#define _MACH_TASK_INFO_H_ - -#include -#include -#include -#include -#include /* for vm_extmod_statistics_data_t */ -#include - -#include - -/* - * Generic information structure to allow for expansion. - */ -typedef natural_t task_flavor_t; -typedef integer_t *task_info_t; /* varying array of int */ - -/* Deprecated, use per structure _data_t's instead */ -#define TASK_INFO_MAX (1024) /* maximum array size */ -typedef integer_t task_info_data_t[TASK_INFO_MAX]; - -/* - * Currently defined information structures. - */ - -#pragma pack(push, 4) - -/* Don't use this, use MACH_TASK_BASIC_INFO instead */ -#define TASK_BASIC_INFO_32 4 /* basic information */ -#define TASK_BASIC2_INFO_32 6 - -struct task_basic_info_32 { - integer_t suspend_count; /* suspend count for task */ - natural_t virtual_size; /* virtual memory size (bytes) */ - natural_t resident_size; /* resident memory size (bytes) */ - time_value_t user_time; /* total user run time for - * terminated threads */ - time_value_t system_time; /* total system run time for - * terminated threads */ - policy_t policy; /* default policy for new threads */ -}; -typedef struct task_basic_info_32 task_basic_info_32_data_t; -typedef struct task_basic_info_32 *task_basic_info_32_t; -#define TASK_BASIC_INFO_32_COUNT \ - (sizeof(task_basic_info_32_data_t) / sizeof(natural_t)) - -/* Don't use this, use MACH_TASK_BASIC_INFO instead */ -struct task_basic_info_64 { - integer_t suspend_count; /* suspend count for task */ - mach_vm_size_t virtual_size; /* virtual memory size (bytes) */ - mach_vm_size_t resident_size; /* resident memory size (bytes) */ - time_value_t user_time; /* total user run time for - * terminated threads */ - time_value_t system_time; /* total system run time for - * terminated threads */ - policy_t policy; /* default policy for new threads */ -}; -typedef struct task_basic_info_64 task_basic_info_64_data_t; -typedef struct task_basic_info_64 *task_basic_info_64_t; - -#define TASK_BASIC_INFO_64 5 /* 64-bit capable basic info */ -#define TASK_BASIC_INFO_64_COUNT \ - (sizeof(task_basic_info_64_data_t) / sizeof(natural_t)) - - -/* localized structure - cannot be safely passed between tasks of differing sizes */ -/* Don't use this, use MACH_TASK_BASIC_INFO instead */ -struct task_basic_info { - integer_t suspend_count; /* suspend count for task */ - vm_size_t virtual_size; /* virtual memory size (bytes) */ - vm_size_t resident_size; /* resident memory size (bytes) */ - time_value_t user_time; /* total user run time for - * terminated threads */ - time_value_t system_time; /* total system run time for - * terminated threads */ - policy_t policy; /* default policy for new threads */ -}; - -typedef struct task_basic_info task_basic_info_data_t; -typedef struct task_basic_info *task_basic_info_t; -#define TASK_BASIC_INFO_COUNT \ - (sizeof(task_basic_info_data_t) / sizeof(natural_t)) -#if !defined(__LP64__) -#define TASK_BASIC_INFO TASK_BASIC_INFO_32 -#else -#define TASK_BASIC_INFO TASK_BASIC_INFO_64 -#endif - - - -#define TASK_EVENTS_INFO 2 /* various event counts */ - -struct task_events_info { - integer_t faults; /* number of page faults */ - integer_t pageins; /* number of actual pageins */ - integer_t cow_faults; /* number of copy-on-write faults */ - integer_t messages_sent; /* number of messages sent */ - integer_t messages_received; /* number of messages received */ - integer_t syscalls_mach; /* number of mach system calls */ - integer_t syscalls_unix; /* number of unix system calls */ - integer_t csw; /* number of context switches */ -}; -typedef struct task_events_info task_events_info_data_t; -typedef struct task_events_info *task_events_info_t; -#define TASK_EVENTS_INFO_COUNT ((mach_msg_type_number_t) \ - (sizeof(task_events_info_data_t) / sizeof(natural_t))) - -#define TASK_THREAD_TIMES_INFO 3 /* total times for live threads - - * only accurate if suspended */ - -struct task_thread_times_info { - time_value_t user_time; /* total user run time for - * live threads */ - time_value_t system_time; /* total system run time for - * live threads */ -}; - -typedef struct task_thread_times_info task_thread_times_info_data_t; -typedef struct task_thread_times_info *task_thread_times_info_t; -#define TASK_THREAD_TIMES_INFO_COUNT ((mach_msg_type_number_t) \ - (sizeof(task_thread_times_info_data_t) / sizeof(natural_t))) - -#define TASK_ABSOLUTETIME_INFO 1 - -struct task_absolutetime_info { - uint64_t total_user; - uint64_t total_system; - uint64_t threads_user; /* existing threads only */ - uint64_t threads_system; -}; - -typedef struct task_absolutetime_info task_absolutetime_info_data_t; -typedef struct task_absolutetime_info *task_absolutetime_info_t; -#define TASK_ABSOLUTETIME_INFO_COUNT ((mach_msg_type_number_t) \ - (sizeof (task_absolutetime_info_data_t) / sizeof (natural_t))) - -#define TASK_KERNELMEMORY_INFO 7 - -struct task_kernelmemory_info { - uint64_t total_palloc; /* private kernel mem alloc'ed */ - uint64_t total_pfree; /* private kernel mem freed */ - uint64_t total_salloc; /* shared kernel mem alloc'ed */ - uint64_t total_sfree; /* shared kernel mem freed */ -}; - -typedef struct task_kernelmemory_info task_kernelmemory_info_data_t; -typedef struct task_kernelmemory_info *task_kernelmemory_info_t; -#define TASK_KERNELMEMORY_INFO_COUNT ((mach_msg_type_number_t) \ - (sizeof (task_kernelmemory_info_data_t) / sizeof (natural_t))) - -#define TASK_SECURITY_TOKEN 13 -#define TASK_SECURITY_TOKEN_COUNT ((mach_msg_type_number_t) \ - (sizeof(security_token_t) / sizeof(natural_t))) - -#define TASK_AUDIT_TOKEN 15 -#define TASK_AUDIT_TOKEN_COUNT \ - (sizeof(audit_token_t) / sizeof(natural_t)) - - -#define TASK_AFFINITY_TAG_INFO 16 /* This is experimental. */ - -struct task_affinity_tag_info { - integer_t set_count; - integer_t min; - integer_t max; - integer_t task_count; -}; -typedef struct task_affinity_tag_info task_affinity_tag_info_data_t; -typedef struct task_affinity_tag_info *task_affinity_tag_info_t; -#define TASK_AFFINITY_TAG_INFO_COUNT \ - (sizeof(task_affinity_tag_info_data_t) / sizeof(natural_t)) - -#define TASK_DYLD_INFO 17 - -struct task_dyld_info { - mach_vm_address_t all_image_info_addr; - mach_vm_size_t all_image_info_size; - integer_t all_image_info_format; -}; -typedef struct task_dyld_info task_dyld_info_data_t; -typedef struct task_dyld_info *task_dyld_info_t; -#define TASK_DYLD_INFO_COUNT \ - (sizeof(task_dyld_info_data_t) / sizeof(natural_t)) -#define TASK_DYLD_ALL_IMAGE_INFO_32 0 /* format value */ -#define TASK_DYLD_ALL_IMAGE_INFO_64 1 /* format value */ - - -#define TASK_EXTMOD_INFO 19 - -struct task_extmod_info { - unsigned char task_uuid[16]; - vm_extmod_statistics_data_t extmod_statistics; -}; -typedef struct task_extmod_info task_extmod_info_data_t; -typedef struct task_extmod_info *task_extmod_info_t; -#define TASK_EXTMOD_INFO_COUNT \ - (sizeof(task_extmod_info_data_t) / sizeof(natural_t)) - - -#define MACH_TASK_BASIC_INFO 20 /* always 64-bit basic info */ -struct mach_task_basic_info { - mach_vm_size_t virtual_size; /* virtual memory size (bytes) */ - mach_vm_size_t resident_size; /* resident memory size (bytes) */ - mach_vm_size_t resident_size_max; /* maximum resident memory size (bytes) */ - time_value_t user_time; /* total user run time for - * terminated threads */ - time_value_t system_time; /* total system run time for - * terminated threads */ - policy_t policy; /* default policy for new threads */ - integer_t suspend_count; /* suspend count for task */ -}; -typedef struct mach_task_basic_info mach_task_basic_info_data_t; -typedef struct mach_task_basic_info *mach_task_basic_info_t; -#define MACH_TASK_BASIC_INFO_COUNT \ - (sizeof(mach_task_basic_info_data_t) / sizeof(natural_t)) - - -#define TASK_POWER_INFO 21 - -struct task_power_info { - uint64_t total_user; - uint64_t total_system; - uint64_t task_interrupt_wakeups; - uint64_t task_platform_idle_wakeups; - uint64_t task_timer_wakeups_bin_1; - uint64_t task_timer_wakeups_bin_2; -}; - -typedef struct task_power_info task_power_info_data_t; -typedef struct task_power_info *task_power_info_t; -#define TASK_POWER_INFO_COUNT ((mach_msg_type_number_t) \ - (sizeof (task_power_info_data_t) / sizeof (natural_t))) - - - -#define TASK_VM_INFO 22 -#define TASK_VM_INFO_PURGEABLE 23 -struct task_vm_info { - mach_vm_size_t virtual_size; /* virtual memory size (bytes) */ - integer_t region_count; /* number of memory regions */ - integer_t page_size; - mach_vm_size_t resident_size; /* resident memory size (bytes) */ - mach_vm_size_t resident_size_peak; /* peak resident size (bytes) */ - - mach_vm_size_t device; - mach_vm_size_t device_peak; - mach_vm_size_t internal; - mach_vm_size_t internal_peak; - mach_vm_size_t external; - mach_vm_size_t external_peak; - mach_vm_size_t reusable; - mach_vm_size_t reusable_peak; - mach_vm_size_t purgeable_volatile_pmap; - mach_vm_size_t purgeable_volatile_resident; - mach_vm_size_t purgeable_volatile_virtual; - mach_vm_size_t compressed; - mach_vm_size_t compressed_peak; - mach_vm_size_t compressed_lifetime; - - /* added for rev1 */ - mach_vm_size_t phys_footprint; - - /* added for rev2 */ - mach_vm_address_t min_address; - mach_vm_address_t max_address; - - /* added for rev3 */ - int64_t ledger_phys_footprint_peak; - int64_t ledger_purgeable_nonvolatile; - int64_t ledger_purgeable_novolatile_compressed; - int64_t ledger_purgeable_volatile; - int64_t ledger_purgeable_volatile_compressed; - int64_t ledger_tag_network_nonvolatile; - int64_t ledger_tag_network_nonvolatile_compressed; - int64_t ledger_tag_network_volatile; - int64_t ledger_tag_network_volatile_compressed; - int64_t ledger_tag_media_footprint; - int64_t ledger_tag_media_footprint_compressed; - int64_t ledger_tag_media_nofootprint; - int64_t ledger_tag_media_nofootprint_compressed; - int64_t ledger_tag_graphics_footprint; - int64_t ledger_tag_graphics_footprint_compressed; - int64_t ledger_tag_graphics_nofootprint; - int64_t ledger_tag_graphics_nofootprint_compressed; - int64_t ledger_tag_neural_footprint; - int64_t ledger_tag_neural_footprint_compressed; - int64_t ledger_tag_neural_nofootprint; - int64_t ledger_tag_neural_nofootprint_compressed; - - /* added for rev4 */ - uint64_t limit_bytes_remaining; - - /* added for rev5 */ - integer_t decompressions; -}; -typedef struct task_vm_info task_vm_info_data_t; -typedef struct task_vm_info *task_vm_info_t; -#define TASK_VM_INFO_COUNT ((mach_msg_type_number_t) \ - (sizeof (task_vm_info_data_t) / sizeof (natural_t))) -#define TASK_VM_INFO_REV5_COUNT TASK_VM_INFO_COUNT -#define TASK_VM_INFO_REV4_COUNT /* doesn't include decompressions */ \ - ((mach_msg_type_number_t) (TASK_VM_INFO_REV5_COUNT - 1)) -#define TASK_VM_INFO_REV3_COUNT /* doesn't include limit bytes */ \ - ((mach_msg_type_number_t) (TASK_VM_INFO_REV4_COUNT - 2)) -#define TASK_VM_INFO_REV2_COUNT /* doesn't include extra ledgers info */ \ - ((mach_msg_type_number_t) (TASK_VM_INFO_REV3_COUNT - 42)) -#define TASK_VM_INFO_REV1_COUNT /* doesn't include min and max address */ \ - ((mach_msg_type_number_t) (TASK_VM_INFO_REV2_COUNT - 4)) -#define TASK_VM_INFO_REV0_COUNT /* doesn't include phys_footprint */ \ - ((mach_msg_type_number_t) (TASK_VM_INFO_REV1_COUNT - 2)) - -typedef struct vm_purgeable_info task_purgable_info_t; - - -#define TASK_TRACE_MEMORY_INFO 24 -struct task_trace_memory_info { - uint64_t user_memory_address; /* address of start of trace memory buffer */ - uint64_t buffer_size; /* size of buffer in bytes */ - uint64_t mailbox_array_size; /* size of mailbox area in bytes */ -}; -typedef struct task_trace_memory_info task_trace_memory_info_data_t; -typedef struct task_trace_memory_info * task_trace_memory_info_t; -#define TASK_TRACE_MEMORY_INFO_COUNT ((mach_msg_type_number_t) \ - (sizeof(task_trace_memory_info_data_t) / sizeof(natural_t))) - -#define TASK_WAIT_STATE_INFO 25 /* deprecated. */ -struct task_wait_state_info { - uint64_t total_wait_state_time; /* Time that all threads past and present have been in a wait state */ - uint64_t total_wait_sfi_state_time; /* Time that threads have been in SFI wait (should be a subset of total wait state time */ - uint32_t _reserved[4]; -}; -typedef struct task_wait_state_info task_wait_state_info_data_t; -typedef struct task_wait_state_info * task_wait_state_info_t; -#define TASK_WAIT_STATE_INFO_COUNT ((mach_msg_type_number_t) \ - (sizeof(task_wait_state_info_data_t) / sizeof(natural_t))) - -#define TASK_POWER_INFO_V2 26 - -typedef struct { - uint64_t task_gpu_utilisation; - uint64_t task_gpu_stat_reserved0; - uint64_t task_gpu_stat_reserved1; - uint64_t task_gpu_stat_reserved2; -} gpu_energy_data; - -typedef gpu_energy_data *gpu_energy_data_t; -struct task_power_info_v2 { - task_power_info_data_t cpu_energy; - gpu_energy_data gpu_energy; - uint64_t task_ptime; - uint64_t task_pset_switches; -}; - -typedef struct task_power_info_v2 task_power_info_v2_data_t; -typedef struct task_power_info_v2 *task_power_info_v2_t; -#define TASK_POWER_INFO_V2_COUNT_OLD \ - ((mach_msg_type_number_t) (sizeof (task_power_info_v2_data_t) - sizeof(uint64_t)*2) / sizeof (natural_t)) -#define TASK_POWER_INFO_V2_COUNT \ - ((mach_msg_type_number_t) (sizeof (task_power_info_v2_data_t) / sizeof (natural_t))) - -#define TASK_VM_INFO_PURGEABLE_ACCOUNT 27 /* Used for xnu purgeable vm unit tests */ - - -#define TASK_FLAGS_INFO 28 /* return t_flags field */ -struct task_flags_info { - uint32_t flags; /* task flags */ -}; -typedef struct task_flags_info task_flags_info_data_t; -typedef struct task_flags_info * task_flags_info_t; -#define TASK_FLAGS_INFO_COUNT ((mach_msg_type_number_t) \ - (sizeof(task_flags_info_data_t) / sizeof (natural_t))) - -#define TF_LP64 0x00000001 /* task has 64-bit addressing */ -#define TF_64B_DATA 0x00000002 /* task has 64-bit data registers */ - -#define TASK_DEBUG_INFO_INTERNAL 29 /* Used for kernel internal development tests. */ - - -/* - * Type to control EXC_GUARD delivery options for a task - * via task_get/set_exc_guard_behavior interface(s). - */ -typedef uint32_t task_exc_guard_behavior_t; - -/* EXC_GUARD optional delivery settings on a per-task basis */ -#define TASK_EXC_GUARD_VM_DELIVER 0x01 /* Deliver virtual memory EXC_GUARD exceptions */ -#define TASK_EXC_GUARD_VM_ONCE 0x02 /* Deliver them only once */ -#define TASK_EXC_GUARD_VM_CORPSE 0x04 /* Deliver them via a forked corpse */ -#define TASK_EXC_GUARD_VM_FATAL 0x08 /* Virtual Memory EXC_GUARD delivery is fatal */ -#define TASK_EXC_GUARD_VM_ALL 0x0f - -#define TASK_EXC_GUARD_MP_DELIVER 0x10 /* Deliver mach port EXC_GUARD exceptions */ -#define TASK_EXC_GUARD_MP_ONCE 0x20 /* Deliver them only once */ -#define TASK_EXC_GUARD_MP_CORPSE 0x40 /* Deliver them via a forked corpse */ -#define TASK_EXC_GUARD_MP_FATAL 0x80 /* mach port EXC_GUARD delivery is fatal */ -#define TASK_EXC_GUARD_MP_ALL 0xf0 - -#define TASK_EXC_GUARD_ALL 0xff /* All optional deliver settings */ - - -/* - * Obsolete interfaces. - */ - -#define TASK_SCHED_TIMESHARE_INFO 10 -#define TASK_SCHED_RR_INFO 11 -#define TASK_SCHED_FIFO_INFO 12 - -#define TASK_SCHED_INFO 14 - -#pragma pack(pop) - -#endif /* _MACH_TASK_INFO_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/task_policy.h b/lib/libc/include/x86_64-macos-gnu/mach/task_policy.h deleted file mode 100644 index 4b6d3f9449..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/task_policy.h +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Copyright (c) 2000-2005 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ - -#ifndef _MACH_TASK_POLICY_H_ -#define _MACH_TASK_POLICY_H_ - -#include - -/* - * These are the calls for accessing the policy parameters - * of a particular task. - * - * The extra 'get_default' parameter to the second call is - * IN/OUT as follows: - * 1) if asserted on the way in it indicates that the default - * values should be returned, not the ones currently set, in - * this case 'get_default' will always be asserted on return; - * 2) if unasserted on the way in, the current settings are - * desired and if still unasserted on return, then the info - * returned reflects the current settings, otherwise if - * 'get_default' returns asserted, it means that there are no - * current settings due to other parameters taking precedence, - * and the default ones are being returned instead. - */ - -typedef natural_t task_policy_flavor_t; -typedef integer_t *task_policy_t; - -/* - * kern_return_t task_policy_set( - * task_t task, - * task_policy_flavor_t flavor, - * task_policy_t policy_info, - * mach_msg_type_number_t count); - * - * kern_return_t task_policy_get( - * task_t task, - * task_policy_flavor_t flavor, - * task_policy_t policy_info, - * mach_msg_type_number_t *count, - * boolean_t *get_default); - */ - -/* - * Defined flavors. - */ -/* - * TASK_CATEGORY_POLICY: - * - * This provides information to the kernel about the role - * of the task in the system. - * - * Parameters: - * - * role: Enumerated as follows: - * - * TASK_UNSPECIFIED is the default, since the role is not - * inherited from the parent. - * - * TASK_FOREGROUND_APPLICATION should be assigned when the - * task is a normal UI application in the foreground from - * the HI point of view. - * **N.B. There may be more than one of these at a given time. - * - * TASK_BACKGROUND_APPLICATION should be assigned when the - * task is a normal UI application in the background from - * the HI point of view. - * - * TASK_CONTROL_APPLICATION should be assigned to the unique - * UI application which implements the pop-up application dialog. - * There can only be one task at a time with this designation, - * which is assigned FCFS. - * - * TASK_GRAPHICS_SERVER should be assigned to the graphics - * management (window) server. There can only be one task at - * a time with this designation, which is assigned FCFS. - */ - -#define TASK_CATEGORY_POLICY 1 - -#define TASK_SUPPRESSION_POLICY 3 -#define TASK_POLICY_STATE 4 -#define TASK_BASE_QOS_POLICY 8 -#define TASK_OVERRIDE_QOS_POLICY 9 -#define TASK_BASE_LATENCY_QOS_POLICY 10 -#define TASK_BASE_THROUGHPUT_QOS_POLICY 11 - - -enum task_role { - TASK_RENICED = -1, - TASK_UNSPECIFIED = 0, - TASK_FOREGROUND_APPLICATION = 1, - TASK_BACKGROUND_APPLICATION = 2, - TASK_CONTROL_APPLICATION = 3, - TASK_GRAPHICS_SERVER = 4, - TASK_THROTTLE_APPLICATION = 5, - TASK_NONUI_APPLICATION = 6, - TASK_DEFAULT_APPLICATION = 7, - TASK_DARWINBG_APPLICATION = 8, -}; - -typedef integer_t task_role_t; - -struct task_category_policy { - task_role_t role; -}; - -typedef struct task_category_policy task_category_policy_data_t; -typedef struct task_category_policy *task_category_policy_t; - -#define TASK_CATEGORY_POLICY_COUNT ((mach_msg_type_number_t) \ - (sizeof (task_category_policy_data_t) / sizeof (integer_t))) - - -enum task_latency_qos { - LATENCY_QOS_TIER_UNSPECIFIED = 0x0, - LATENCY_QOS_TIER_0 = ((0xFF << 16) | 1), - LATENCY_QOS_TIER_1 = ((0xFF << 16) | 2), - LATENCY_QOS_TIER_2 = ((0xFF << 16) | 3), - LATENCY_QOS_TIER_3 = ((0xFF << 16) | 4), - LATENCY_QOS_TIER_4 = ((0xFF << 16) | 5), - LATENCY_QOS_TIER_5 = ((0xFF << 16) | 6) -}; -typedef integer_t task_latency_qos_t; -enum task_throughput_qos { - THROUGHPUT_QOS_TIER_UNSPECIFIED = 0x0, - THROUGHPUT_QOS_TIER_0 = ((0xFE << 16) | 1), - THROUGHPUT_QOS_TIER_1 = ((0xFE << 16) | 2), - THROUGHPUT_QOS_TIER_2 = ((0xFE << 16) | 3), - THROUGHPUT_QOS_TIER_3 = ((0xFE << 16) | 4), - THROUGHPUT_QOS_TIER_4 = ((0xFE << 16) | 5), - THROUGHPUT_QOS_TIER_5 = ((0xFE << 16) | 6), -}; - -#define LATENCY_QOS_LAUNCH_DEFAULT_TIER LATENCY_QOS_TIER_3 -#define THROUGHPUT_QOS_LAUNCH_DEFAULT_TIER THROUGHPUT_QOS_TIER_3 - -typedef integer_t task_throughput_qos_t; - -struct task_qos_policy { - task_latency_qos_t task_latency_qos_tier; - task_throughput_qos_t task_throughput_qos_tier; -}; - -typedef struct task_qos_policy *task_qos_policy_t; -#define TASK_QOS_POLICY_COUNT ((mach_msg_type_number_t) \ - (sizeof (struct task_qos_policy) / sizeof (integer_t))) - -/* These should be removed - they belong in proc_info.h */ -#define PROC_FLAG_DARWINBG 0x8000 /* process in darwin background */ -#define PROC_FLAG_EXT_DARWINBG 0x10000 /* process in darwin background - external enforcement */ -#define PROC_FLAG_IOS_APPLEDAEMON 0x20000 /* process is apple ios daemon */ -#define PROC_FLAG_IOS_IMPPROMOTION 0x80000 /* process is apple ios daemon */ -#define PROC_FLAG_ADAPTIVE 0x100000 /* Process is adaptive */ -#define PROC_FLAG_ADAPTIVE_IMPORTANT 0x200000 /* Process is adaptive, and is currently important */ -#define PROC_FLAG_IMPORTANCE_DONOR 0x400000 /* Process is marked as an importance donor */ -#define PROC_FLAG_SUPPRESSED 0x800000 /* Process is suppressed */ -#define PROC_FLAG_APPLICATION 0x1000000 /* Process is an application */ -#define PROC_FLAG_IOS_APPLICATION PROC_FLAG_APPLICATION /* Process is an application */ - - - - -#endif /* _MACH_TASK_POLICY_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/task_special_ports.h b/lib/libc/include/x86_64-macos-gnu/mach/task_special_ports.h deleted file mode 100644 index f8ee7c2bbf..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/task_special_ports.h +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (c) 2000-2010 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * @OSF_COPYRIGHT@ - */ -/* - * Mach Operating System - * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ -/* - */ -/* - * File: mach/task_special_ports.h - * - * Defines codes for special_purpose task ports. These are NOT - * port identifiers - they are only used for the task_get_special_port - * and task_set_special_port routines. - * - */ - -#ifndef _MACH_TASK_SPECIAL_PORTS_H_ -#define _MACH_TASK_SPECIAL_PORTS_H_ - -typedef int task_special_port_t; - -#define TASK_KERNEL_PORT 1 /* Represents task to the outside - * world.*/ - -#define TASK_HOST_PORT 2 /* The host (priv) port for task. */ - -#define TASK_NAME_PORT 3 /* the name (unpriv) port for task */ - -#define TASK_BOOTSTRAP_PORT 4 /* Bootstrap environment for task. */ - -/* - * Evolving and likely to change. - */ - -#define TASK_SEATBELT_PORT 7 /* Seatbelt compiler/DEM port for task. */ - -/* PORT 8 was the GSSD TASK PORT which transformed to a host port */ - -#define TASK_ACCESS_PORT 9 /* Permission check for task_for_pid. */ - -#define TASK_DEBUG_CONTROL_PORT 10 /* debug control port */ - -#define TASK_RESOURCE_NOTIFY_PORT 11 /* overrides host special RN port */ - -#define TASK_MAX_SPECIAL_PORT TASK_RESOURCE_NOTIFY_PORT - -/* - * Definitions for ease of use - */ - -#define task_get_kernel_port(task, port) \ - (task_get_special_port((task), TASK_KERNEL_PORT, (port))) - -#define task_set_kernel_port(task, port) \ - (task_set_special_port((task), TASK_KERNEL_PORT, (port))) - -#define task_get_host_port(task, port) \ - (task_get_special_port((task), TASK_HOST_PORT, (port))) - -#define task_set_host_port(task, port) \ - (task_set_special_port((task), TASK_HOST_PORT, (port))) - -#define task_get_bootstrap_port(task, port) \ - (task_get_special_port((task), TASK_BOOTSTRAP_PORT, (port))) - -#define task_get_debug_control_port(task, port) \ - (task_get_special_port((task), TASK_DEBUG_CONTROL_PORT, (port))) - -#define task_set_bootstrap_port(task, port) \ - (task_set_special_port((task), TASK_BOOTSTRAP_PORT, (port))) - -#define task_get_task_access_port(task, port) \ - (task_get_special_port((task), TASK_ACCESS_PORT, (port))) - -#define task_set_task_access_port(task, port) \ - (task_set_special_port((task), TASK_ACCESS_PORT, (port))) - -#define task_set_task_debug_control_port(task, port) \ - (task_set_special_port((task), TASK_DEBUG_CONTROL_PORT, (port))) - - -#endif /* _MACH_TASK_SPECIAL_PORTS_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/thread_act.h b/lib/libc/include/x86_64-macos-gnu/mach/thread_act.h deleted file mode 100644 index 88561082cd..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/thread_act.h +++ /dev/null @@ -1,1336 +0,0 @@ -#ifndef _thread_act_user_ -#define _thread_act_user_ - -/* Module thread_act */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* BEGIN MIG_STRNCPY_ZEROFILL CODE */ - -#if defined(__has_include) -#if __has_include() -#ifndef USING_MIG_STRNCPY_ZEROFILL -#define USING_MIG_STRNCPY_ZEROFILL -#endif -#ifndef __MIG_STRNCPY_ZEROFILL_FORWARD_TYPE_DECLS__ -#define __MIG_STRNCPY_ZEROFILL_FORWARD_TYPE_DECLS__ -#ifdef __cplusplus -extern "C" { -#endif - extern int mig_strncpy_zerofill(char *dest, const char *src, int len) __attribute__((weak_import)); -#ifdef __cplusplus -} -#endif -#endif /* __MIG_STRNCPY_ZEROFILL_FORWARD_TYPE_DECLS__ */ -#endif /* __has_include() */ -#endif /* __has_include */ - -/* END MIG_STRNCPY_ZEROFILL CODE */ - - -#ifdef AUTOTEST -#ifndef FUNCTION_PTR_T -#define FUNCTION_PTR_T -typedef void (*function_ptr_t)(mach_port_t, char *, mach_msg_type_number_t); -typedef struct { - char *name; - function_ptr_t function; -} function_table_entry; -typedef function_table_entry *function_table_t; -#endif /* FUNCTION_PTR_T */ -#endif /* AUTOTEST */ - -#ifndef thread_act_MSG_COUNT -#define thread_act_MSG_COUNT 28 -#endif /* thread_act_MSG_COUNT */ - -#include -#include -#include -#include - -#ifdef __BeforeMigUserHeader -__BeforeMigUserHeader -#endif /* __BeforeMigUserHeader */ - -#include -__BEGIN_DECLS - - -/* Routine thread_terminate */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t thread_terminate -( - thread_act_t target_act -); - -/* Routine act_get_state */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t act_get_state -( - thread_act_t target_act, - int flavor, - thread_state_t old_state, - mach_msg_type_number_t *old_stateCnt -); - -/* Routine act_set_state */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t act_set_state -( - thread_act_t target_act, - int flavor, - thread_state_t new_state, - mach_msg_type_number_t new_stateCnt -); - -/* Routine thread_get_state */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -kern_return_t thread_get_state -( - thread_act_t target_act, - thread_state_flavor_t flavor, - thread_state_t old_state, - mach_msg_type_number_t *old_stateCnt -); - -/* Routine thread_set_state */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -kern_return_t thread_set_state -( - thread_act_t target_act, - thread_state_flavor_t flavor, - thread_state_t new_state, - mach_msg_type_number_t new_stateCnt -); - -/* Routine thread_suspend */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -kern_return_t thread_suspend -( - thread_act_t target_act -); - -/* Routine thread_resume */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -kern_return_t thread_resume -( - thread_act_t target_act -); - -/* Routine thread_abort */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -kern_return_t thread_abort -( - thread_act_t target_act -); - -/* Routine thread_abort_safely */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -kern_return_t thread_abort_safely -( - thread_act_t target_act -); - -/* Routine thread_depress_abort */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t thread_depress_abort -( - thread_act_t thread -); - -/* Routine thread_get_special_port */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t thread_get_special_port -( - thread_act_t thr_act, - int which_port, - mach_port_t *special_port -); - -/* Routine thread_set_special_port */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t thread_set_special_port -( - thread_act_t thr_act, - int which_port, - mach_port_t special_port -); - -/* Routine thread_info */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t thread_info -( - thread_inspect_t target_act, - thread_flavor_t flavor, - thread_info_t thread_info_out, - mach_msg_type_number_t *thread_info_outCnt -); - -/* Routine thread_set_exception_ports */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t thread_set_exception_ports -( - thread_act_t thread, - exception_mask_t exception_mask, - mach_port_t new_port, - exception_behavior_t behavior, - thread_state_flavor_t new_flavor -); - -/* Routine thread_get_exception_ports */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t thread_get_exception_ports -( - thread_inspect_t thread, - exception_mask_t exception_mask, - exception_mask_array_t masks, - mach_msg_type_number_t *masksCnt, - exception_handler_array_t old_handlers, - exception_behavior_array_t old_behaviors, - exception_flavor_array_t old_flavors -); - -/* Routine thread_swap_exception_ports */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t thread_swap_exception_ports -( - thread_act_t thread, - exception_mask_t exception_mask, - mach_port_t new_port, - exception_behavior_t behavior, - thread_state_flavor_t new_flavor, - exception_mask_array_t masks, - mach_msg_type_number_t *masksCnt, - exception_handler_array_t old_handlers, - exception_behavior_array_t old_behaviors, - exception_flavor_array_t old_flavors -); - -/* Routine thread_policy */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t thread_policy -( - thread_act_t thr_act, - policy_t policy, - policy_base_t base, - mach_msg_type_number_t baseCnt, - boolean_t set_limit -); - -/* Routine thread_policy_set */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t thread_policy_set -( - thread_act_t thread, - thread_policy_flavor_t flavor, - thread_policy_t policy_info, - mach_msg_type_number_t policy_infoCnt -); - -/* Routine thread_policy_get */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t thread_policy_get -( - thread_inspect_t thread, - thread_policy_flavor_t flavor, - thread_policy_t policy_info, - mach_msg_type_number_t *policy_infoCnt, - boolean_t *get_default -); - -/* Routine thread_sample */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t thread_sample -( - thread_act_t thread, - mach_port_t reply -); - -/* Routine etap_trace_thread */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t etap_trace_thread -( - thread_act_t target_act, - boolean_t trace_status -); - -/* Routine thread_assign */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t thread_assign -( - thread_act_t thread, - processor_set_t new_set -); - -/* Routine thread_assign_default */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t thread_assign_default -( - thread_act_t thread -); - -/* Routine thread_get_assignment */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t thread_get_assignment -( - thread_act_t thread, - processor_set_name_t *assigned_set -); - -/* Routine thread_set_policy */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t thread_set_policy -( - thread_act_t thr_act, - processor_set_t pset, - policy_t policy, - policy_base_t base, - mach_msg_type_number_t baseCnt, - policy_limit_t limit, - mach_msg_type_number_t limitCnt -); - -/* Routine thread_get_mach_voucher */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t thread_get_mach_voucher -( - thread_act_t thr_act, - mach_voucher_selector_t which, - ipc_voucher_t *voucher -); - -/* Routine thread_set_mach_voucher */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t thread_set_mach_voucher -( - thread_act_t thr_act, - ipc_voucher_t voucher -); - -/* Routine thread_swap_mach_voucher */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t thread_swap_mach_voucher -( - thread_act_t thr_act, - ipc_voucher_t new_voucher, - ipc_voucher_t *old_voucher -); - -__END_DECLS - -/********************** Caution **************************/ -/* The following data types should be used to calculate */ -/* maximum message sizes only. The actual message may be */ -/* smaller, and the position of the arguments within the */ -/* message layout may vary from what is presented here. */ -/* For example, if any of the arguments are variable- */ -/* sized, and less than the maximum is sent, the data */ -/* will be packed tight in the actual message to reduce */ -/* the presence of holes. */ -/********************** Caution **************************/ - -/* typedefs for all requests */ - -#ifndef __Request__thread_act_subsystem__defined -#define __Request__thread_act_subsystem__defined - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__thread_terminate_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - int flavor; - mach_msg_type_number_t old_stateCnt; - } __Request__act_get_state_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - int flavor; - mach_msg_type_number_t new_stateCnt; - natural_t new_state[614]; - } __Request__act_set_state_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - thread_state_flavor_t flavor; - mach_msg_type_number_t old_stateCnt; - } __Request__thread_get_state_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - thread_state_flavor_t flavor; - mach_msg_type_number_t new_stateCnt; - natural_t new_state[614]; - } __Request__thread_set_state_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__thread_suspend_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__thread_resume_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__thread_abort_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__thread_abort_safely_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__thread_depress_abort_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - int which_port; - } __Request__thread_get_special_port_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t special_port; - /* end of the kernel processed data */ - NDR_record_t NDR; - int which_port; - } __Request__thread_set_special_port_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - thread_flavor_t flavor; - mach_msg_type_number_t thread_info_outCnt; - } __Request__thread_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t new_port; - /* end of the kernel processed data */ - NDR_record_t NDR; - exception_mask_t exception_mask; - exception_behavior_t behavior; - thread_state_flavor_t new_flavor; - } __Request__thread_set_exception_ports_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - exception_mask_t exception_mask; - } __Request__thread_get_exception_ports_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t new_port; - /* end of the kernel processed data */ - NDR_record_t NDR; - exception_mask_t exception_mask; - exception_behavior_t behavior; - thread_state_flavor_t new_flavor; - } __Request__thread_swap_exception_ports_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - policy_t policy; - mach_msg_type_number_t baseCnt; - integer_t base[5]; - boolean_t set_limit; - } __Request__thread_policy_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - thread_policy_flavor_t flavor; - mach_msg_type_number_t policy_infoCnt; - integer_t policy_info[16]; - } __Request__thread_policy_set_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - thread_policy_flavor_t flavor; - mach_msg_type_number_t policy_infoCnt; - boolean_t get_default; - } __Request__thread_policy_get_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t reply; - /* end of the kernel processed data */ - } __Request__thread_sample_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - boolean_t trace_status; - } __Request__etap_trace_thread_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t new_set; - /* end of the kernel processed data */ - } __Request__thread_assign_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__thread_assign_default_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__thread_get_assignment_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t pset; - /* end of the kernel processed data */ - NDR_record_t NDR; - policy_t policy; - mach_msg_type_number_t baseCnt; - integer_t base[5]; - mach_msg_type_number_t limitCnt; - integer_t limit[1]; - } __Request__thread_set_policy_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - mach_voucher_selector_t which; - } __Request__thread_get_mach_voucher_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t voucher; - /* end of the kernel processed data */ - } __Request__thread_set_mach_voucher_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t new_voucher; - mach_msg_port_descriptor_t old_voucher; - /* end of the kernel processed data */ - } __Request__thread_swap_mach_voucher_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif -#endif /* !__Request__thread_act_subsystem__defined */ - -/* union of all requests */ - -#ifndef __RequestUnion__thread_act_subsystem__defined -#define __RequestUnion__thread_act_subsystem__defined -union __RequestUnion__thread_act_subsystem { - __Request__thread_terminate_t Request_thread_terminate; - __Request__act_get_state_t Request_act_get_state; - __Request__act_set_state_t Request_act_set_state; - __Request__thread_get_state_t Request_thread_get_state; - __Request__thread_set_state_t Request_thread_set_state; - __Request__thread_suspend_t Request_thread_suspend; - __Request__thread_resume_t Request_thread_resume; - __Request__thread_abort_t Request_thread_abort; - __Request__thread_abort_safely_t Request_thread_abort_safely; - __Request__thread_depress_abort_t Request_thread_depress_abort; - __Request__thread_get_special_port_t Request_thread_get_special_port; - __Request__thread_set_special_port_t Request_thread_set_special_port; - __Request__thread_info_t Request_thread_info; - __Request__thread_set_exception_ports_t Request_thread_set_exception_ports; - __Request__thread_get_exception_ports_t Request_thread_get_exception_ports; - __Request__thread_swap_exception_ports_t Request_thread_swap_exception_ports; - __Request__thread_policy_t Request_thread_policy; - __Request__thread_policy_set_t Request_thread_policy_set; - __Request__thread_policy_get_t Request_thread_policy_get; - __Request__thread_sample_t Request_thread_sample; - __Request__etap_trace_thread_t Request_etap_trace_thread; - __Request__thread_assign_t Request_thread_assign; - __Request__thread_assign_default_t Request_thread_assign_default; - __Request__thread_get_assignment_t Request_thread_get_assignment; - __Request__thread_set_policy_t Request_thread_set_policy; - __Request__thread_get_mach_voucher_t Request_thread_get_mach_voucher; - __Request__thread_set_mach_voucher_t Request_thread_set_mach_voucher; - __Request__thread_swap_mach_voucher_t Request_thread_swap_mach_voucher; -}; -#endif /* !__RequestUnion__thread_act_subsystem__defined */ -/* typedefs for all replies */ - -#ifndef __Reply__thread_act_subsystem__defined -#define __Reply__thread_act_subsystem__defined - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__thread_terminate_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - mach_msg_type_number_t old_stateCnt; - natural_t old_state[614]; - } __Reply__act_get_state_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__act_set_state_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - mach_msg_type_number_t old_stateCnt; - natural_t old_state[614]; - } __Reply__thread_get_state_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__thread_set_state_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__thread_suspend_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__thread_resume_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__thread_abort_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__thread_abort_safely_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__thread_depress_abort_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t special_port; - /* end of the kernel processed data */ - } __Reply__thread_get_special_port_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__thread_set_special_port_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - mach_msg_type_number_t thread_info_outCnt; - integer_t thread_info_out[32]; - } __Reply__thread_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__thread_set_exception_ports_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t old_handlers[32]; - /* end of the kernel processed data */ - NDR_record_t NDR; - mach_msg_type_number_t masksCnt; - exception_mask_t masks[32]; - exception_behavior_t old_behaviors[32]; - thread_state_flavor_t old_flavors[32]; - } __Reply__thread_get_exception_ports_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t old_handlers[32]; - /* end of the kernel processed data */ - NDR_record_t NDR; - mach_msg_type_number_t masksCnt; - exception_mask_t masks[32]; - exception_behavior_t old_behaviors[32]; - thread_state_flavor_t old_flavors[32]; - } __Reply__thread_swap_exception_ports_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__thread_policy_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__thread_policy_set_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - mach_msg_type_number_t policy_infoCnt; - integer_t policy_info[16]; - boolean_t get_default; - } __Reply__thread_policy_get_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__thread_sample_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__etap_trace_thread_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__thread_assign_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__thread_assign_default_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t assigned_set; - /* end of the kernel processed data */ - } __Reply__thread_get_assignment_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__thread_set_policy_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t voucher; - /* end of the kernel processed data */ - } __Reply__thread_get_mach_voucher_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__thread_set_mach_voucher_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t old_voucher; - /* end of the kernel processed data */ - } __Reply__thread_swap_mach_voucher_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif -#endif /* !__Reply__thread_act_subsystem__defined */ - -/* union of all replies */ - -#ifndef __ReplyUnion__thread_act_subsystem__defined -#define __ReplyUnion__thread_act_subsystem__defined -union __ReplyUnion__thread_act_subsystem { - __Reply__thread_terminate_t Reply_thread_terminate; - __Reply__act_get_state_t Reply_act_get_state; - __Reply__act_set_state_t Reply_act_set_state; - __Reply__thread_get_state_t Reply_thread_get_state; - __Reply__thread_set_state_t Reply_thread_set_state; - __Reply__thread_suspend_t Reply_thread_suspend; - __Reply__thread_resume_t Reply_thread_resume; - __Reply__thread_abort_t Reply_thread_abort; - __Reply__thread_abort_safely_t Reply_thread_abort_safely; - __Reply__thread_depress_abort_t Reply_thread_depress_abort; - __Reply__thread_get_special_port_t Reply_thread_get_special_port; - __Reply__thread_set_special_port_t Reply_thread_set_special_port; - __Reply__thread_info_t Reply_thread_info; - __Reply__thread_set_exception_ports_t Reply_thread_set_exception_ports; - __Reply__thread_get_exception_ports_t Reply_thread_get_exception_ports; - __Reply__thread_swap_exception_ports_t Reply_thread_swap_exception_ports; - __Reply__thread_policy_t Reply_thread_policy; - __Reply__thread_policy_set_t Reply_thread_policy_set; - __Reply__thread_policy_get_t Reply_thread_policy_get; - __Reply__thread_sample_t Reply_thread_sample; - __Reply__etap_trace_thread_t Reply_etap_trace_thread; - __Reply__thread_assign_t Reply_thread_assign; - __Reply__thread_assign_default_t Reply_thread_assign_default; - __Reply__thread_get_assignment_t Reply_thread_get_assignment; - __Reply__thread_set_policy_t Reply_thread_set_policy; - __Reply__thread_get_mach_voucher_t Reply_thread_get_mach_voucher; - __Reply__thread_set_mach_voucher_t Reply_thread_set_mach_voucher; - __Reply__thread_swap_mach_voucher_t Reply_thread_swap_mach_voucher; -}; -#endif /* !__RequestUnion__thread_act_subsystem__defined */ - -#ifndef subsystem_to_name_map_thread_act -#define subsystem_to_name_map_thread_act \ - { "thread_terminate", 3600 },\ - { "act_get_state", 3601 },\ - { "act_set_state", 3602 },\ - { "thread_get_state", 3603 },\ - { "thread_set_state", 3604 },\ - { "thread_suspend", 3605 },\ - { "thread_resume", 3606 },\ - { "thread_abort", 3607 },\ - { "thread_abort_safely", 3608 },\ - { "thread_depress_abort", 3609 },\ - { "thread_get_special_port", 3610 },\ - { "thread_set_special_port", 3611 },\ - { "thread_info", 3612 },\ - { "thread_set_exception_ports", 3613 },\ - { "thread_get_exception_ports", 3614 },\ - { "thread_swap_exception_ports", 3615 },\ - { "thread_policy", 3616 },\ - { "thread_policy_set", 3617 },\ - { "thread_policy_get", 3618 },\ - { "thread_sample", 3619 },\ - { "etap_trace_thread", 3620 },\ - { "thread_assign", 3621 },\ - { "thread_assign_default", 3622 },\ - { "thread_get_assignment", 3623 },\ - { "thread_set_policy", 3624 },\ - { "thread_get_mach_voucher", 3625 },\ - { "thread_set_mach_voucher", 3626 },\ - { "thread_swap_mach_voucher", 3627 } -#endif - -#ifdef __AfterMigUserHeader -__AfterMigUserHeader -#endif /* __AfterMigUserHeader */ - -#endif /* _thread_act_user_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/thread_special_ports.h b/lib/libc/include/x86_64-macos-gnu/mach/thread_special_ports.h deleted file mode 100644 index f777e0060c..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/thread_special_ports.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2000-2002 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * @OSF_COPYRIGHT@ - */ -/* - * Mach Operating System - * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ -/* - */ -/* - * File: mach/thread_special_ports.h - * - * Defines codes for special_purpose thread ports. These are NOT - * port identifiers - they are only used for the thread_get_special_port - * and thread_set_special_port routines. - * - */ - -#ifndef _MACH_THREAD_SPECIAL_PORTS_H_ -#define _MACH_THREAD_SPECIAL_PORTS_H_ - -#define THREAD_KERNEL_PORT 1 /* Represents the thread to the outside - * world.*/ - -/* - * Definitions for ease of use - */ - -#define thread_get_kernel_port(thread, port) \ - (thread_get_special_port((thread), THREAD_KERNEL_PORT, (port))) - -#define thread_set_kernel_port(thread, port) \ - (thread_set_special_port((thread), THREAD_KERNEL_PORT, (port))) - -#endif /* _MACH_THREAD_SPECIAL_PORTS_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/thread_status.h b/lib/libc/include/x86_64-macos-gnu/mach/thread_status.h deleted file mode 100644 index 886cae365c..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/thread_status.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2000-2002 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * @OSF_COPYRIGHT@ - */ -/* - * Mach Operating System - * Copyright (c) 1991,1990,1989,1988 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ -/* - */ -/* - * File: mach/thread_status.h - * Author: Avadis Tevanian, Jr. - * - * This file contains the structure definitions for the user-visible - * thread state. This thread state is examined with the thread_get_state - * kernel call and may be changed with the thread_set_state kernel call. - * - */ - -#ifndef _MACH_THREAD_STATUS_H_ -#define _MACH_THREAD_STATUS_H_ - -/* - * The actual structure that comprises the thread state is defined - * in the machine dependent module. - */ -#include -#include -#include - -/* - * Generic definition for machine-dependent thread status. - */ - -typedef natural_t *thread_state_t; /* Variable-length array */ - -/* THREAD_STATE_MAX is now defined in */ -typedef natural_t thread_state_data_t[THREAD_STATE_MAX]; - -#define THREAD_STATE_FLAVOR_LIST 0 /* List of valid flavors */ -#define THREAD_STATE_FLAVOR_LIST_NEW 128 -#define THREAD_STATE_FLAVOR_LIST_10_9 129 -#define THREAD_STATE_FLAVOR_LIST_10_13 130 -#define THREAD_STATE_FLAVOR_LIST_10_15 131 - -typedef int thread_state_flavor_t; -typedef thread_state_flavor_t *thread_state_flavor_array_t; - -#endif /* _MACH_THREAD_STATUS_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/vm_map.h b/lib/libc/include/x86_64-macos-gnu/mach/vm_map.h deleted file mode 100644 index 59b3e7ffac..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/vm_map.h +++ /dev/null @@ -1,1440 +0,0 @@ -#ifndef _vm_map_user_ -#define _vm_map_user_ - -/* Module vm_map */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* BEGIN MIG_STRNCPY_ZEROFILL CODE */ - -#if defined(__has_include) -#if __has_include() -#ifndef USING_MIG_STRNCPY_ZEROFILL -#define USING_MIG_STRNCPY_ZEROFILL -#endif -#ifndef __MIG_STRNCPY_ZEROFILL_FORWARD_TYPE_DECLS__ -#define __MIG_STRNCPY_ZEROFILL_FORWARD_TYPE_DECLS__ -#ifdef __cplusplus -extern "C" { -#endif - extern int mig_strncpy_zerofill(char *dest, const char *src, int len) __attribute__((weak_import)); -#ifdef __cplusplus -} -#endif -#endif /* __MIG_STRNCPY_ZEROFILL_FORWARD_TYPE_DECLS__ */ -#endif /* __has_include() */ -#endif /* __has_include */ - -/* END MIG_STRNCPY_ZEROFILL CODE */ - - -#ifdef AUTOTEST -#ifndef FUNCTION_PTR_T -#define FUNCTION_PTR_T -typedef void (*function_ptr_t)(mach_port_t, char *, mach_msg_type_number_t); -typedef struct { - char *name; - function_ptr_t function; -} function_table_entry; -typedef function_table_entry *function_table_t; -#endif /* FUNCTION_PTR_T */ -#endif /* AUTOTEST */ - -#ifndef vm_map_MSG_COUNT -#define vm_map_MSG_COUNT 32 -#endif /* vm_map_MSG_COUNT */ - -#include -#include -#include -#include -#include - -#ifdef __BeforeMigUserHeader -__BeforeMigUserHeader -#endif /* __BeforeMigUserHeader */ - -#include -__BEGIN_DECLS - - -/* Routine vm_region */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t vm_region -( - vm_map_t target_task, - vm_address_t *address, - vm_size_t *size, - vm_region_flavor_t flavor, - vm_region_info_t info, - mach_msg_type_number_t *infoCnt, - mach_port_t *object_name -); - -/* Routine vm_allocate */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t vm_allocate -( - vm_map_t target_task, - vm_address_t *address, - vm_size_t size, - int flags -); - -/* Routine vm_deallocate */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t vm_deallocate -( - vm_map_t target_task, - vm_address_t address, - vm_size_t size -); - -/* Routine vm_protect */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t vm_protect -( - vm_map_t target_task, - vm_address_t address, - vm_size_t size, - boolean_t set_maximum, - vm_prot_t new_protection -); - -/* Routine vm_inherit */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t vm_inherit -( - vm_map_t target_task, - vm_address_t address, - vm_size_t size, - vm_inherit_t new_inheritance -); - -/* Routine vm_read */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t vm_read -( - vm_map_t target_task, - vm_address_t address, - vm_size_t size, - vm_offset_t *data, - mach_msg_type_number_t *dataCnt -); - -/* Routine vm_read_list */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t vm_read_list -( - vm_map_t target_task, - vm_read_entry_t data_list, - natural_t count -); - -/* Routine vm_write */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t vm_write -( - vm_map_t target_task, - vm_address_t address, - vm_offset_t data, - mach_msg_type_number_t dataCnt -); - -/* Routine vm_copy */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t vm_copy -( - vm_map_t target_task, - vm_address_t source_address, - vm_size_t size, - vm_address_t dest_address -); - -/* Routine vm_read_overwrite */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t vm_read_overwrite -( - vm_map_t target_task, - vm_address_t address, - vm_size_t size, - vm_address_t data, - vm_size_t *outsize -); - -/* Routine vm_msync */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t vm_msync -( - vm_map_t target_task, - vm_address_t address, - vm_size_t size, - vm_sync_t sync_flags -); - -/* Routine vm_behavior_set */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t vm_behavior_set -( - vm_map_t target_task, - vm_address_t address, - vm_size_t size, - vm_behavior_t new_behavior -); - -/* Routine vm_map */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t vm_map -( - vm_map_t target_task, - vm_address_t *address, - vm_size_t size, - vm_address_t mask, - int flags, - mem_entry_name_port_t object, - vm_offset_t offset, - boolean_t copy, - vm_prot_t cur_protection, - vm_prot_t max_protection, - vm_inherit_t inheritance -); - -/* Routine vm_machine_attribute */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t vm_machine_attribute -( - vm_map_t target_task, - vm_address_t address, - vm_size_t size, - vm_machine_attribute_t attribute, - vm_machine_attribute_val_t *value -); - -/* Routine vm_remap */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t vm_remap -( - vm_map_t target_task, - vm_address_t *target_address, - vm_size_t size, - vm_address_t mask, - int flags, - vm_map_t src_task, - vm_address_t src_address, - boolean_t copy, - vm_prot_t *cur_protection, - vm_prot_t *max_protection, - vm_inherit_t inheritance -); - -/* Routine task_wire */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -__WATCHOS_PROHIBITED -__TVOS_PROHIBITED -kern_return_t task_wire -( - vm_map_t target_task, - boolean_t must_wire -); - -/* Routine mach_make_memory_entry */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_make_memory_entry -( - vm_map_t target_task, - vm_size_t *size, - vm_offset_t offset, - vm_prot_t permission, - mem_entry_name_port_t *object_handle, - mem_entry_name_port_t parent_entry -); - -/* Routine vm_map_page_query */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t vm_map_page_query -( - vm_map_t target_map, - vm_offset_t offset, - integer_t *disposition, - integer_t *ref_count -); - -/* Routine mach_vm_region_info */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_vm_region_info -( - vm_map_t task, - vm_address_t address, - vm_info_region_t *region, - vm_info_object_array_t *objects, - mach_msg_type_number_t *objectsCnt -); - -/* Routine vm_mapped_pages_info */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t vm_mapped_pages_info -( - vm_map_t task, - page_address_array_t *pages, - mach_msg_type_number_t *pagesCnt -); - -/* Routine vm_region_recurse */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t vm_region_recurse -( - vm_map_t target_task, - vm_address_t *address, - vm_size_t *size, - natural_t *nesting_depth, - vm_region_recurse_info_t info, - mach_msg_type_number_t *infoCnt -); - -/* Routine vm_region_recurse_64 */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t vm_region_recurse_64 -( - vm_map_t target_task, - vm_address_t *address, - vm_size_t *size, - natural_t *nesting_depth, - vm_region_recurse_info_t info, - mach_msg_type_number_t *infoCnt -); - -/* Routine mach_vm_region_info_64 */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_vm_region_info_64 -( - vm_map_t task, - vm_address_t address, - vm_info_region_64_t *region, - vm_info_object_array_t *objects, - mach_msg_type_number_t *objectsCnt -); - -/* Routine vm_region_64 */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t vm_region_64 -( - vm_map_t target_task, - vm_address_t *address, - vm_size_t *size, - vm_region_flavor_t flavor, - vm_region_info_t info, - mach_msg_type_number_t *infoCnt, - mach_port_t *object_name -); - -/* Routine mach_make_memory_entry_64 */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t mach_make_memory_entry_64 -( - vm_map_t target_task, - memory_object_size_t *size, - memory_object_offset_t offset, - vm_prot_t permission, - mach_port_t *object_handle, - mem_entry_name_port_t parent_entry -); - -/* Routine vm_map_64 */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t vm_map_64 -( - vm_map_t target_task, - vm_address_t *address, - vm_size_t size, - vm_address_t mask, - int flags, - mem_entry_name_port_t object, - memory_object_offset_t offset, - boolean_t copy, - vm_prot_t cur_protection, - vm_prot_t max_protection, - vm_inherit_t inheritance -); - -/* Routine vm_purgable_control */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t vm_purgable_control -( - vm_map_t target_task, - vm_address_t address, - vm_purgable_t control, - int *state -); - -/* Routine vm_map_exec_lockdown */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t vm_map_exec_lockdown -( - vm_map_t target_task -); - -__END_DECLS - -/********************** Caution **************************/ -/* The following data types should be used to calculate */ -/* maximum message sizes only. The actual message may be */ -/* smaller, and the position of the arguments within the */ -/* message layout may vary from what is presented here. */ -/* For example, if any of the arguments are variable- */ -/* sized, and less than the maximum is sent, the data */ -/* will be packed tight in the actual message to reduce */ -/* the presence of holes. */ -/********************** Caution **************************/ - -/* typedefs for all requests */ - -#ifndef __Request__vm_map_subsystem__defined -#define __Request__vm_map_subsystem__defined - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - vm_address_t address; - vm_region_flavor_t flavor; - mach_msg_type_number_t infoCnt; - } __Request__vm_region_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - vm_address_t address; - vm_size_t size; - int flags; - } __Request__vm_allocate_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - vm_address_t address; - vm_size_t size; - } __Request__vm_deallocate_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - vm_address_t address; - vm_size_t size; - boolean_t set_maximum; - vm_prot_t new_protection; - } __Request__vm_protect_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - vm_address_t address; - vm_size_t size; - vm_inherit_t new_inheritance; - } __Request__vm_inherit_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - vm_address_t address; - vm_size_t size; - } __Request__vm_read_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - vm_read_entry_t data_list; - natural_t count; - } __Request__vm_read_list_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_ool_descriptor_t data; - /* end of the kernel processed data */ - NDR_record_t NDR; - vm_address_t address; - mach_msg_type_number_t dataCnt; - } __Request__vm_write_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - vm_address_t source_address; - vm_size_t size; - vm_address_t dest_address; - } __Request__vm_copy_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - vm_address_t address; - vm_size_t size; - vm_address_t data; - } __Request__vm_read_overwrite_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - vm_address_t address; - vm_size_t size; - vm_sync_t sync_flags; - } __Request__vm_msync_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - vm_address_t address; - vm_size_t size; - vm_behavior_t new_behavior; - } __Request__vm_behavior_set_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t object; - /* end of the kernel processed data */ - NDR_record_t NDR; - vm_address_t address; - vm_size_t size; - vm_address_t mask; - int flags; - vm_offset_t offset; - boolean_t copy; - vm_prot_t cur_protection; - vm_prot_t max_protection; - vm_inherit_t inheritance; - } __Request__vm_map_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - vm_address_t address; - vm_size_t size; - vm_machine_attribute_t attribute; - vm_machine_attribute_val_t value; - } __Request__vm_machine_attribute_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t src_task; - /* end of the kernel processed data */ - NDR_record_t NDR; - vm_address_t target_address; - vm_size_t size; - vm_address_t mask; - int flags; - vm_address_t src_address; - boolean_t copy; - vm_inherit_t inheritance; - } __Request__vm_remap_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - boolean_t must_wire; - } __Request__task_wire_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t parent_entry; - /* end of the kernel processed data */ - NDR_record_t NDR; - vm_size_t size; - vm_offset_t offset; - vm_prot_t permission; - } __Request__mach_make_memory_entry_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - vm_offset_t offset; - } __Request__vm_map_page_query_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - vm_address_t address; - } __Request__mach_vm_region_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__vm_mapped_pages_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - vm_address_t address; - natural_t nesting_depth; - mach_msg_type_number_t infoCnt; - } __Request__vm_region_recurse_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - vm_address_t address; - natural_t nesting_depth; - mach_msg_type_number_t infoCnt; - } __Request__vm_region_recurse_64_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - vm_address_t address; - } __Request__mach_vm_region_info_64_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - vm_address_t address; - vm_region_flavor_t flavor; - mach_msg_type_number_t infoCnt; - } __Request__vm_region_64_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t parent_entry; - /* end of the kernel processed data */ - NDR_record_t NDR; - memory_object_size_t size; - memory_object_offset_t offset; - vm_prot_t permission; - } __Request__mach_make_memory_entry_64_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t object; - /* end of the kernel processed data */ - NDR_record_t NDR; - vm_address_t address; - vm_size_t size; - vm_address_t mask; - int flags; - memory_object_offset_t offset; - boolean_t copy; - vm_prot_t cur_protection; - vm_prot_t max_protection; - vm_inherit_t inheritance; - } __Request__vm_map_64_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - vm_address_t address; - vm_purgable_t control; - int state; - } __Request__vm_purgable_control_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - } __Request__vm_map_exec_lockdown_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif -#endif /* !__Request__vm_map_subsystem__defined */ - -/* union of all requests */ - -#ifndef __RequestUnion__vm_map_subsystem__defined -#define __RequestUnion__vm_map_subsystem__defined -union __RequestUnion__vm_map_subsystem { - __Request__vm_region_t Request_vm_region; - __Request__vm_allocate_t Request_vm_allocate; - __Request__vm_deallocate_t Request_vm_deallocate; - __Request__vm_protect_t Request_vm_protect; - __Request__vm_inherit_t Request_vm_inherit; - __Request__vm_read_t Request_vm_read; - __Request__vm_read_list_t Request_vm_read_list; - __Request__vm_write_t Request_vm_write; - __Request__vm_copy_t Request_vm_copy; - __Request__vm_read_overwrite_t Request_vm_read_overwrite; - __Request__vm_msync_t Request_vm_msync; - __Request__vm_behavior_set_t Request_vm_behavior_set; - __Request__vm_map_t Request_vm_map; - __Request__vm_machine_attribute_t Request_vm_machine_attribute; - __Request__vm_remap_t Request_vm_remap; - __Request__task_wire_t Request_task_wire; - __Request__mach_make_memory_entry_t Request_mach_make_memory_entry; - __Request__vm_map_page_query_t Request_vm_map_page_query; - __Request__mach_vm_region_info_t Request_mach_vm_region_info; - __Request__vm_mapped_pages_info_t Request_vm_mapped_pages_info; - __Request__vm_region_recurse_t Request_vm_region_recurse; - __Request__vm_region_recurse_64_t Request_vm_region_recurse_64; - __Request__mach_vm_region_info_64_t Request_mach_vm_region_info_64; - __Request__vm_region_64_t Request_vm_region_64; - __Request__mach_make_memory_entry_64_t Request_mach_make_memory_entry_64; - __Request__vm_map_64_t Request_vm_map_64; - __Request__vm_purgable_control_t Request_vm_purgable_control; - __Request__vm_map_exec_lockdown_t Request_vm_map_exec_lockdown; -}; -#endif /* !__RequestUnion__vm_map_subsystem__defined */ -/* typedefs for all replies */ - -#ifndef __Reply__vm_map_subsystem__defined -#define __Reply__vm_map_subsystem__defined - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t object_name; - /* end of the kernel processed data */ - NDR_record_t NDR; - vm_address_t address; - vm_size_t size; - mach_msg_type_number_t infoCnt; - int info[10]; - } __Reply__vm_region_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - vm_address_t address; - } __Reply__vm_allocate_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__vm_deallocate_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__vm_protect_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__vm_inherit_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_ool_descriptor_t data; - /* end of the kernel processed data */ - NDR_record_t NDR; - mach_msg_type_number_t dataCnt; - } __Reply__vm_read_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - vm_read_entry_t data_list; - } __Reply__vm_read_list_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__vm_write_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__vm_copy_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - vm_size_t outsize; - } __Reply__vm_read_overwrite_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__vm_msync_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__vm_behavior_set_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - vm_address_t address; - } __Reply__vm_map_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - vm_machine_attribute_val_t value; - } __Reply__vm_machine_attribute_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - vm_address_t target_address; - vm_prot_t cur_protection; - vm_prot_t max_protection; - } __Reply__vm_remap_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__task_wire_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t object_handle; - /* end of the kernel processed data */ - NDR_record_t NDR; - vm_size_t size; - } __Reply__mach_make_memory_entry_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - integer_t disposition; - integer_t ref_count; - } __Reply__vm_map_page_query_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_ool_descriptor_t objects; - /* end of the kernel processed data */ - NDR_record_t NDR; - vm_info_region_t region; - mach_msg_type_number_t objectsCnt; - } __Reply__mach_vm_region_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_ool_descriptor_t pages; - /* end of the kernel processed data */ - NDR_record_t NDR; - mach_msg_type_number_t pagesCnt; - } __Reply__vm_mapped_pages_info_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - vm_address_t address; - vm_size_t size; - natural_t nesting_depth; - mach_msg_type_number_t infoCnt; - int info[19]; - } __Reply__vm_region_recurse_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - vm_address_t address; - vm_size_t size; - natural_t nesting_depth; - mach_msg_type_number_t infoCnt; - int info[19]; - } __Reply__vm_region_recurse_64_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_ool_descriptor_t objects; - /* end of the kernel processed data */ - NDR_record_t NDR; - vm_info_region_64_t region; - mach_msg_type_number_t objectsCnt; - } __Reply__mach_vm_region_info_64_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t object_name; - /* end of the kernel processed data */ - NDR_record_t NDR; - vm_address_t address; - vm_size_t size; - mach_msg_type_number_t infoCnt; - int info[10]; - } __Reply__vm_region_64_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t object_handle; - /* end of the kernel processed data */ - NDR_record_t NDR; - memory_object_size_t size; - } __Reply__mach_make_memory_entry_64_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - vm_address_t address; - } __Reply__vm_map_64_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - int state; - } __Reply__vm_purgable_control_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif - -#ifdef __MigPackStructs -#pragma pack(push, 4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__vm_map_exec_lockdown_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack(pop) -#endif -#endif /* !__Reply__vm_map_subsystem__defined */ - -/* union of all replies */ - -#ifndef __ReplyUnion__vm_map_subsystem__defined -#define __ReplyUnion__vm_map_subsystem__defined -union __ReplyUnion__vm_map_subsystem { - __Reply__vm_region_t Reply_vm_region; - __Reply__vm_allocate_t Reply_vm_allocate; - __Reply__vm_deallocate_t Reply_vm_deallocate; - __Reply__vm_protect_t Reply_vm_protect; - __Reply__vm_inherit_t Reply_vm_inherit; - __Reply__vm_read_t Reply_vm_read; - __Reply__vm_read_list_t Reply_vm_read_list; - __Reply__vm_write_t Reply_vm_write; - __Reply__vm_copy_t Reply_vm_copy; - __Reply__vm_read_overwrite_t Reply_vm_read_overwrite; - __Reply__vm_msync_t Reply_vm_msync; - __Reply__vm_behavior_set_t Reply_vm_behavior_set; - __Reply__vm_map_t Reply_vm_map; - __Reply__vm_machine_attribute_t Reply_vm_machine_attribute; - __Reply__vm_remap_t Reply_vm_remap; - __Reply__task_wire_t Reply_task_wire; - __Reply__mach_make_memory_entry_t Reply_mach_make_memory_entry; - __Reply__vm_map_page_query_t Reply_vm_map_page_query; - __Reply__mach_vm_region_info_t Reply_mach_vm_region_info; - __Reply__vm_mapped_pages_info_t Reply_vm_mapped_pages_info; - __Reply__vm_region_recurse_t Reply_vm_region_recurse; - __Reply__vm_region_recurse_64_t Reply_vm_region_recurse_64; - __Reply__mach_vm_region_info_64_t Reply_mach_vm_region_info_64; - __Reply__vm_region_64_t Reply_vm_region_64; - __Reply__mach_make_memory_entry_64_t Reply_mach_make_memory_entry_64; - __Reply__vm_map_64_t Reply_vm_map_64; - __Reply__vm_purgable_control_t Reply_vm_purgable_control; - __Reply__vm_map_exec_lockdown_t Reply_vm_map_exec_lockdown; -}; -#endif /* !__RequestUnion__vm_map_subsystem__defined */ - -#ifndef subsystem_to_name_map_vm_map -#define subsystem_to_name_map_vm_map \ - { "vm_region", 3800 },\ - { "vm_allocate", 3801 },\ - { "vm_deallocate", 3802 },\ - { "vm_protect", 3803 },\ - { "vm_inherit", 3804 },\ - { "vm_read", 3805 },\ - { "vm_read_list", 3806 },\ - { "vm_write", 3807 },\ - { "vm_copy", 3808 },\ - { "vm_read_overwrite", 3809 },\ - { "vm_msync", 3810 },\ - { "vm_behavior_set", 3811 },\ - { "vm_map", 3812 },\ - { "vm_machine_attribute", 3813 },\ - { "vm_remap", 3814 },\ - { "task_wire", 3815 },\ - { "mach_make_memory_entry", 3816 },\ - { "vm_map_page_query", 3817 },\ - { "mach_vm_region_info", 3818 },\ - { "vm_mapped_pages_info", 3819 },\ - { "vm_region_recurse", 3821 },\ - { "vm_region_recurse_64", 3822 },\ - { "mach_vm_region_info_64", 3823 },\ - { "vm_region_64", 3824 },\ - { "mach_make_memory_entry_64", 3825 },\ - { "vm_map_64", 3826 },\ - { "vm_purgable_control", 3830 },\ - { "vm_map_exec_lockdown", 3831 } -#endif - -#ifdef __AfterMigUserHeader -__AfterMigUserHeader -#endif /* __AfterMigUserHeader */ - -#endif /* _vm_map_user_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/vm_prot.h b/lib/libc/include/x86_64-macos-gnu/mach/vm_prot.h deleted file mode 100644 index 75812fedf6..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/vm_prot.h +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (c) 2000-2002 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * @OSF_COPYRIGHT@ - */ -/* - * Mach Operating System - * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ -/* - */ -/* - * File: mach/vm_prot.h - * Author: Avadis Tevanian, Jr., Michael Wayne Young - * - * Virtual memory protection definitions. - * - */ - -#ifndef _MACH_VM_PROT_H_ -#define _MACH_VM_PROT_H_ - -/* - * Types defined: - * - * vm_prot_t VM protection values. - */ - -typedef int vm_prot_t; - -/* - * Protection values, defined as bits within the vm_prot_t type - */ - -#define VM_PROT_NONE ((vm_prot_t) 0x00) - -#define VM_PROT_READ ((vm_prot_t) 0x01) /* read permission */ -#define VM_PROT_WRITE ((vm_prot_t) 0x02) /* write permission */ -#define VM_PROT_EXECUTE ((vm_prot_t) 0x04) /* execute permission */ - -/* - * The default protection for newly-created virtual memory - */ - -#define VM_PROT_DEFAULT (VM_PROT_READ|VM_PROT_WRITE) - -/* - * The maximum privileges possible, for parameter checking. - */ - -#define VM_PROT_ALL (VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE) - -/* - * An invalid protection value. - * Used only by memory_object_lock_request to indicate no change - * to page locks. Using -1 here is a bad idea because it - * looks like VM_PROT_ALL and then some. - */ - -#define VM_PROT_NO_CHANGE ((vm_prot_t) 0x08) - -/* - * When a caller finds that he cannot obtain write permission on a - * mapped entry, the following flag can be used. The entry will - * be made "needs copy" effectively copying the object (using COW), - * and write permission will be added to the maximum protections - * for the associated entry. - */ - -#define VM_PROT_COPY ((vm_prot_t) 0x10) - - -/* - * Another invalid protection value. - * Used only by memory_object_data_request upon an object - * which has specified a copy_call copy strategy. It is used - * when the kernel wants a page belonging to a copy of the - * object, and is only asking the object as a result of - * following a shadow chain. This solves the race between pages - * being pushed up by the memory manager and the kernel - * walking down the shadow chain. - */ - -#define VM_PROT_WANTS_COPY ((vm_prot_t) 0x10) - - -/* - * Another invalid protection value. - * Indicates that the other protection bits are to be applied as a mask - * against the actual protection bits of the map entry. - */ -#define VM_PROT_IS_MASK ((vm_prot_t) 0x40) - -/* - * Another invalid protection value to support execute-only protection. - * VM_PROT_STRIP_READ is a special marker that tells mprotect to not - * set VM_PROT_READ. We have to do it this way because existing code - * expects the system to set VM_PROT_READ if VM_PROT_EXECUTE is set. - * VM_PROT_EXECUTE_ONLY is just a convenience value to indicate that - * the memory should be executable and explicitly not readable. It will - * be ignored on platforms that do not support this type of protection. - */ -#define VM_PROT_STRIP_READ ((vm_prot_t) 0x80) -#define VM_PROT_EXECUTE_ONLY (VM_PROT_EXECUTE|VM_PROT_STRIP_READ) - -#endif /* _MACH_VM_PROT_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach/vm_statistics.h b/lib/libc/include/x86_64-macos-gnu/mach/vm_statistics.h deleted file mode 100644 index 2bfd8136b4..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach/vm_statistics.h +++ /dev/null @@ -1,523 +0,0 @@ -/* - * Copyright (c) 2000-2019 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * @OSF_COPYRIGHT@ - */ -/* - * Mach Operating System - * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ -/* - */ -/* - * File: mach/vm_statistics.h - * Author: Avadis Tevanian, Jr., Michael Wayne Young, David Golub - * - * Virtual memory statistics structure. - * - */ - -#ifndef _MACH_VM_STATISTICS_H_ -#define _MACH_VM_STATISTICS_H_ - -#include - - -/* - * vm_statistics - * - * History: - * rev0 - original structure. - * rev1 - added purgable info (purgable_count and purges). - * rev2 - added speculative_count. - * - * Note: you cannot add any new fields to this structure. Add them below in - * vm_statistics64. - */ - -struct vm_statistics { - natural_t free_count; /* # of pages free */ - natural_t active_count; /* # of pages active */ - natural_t inactive_count; /* # of pages inactive */ - natural_t wire_count; /* # of pages wired down */ - natural_t zero_fill_count; /* # of zero fill pages */ - natural_t reactivations; /* # of pages reactivated */ - natural_t pageins; /* # of pageins */ - natural_t pageouts; /* # of pageouts */ - natural_t faults; /* # of faults */ - natural_t cow_faults; /* # of copy-on-writes */ - natural_t lookups; /* object cache lookups */ - natural_t hits; /* object cache hits */ - - /* added for rev1 */ - natural_t purgeable_count; /* # of pages purgeable */ - natural_t purges; /* # of pages purged */ - - /* added for rev2 */ - /* - * NB: speculative pages are already accounted for in "free_count", - * so "speculative_count" is the number of "free" pages that are - * used to hold data that was read speculatively from disk but - * haven't actually been used by anyone so far. - */ - natural_t speculative_count; /* # of pages speculative */ -}; - -/* Used by all architectures */ -typedef struct vm_statistics *vm_statistics_t; -typedef struct vm_statistics vm_statistics_data_t; - -/* - * vm_statistics64 - * - * History: - * rev0 - original structure. - * rev1 - added purgable info (purgable_count and purges). - * rev2 - added speculative_count. - * ---- - * rev3 - changed name to vm_statistics64. - * changed some fields in structure to 64-bit on - * arm, i386 and x86_64 architectures. - * rev4 - require 64-bit alignment for efficient access - * in the kernel. No change to reported data. - * - */ - -struct vm_statistics64 { - natural_t free_count; /* # of pages free */ - natural_t active_count; /* # of pages active */ - natural_t inactive_count; /* # of pages inactive */ - natural_t wire_count; /* # of pages wired down */ - uint64_t zero_fill_count; /* # of zero fill pages */ - uint64_t reactivations; /* # of pages reactivated */ - uint64_t pageins; /* # of pageins */ - uint64_t pageouts; /* # of pageouts */ - uint64_t faults; /* # of faults */ - uint64_t cow_faults; /* # of copy-on-writes */ - uint64_t lookups; /* object cache lookups */ - uint64_t hits; /* object cache hits */ - uint64_t purges; /* # of pages purged */ - natural_t purgeable_count; /* # of pages purgeable */ - /* - * NB: speculative pages are already accounted for in "free_count", - * so "speculative_count" is the number of "free" pages that are - * used to hold data that was read speculatively from disk but - * haven't actually been used by anyone so far. - */ - natural_t speculative_count; /* # of pages speculative */ - - /* added for rev1 */ - uint64_t decompressions; /* # of pages decompressed */ - uint64_t compressions; /* # of pages compressed */ - uint64_t swapins; /* # of pages swapped in (via compression segments) */ - uint64_t swapouts; /* # of pages swapped out (via compression segments) */ - natural_t compressor_page_count; /* # of pages used by the compressed pager to hold all the compressed data */ - natural_t throttled_count; /* # of pages throttled */ - natural_t external_page_count; /* # of pages that are file-backed (non-swap) */ - natural_t internal_page_count; /* # of pages that are anonymous */ - uint64_t total_uncompressed_pages_in_compressor; /* # of pages (uncompressed) held within the compressor. */ -} __attribute__((aligned(8))); - -typedef struct vm_statistics64 *vm_statistics64_t; -typedef struct vm_statistics64 vm_statistics64_data_t; - -/* - * VM_STATISTICS_TRUNCATE_TO_32_BIT - * - * This is used by host_statistics() to truncate and peg the 64-bit in-kernel values from - * vm_statistics64 to the 32-bit values of the older structure above (vm_statistics). - */ -#define VM_STATISTICS_TRUNCATE_TO_32_BIT(value) ((uint32_t)(((value) > UINT32_MAX ) ? UINT32_MAX : (value))) - -/* - * vm_extmod_statistics - * - * Structure to record modifications to a task by an - * external agent. - * - * History: - * rev0 - original structure. - */ - -struct vm_extmod_statistics { - int64_t task_for_pid_count; /* # of times task port was looked up */ - int64_t task_for_pid_caller_count; /* # of times this task called task_for_pid */ - int64_t thread_creation_count; /* # of threads created in task */ - int64_t thread_creation_caller_count; /* # of threads created by task */ - int64_t thread_set_state_count; /* # of register state sets in task */ - int64_t thread_set_state_caller_count; /* # of register state sets by task */ -} __attribute__((aligned(8))); - -typedef struct vm_extmod_statistics *vm_extmod_statistics_t; -typedef struct vm_extmod_statistics vm_extmod_statistics_data_t; - -typedef struct vm_purgeable_stat { - uint64_t count; - uint64_t size; -}vm_purgeable_stat_t; - -struct vm_purgeable_info { - vm_purgeable_stat_t fifo_data[8]; - vm_purgeable_stat_t obsolete_data; - vm_purgeable_stat_t lifo_data[8]; -}; - -typedef struct vm_purgeable_info *vm_purgeable_info_t; - -/* included for the vm_map_page_query call */ - -#define VM_PAGE_QUERY_PAGE_PRESENT 0x1 -#define VM_PAGE_QUERY_PAGE_FICTITIOUS 0x2 -#define VM_PAGE_QUERY_PAGE_REF 0x4 -#define VM_PAGE_QUERY_PAGE_DIRTY 0x8 -#define VM_PAGE_QUERY_PAGE_PAGED_OUT 0x10 -#define VM_PAGE_QUERY_PAGE_COPIED 0x20 -#define VM_PAGE_QUERY_PAGE_SPECULATIVE 0x40 -#define VM_PAGE_QUERY_PAGE_EXTERNAL 0x80 -#define VM_PAGE_QUERY_PAGE_CS_VALIDATED 0x100 -#define VM_PAGE_QUERY_PAGE_CS_TAINTED 0x200 -#define VM_PAGE_QUERY_PAGE_CS_NX 0x400 -#define VM_PAGE_QUERY_PAGE_REUSABLE 0x800 - - -/* - * VM allocation flags: - * - * VM_FLAGS_FIXED - * (really the absence of VM_FLAGS_ANYWHERE) - * Allocate new VM region at the specified virtual address, if possible. - * - * VM_FLAGS_ANYWHERE - * Allocate new VM region anywhere it would fit in the address space. - * - * VM_FLAGS_PURGABLE - * Create a purgable VM object for that new VM region. - * - * VM_FLAGS_4GB_CHUNK - * The new VM region will be chunked up into 4GB sized pieces. - * - * VM_FLAGS_NO_PMAP_CHECK - * (for DEBUG kernel config only, ignored for other configs) - * Do not check that there is no stale pmap mapping for the new VM region. - * This is useful for kernel memory allocations at bootstrap when building - * the initial kernel address space while some memory is already in use. - * - * VM_FLAGS_OVERWRITE - * The new VM region can replace existing VM regions if necessary - * (to be used in combination with VM_FLAGS_FIXED). - * - * VM_FLAGS_NO_CACHE - * Pages brought in to this VM region are placed on the speculative - * queue instead of the active queue. In other words, they are not - * cached so that they will be stolen first if memory runs low. - */ - -#define VM_FLAGS_FIXED 0x0000 -#define VM_FLAGS_ANYWHERE 0x0001 -#define VM_FLAGS_PURGABLE 0x0002 -#define VM_FLAGS_4GB_CHUNK 0x0004 -#define VM_FLAGS_RANDOM_ADDR 0x0008 -#define VM_FLAGS_NO_CACHE 0x0010 -#define VM_FLAGS_RESILIENT_CODESIGN 0x0020 -#define VM_FLAGS_RESILIENT_MEDIA 0x0040 -#define VM_FLAGS_OVERWRITE 0x4000 /* delete any existing mappings first */ -/* - * VM_FLAGS_SUPERPAGE_MASK - * 3 bits that specify whether large pages should be used instead of - * base pages (!=0), as well as the requested page size. - */ -#define VM_FLAGS_SUPERPAGE_MASK 0x70000 /* bits 0x10000, 0x20000, 0x40000 */ -#define VM_FLAGS_RETURN_DATA_ADDR 0x100000 /* Return address of target data, rather than base of page */ -#define VM_FLAGS_RETURN_4K_DATA_ADDR 0x800000 /* Return 4K aligned address of target data */ -#define VM_FLAGS_ALIAS_MASK 0xFF000000 -#define VM_GET_FLAGS_ALIAS(flags, alias) \ - (alias) = ((flags) & VM_FLAGS_ALIAS_MASK) >> 24 -#define VM_SET_FLAGS_ALIAS(flags, alias) \ - (flags) = (((flags) & ~VM_FLAGS_ALIAS_MASK) | \ - (((alias) & ~VM_FLAGS_ALIAS_MASK) << 24)) - -/* These are the flags that we accept from user-space */ -#define VM_FLAGS_USER_ALLOCATE (VM_FLAGS_FIXED | \ - VM_FLAGS_ANYWHERE | \ - VM_FLAGS_PURGABLE | \ - VM_FLAGS_4GB_CHUNK | \ - VM_FLAGS_RANDOM_ADDR | \ - VM_FLAGS_NO_CACHE | \ - VM_FLAGS_OVERWRITE | \ - VM_FLAGS_SUPERPAGE_MASK | \ - VM_FLAGS_ALIAS_MASK) -#define VM_FLAGS_USER_MAP (VM_FLAGS_USER_ALLOCATE | \ - VM_FLAGS_RETURN_4K_DATA_ADDR | \ - VM_FLAGS_RETURN_DATA_ADDR) -#define VM_FLAGS_USER_REMAP (VM_FLAGS_FIXED | \ - VM_FLAGS_ANYWHERE | \ - VM_FLAGS_RANDOM_ADDR | \ - VM_FLAGS_OVERWRITE| \ - VM_FLAGS_RETURN_DATA_ADDR | \ - VM_FLAGS_RESILIENT_CODESIGN | \ - VM_FLAGS_RESILIENT_MEDIA) - -#define VM_FLAGS_SUPERPAGE_SHIFT 16 -#define SUPERPAGE_NONE 0 /* no superpages, if all bits are 0 */ -#define SUPERPAGE_SIZE_ANY 1 -#define VM_FLAGS_SUPERPAGE_NONE (SUPERPAGE_NONE << VM_FLAGS_SUPERPAGE_SHIFT) -#define VM_FLAGS_SUPERPAGE_SIZE_ANY (SUPERPAGE_SIZE_ANY << VM_FLAGS_SUPERPAGE_SHIFT) -#define SUPERPAGE_SIZE_2MB 2 -#define VM_FLAGS_SUPERPAGE_SIZE_2MB (SUPERPAGE_SIZE_2MB< -#include - -#include - -typedef vm_offset_t pointer_t; -typedef vm_offset_t vm_address_t; - -/* - * We use addr64_t for 64-bit addresses that are used on both - * 32 and 64-bit machines. On PPC, they are passed and returned as - * two adjacent 32-bit GPRs. We use addr64_t in places where - * common code must be useable both on 32 and 64-bit machines. - */ -typedef uint64_t addr64_t; /* Basic effective address */ - -/* - * We use reg64_t for addresses that are 32 bits on a 32-bit - * machine, and 64 bits on a 64-bit machine, but are always - * passed and returned in a single GPR on PPC. This type - * cannot be used in generic 32-bit c, since on a 64-bit - * machine the upper half of the register will be ignored - * by the c compiler in 32-bit mode. In c, we can only use the - * type in prototypes of functions that are written in and called - * from assembly language. This type is basically a comment. - */ -typedef uint32_t reg64_t; - -/* - * To minimize the use of 64-bit fields, we keep some physical - * addresses (that are page aligned) as 32-bit page numbers. - * This limits the physical address space to 16TB of RAM. - */ -typedef uint32_t ppnum_t; /* Physical page number */ -#define PPNUM_MAX UINT32_MAX - - - -typedef mach_port_t vm_map_t; - - -#define VM_MAP_NULL ((vm_map_t) 0) - -/* - * Evolving definitions, likely to change. - */ - -typedef uint64_t vm_object_offset_t; -typedef uint64_t vm_object_size_t; - - - - -typedef mach_port_t upl_t; -typedef mach_port_t vm_named_entry_t; - - -#define UPL_NULL ((upl_t) 0) -#define VM_NAMED_ENTRY_NULL ((vm_named_entry_t) 0) - -#endif /* _MACH_VM_TYPES_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/mach_debug/ipc_info.h b/lib/libc/include/x86_64-macos-gnu/mach_debug/ipc_info.h deleted file mode 100644 index deb07cac5e..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/mach_debug/ipc_info.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (c) 2000-2005 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * @OSF_COPYRIGHT@ - */ -/* - * Mach Operating System - * Copyright (c) 1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ -/* - */ -/* - * File: mach_debug/ipc_info.h - * Author: Rich Draves - * Date: March, 1990 - * - * Definitions for the IPC debugging interface. - */ - -#ifndef _MACH_DEBUG_IPC_INFO_H_ -#define _MACH_DEBUG_IPC_INFO_H_ - -#include -#include -#include - -/* - * Remember to update the mig type definitions - * in mach_debug_types.defs when adding/removing fields. - */ - -typedef struct ipc_info_space { - natural_t iis_genno_mask; /* generation number mask */ - natural_t iis_table_size; /* size of table */ - natural_t iis_table_next; /* next possible size of table */ - natural_t iis_tree_size; /* size of tree (UNUSED) */ - natural_t iis_tree_small; /* # of small entries in tree (UNUSED) */ - natural_t iis_tree_hash; /* # of hashed entries in tree (UNUSED) */ -} ipc_info_space_t; - -typedef struct ipc_info_space_basic { - natural_t iisb_genno_mask; /* generation number mask */ - natural_t iisb_table_size; /* size of table */ - natural_t iisb_table_next; /* next possible size of table */ - natural_t iisb_table_inuse; /* number of entries in use */ - natural_t iisb_reserved[2]; /* future expansion */ -} ipc_info_space_basic_t; - -typedef struct ipc_info_name { - mach_port_name_t iin_name; /* port name, including gen number */ -/*boolean_t*/ integer_t iin_collision; /* collision at this entry? */ - mach_port_type_t iin_type; /* straight port type */ - mach_port_urefs_t iin_urefs; /* user-references */ - natural_t iin_object; /* object pointer/identifier */ - natural_t iin_next; /* marequest/next in free list */ - natural_t iin_hash; /* hash index */ -} ipc_info_name_t; - -typedef ipc_info_name_t *ipc_info_name_array_t; - -/* UNUSED */ -typedef struct ipc_info_tree_name { - ipc_info_name_t iitn_name; - mach_port_name_t iitn_lchild; /* name of left child */ - mach_port_name_t iitn_rchild; /* name of right child */ -} ipc_info_tree_name_t; - -typedef ipc_info_tree_name_t *ipc_info_tree_name_array_t; - -#endif /* _MACH_DEBUG_IPC_INFO_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/machine/_mcontext.h b/lib/libc/include/x86_64-macos-gnu/machine/_mcontext.h deleted file mode 100644 index 9ccd985fcc..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/machine/_mcontext.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2003-2012 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -#if defined (__i386__) || defined (__x86_64__) -#include "i386/_mcontext.h" -#else -#error architecture not supported -#endif \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/machine/_param.h b/lib/libc/include/x86_64-macos-gnu/machine/_param.h deleted file mode 100644 index c40232c3c2..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/machine/_param.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2004-2007 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -#if defined (__i386__) || defined (__x86_64__) -#include "i386/_param.h" -#else -#error architecture not supported -#endif \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/machine/_types.h b/lib/libc/include/x86_64-macos-gnu/machine/_types.h deleted file mode 100644 index 0ed6acf677..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/machine/_types.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2003-2007 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -#ifndef _BSD_MACHINE__TYPES_H_ -#define _BSD_MACHINE__TYPES_H_ - -#if defined (__i386__) || defined(__x86_64__) -#include "i386/_types.h" -#else -#error architecture not supported -#endif - -#endif /* _BSD_MACHINE__TYPES_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/machine/endian.h b/lib/libc/include/x86_64-macos-gnu/machine/endian.h deleted file mode 100644 index 85c8f12508..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/machine/endian.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2000-2007 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * Copyright 1995 NeXT Computer, Inc. All rights reserved. - */ -#ifndef _BSD_MACHINE_ENDIAN_H_ -#define _BSD_MACHINE_ENDIAN_H_ - -#if defined (__i386__) || defined(__x86_64__) -#include "i386/endian.h" -#else -#error architecture not supported -#endif - -#endif /* _BSD_MACHINE_ENDIAN_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/machine/limits.h b/lib/libc/include/x86_64-macos-gnu/machine/limits.h deleted file mode 100644 index 9763e810b6..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/machine/limits.h +++ /dev/null @@ -1,9 +0,0 @@ -/* This is the `system' limits.h, independent of any particular - * compiler. GCC provides its own limits.h which can be found in - * /usr/lib/gcc, although it is not very informative. - * This file is public domain. */ -#if defined (__i386__) || defined(__x86_64__) -#include -#else -#error architecture not supported -#endif \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/machine/param.h b/lib/libc/include/x86_64-macos-gnu/machine/param.h deleted file mode 100644 index 8435acbdfb..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/machine/param.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2000-2007 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * Copyright 1995 NeXT Computer, Inc. All rights reserved. - */ -#ifndef _BSD_MACHINE_PARAM_H_ -#define _BSD_MACHINE_PARAM_H_ - -#if defined (__i386__) || defined(__x86_64__) -#include "i386/param.h" -#else -#error architecture not supported -#endif - -#endif /* _BSD_MACHINE_PARAM_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/machine/signal.h b/lib/libc/include/x86_64-macos-gnu/machine/signal.h deleted file mode 100644 index 19ef535ebd..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/machine/signal.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2000-2007 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -#ifndef _BSD_MACHINE_SIGNAL_H_ -#define _BSD_MACHINE_SIGNAL_H_ - -#if defined (__i386__) || defined(__x86_64__) -#include "i386/signal.h" -#else -#error architecture not supported -#endif - -#endif /* _BSD_MACHINE_SIGNAL_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/machine/types.h b/lib/libc/include/x86_64-macos-gnu/machine/types.h deleted file mode 100644 index 5d1a1e575f..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/machine/types.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2000-2007 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * Copyright 1995 NeXT Computer, Inc. All rights reserved. - */ -#ifndef _BSD_MACHINE_TYPES_H_ -#define _BSD_MACHINE_TYPES_H_ - -#if defined (__i386__) || defined(__x86_64__) -#include "i386/types.h" -#else -#error architecture not supported -#endif - -#endif /* _BSD_MACHINE_TYPES_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/malloc/_malloc.h b/lib/libc/include/x86_64-macos-gnu/malloc/_malloc.h deleted file mode 100644 index 91555d11bb..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/malloc/_malloc.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2018 Apple Computer, Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - -#ifndef _MALLOC_UNDERSCORE_MALLOC_H_ -#define _MALLOC_UNDERSCORE_MALLOC_H_ - -/* - * This header is included from , so the contents of this file have - * broad source compatibility and POSIX conformance implications. - * Be cautious about what is included and declared here. - */ - -#include -#include -#include <_types.h> -#include - -__BEGIN_DECLS - -void *malloc(size_t __size) __result_use_check __alloc_size(1); -void *calloc(size_t __count, size_t __size) __result_use_check __alloc_size(1,2); -void free(void *); -void *realloc(void *__ptr, size_t __size) __result_use_check __alloc_size(2); -#if !defined(_ANSI_SOURCE) && (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)) -void *valloc(size_t) __alloc_size(1); -#endif // !defined(_ANSI_SOURCE) && (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)) -#if (__DARWIN_C_LEVEL >= __DARWIN_C_FULL) && \ - ((defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || \ - (defined(__cplusplus) && __cplusplus >= 201703L)) -void *aligned_alloc(size_t __alignment, size_t __size) __result_use_check __alloc_size(2) __OSX_AVAILABLE(10.15) __IOS_AVAILABLE(13.0) __TVOS_AVAILABLE(13.0) __WATCHOS_AVAILABLE(6.0); -#endif -int posix_memalign(void **__memptr, size_t __alignment, size_t __size) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_0); - -__END_DECLS - -#endif /* _MALLOC_UNDERSCORE_MALLOC_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/malloc/malloc.h b/lib/libc/include/x86_64-macos-gnu/malloc/malloc.h deleted file mode 100644 index 0bddfda43b..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/malloc/malloc.h +++ /dev/null @@ -1,314 +0,0 @@ -/* - * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - -#ifndef _MALLOC_MALLOC_H_ -#define _MALLOC_MALLOC_H_ - -#include -#include -#include -#include - -#if __has_feature(ptrauth_calls) -#include - -// Zone function pointer, type-diversified but not address-diversified (because -// the zone can be copied). Process-independent because the zone structure may -// be in the shared library cache. -#define MALLOC_ZONE_FN_PTR(fn) __ptrauth(ptrauth_key_process_independent_code, \ - FALSE, ptrauth_string_discriminator("malloc_zone_fn." #fn)) fn - -// Introspection function pointer, address- and type-diversified. -// Process-independent because the malloc_introspection_t structure that contains -// these pointers may be in the shared library cache. -#define MALLOC_INTROSPECT_FN_PTR(fn) __ptrauth(ptrauth_key_process_independent_code, \ - TRUE, ptrauth_string_discriminator("malloc_introspect_fn." #fn)) fn - -// Pointer to the introspection pointer table, type-diversified but not -// address-diversified (because the zone can be copied). -// Process-independent because the table pointer may be in the shared library cache. -#define MALLOC_INTROSPECT_TBL_PTR(ptr) __ptrauth(ptrauth_key_process_independent_data,\ - FALSE, ptrauth_string_discriminator("malloc_introspect_tbl")) ptr - -#endif // __has_feature(ptrauth_calls) - -#ifndef MALLOC_ZONE_FN_PTR -#define MALLOC_ZONE_FN_PTR(fn) fn -#define MALLOC_INTROSPECT_FN_PTR(fn) fn -#define MALLOC_INTROSPECT_TBL_PTR(ptr) ptr -#endif // MALLOC_ZONE_FN_PTR - -__BEGIN_DECLS -/********* Type definitions ************/ - -typedef struct _malloc_zone_t { - /* Only zone implementors should depend on the layout of this structure; - Regular callers should use the access functions below */ - void *reserved1; /* RESERVED FOR CFAllocator DO NOT USE */ - void *reserved2; /* RESERVED FOR CFAllocator DO NOT USE */ - size_t (* MALLOC_ZONE_FN_PTR(size))(struct _malloc_zone_t *zone, const void *ptr); /* returns the size of a block or 0 if not in this zone; must be fast, especially for negative answers */ - void *(* MALLOC_ZONE_FN_PTR(malloc))(struct _malloc_zone_t *zone, size_t size); - void *(* MALLOC_ZONE_FN_PTR(calloc))(struct _malloc_zone_t *zone, size_t num_items, size_t size); /* same as malloc, but block returned is set to zero */ - void *(* MALLOC_ZONE_FN_PTR(valloc))(struct _malloc_zone_t *zone, size_t size); /* same as malloc, but block returned is set to zero and is guaranteed to be page aligned */ - void (* MALLOC_ZONE_FN_PTR(free))(struct _malloc_zone_t *zone, void *ptr); - void *(* MALLOC_ZONE_FN_PTR(realloc))(struct _malloc_zone_t *zone, void *ptr, size_t size); - void (* MALLOC_ZONE_FN_PTR(destroy))(struct _malloc_zone_t *zone); /* zone is destroyed and all memory reclaimed */ - const char *zone_name; - - /* Optional batch callbacks; these may be NULL */ - unsigned (* MALLOC_ZONE_FN_PTR(batch_malloc))(struct _malloc_zone_t *zone, size_t size, void **results, unsigned num_requested); /* given a size, returns pointers capable of holding that size; returns the number of pointers allocated (maybe 0 or less than num_requested) */ - void (* MALLOC_ZONE_FN_PTR(batch_free))(struct _malloc_zone_t *zone, void **to_be_freed, unsigned num_to_be_freed); /* frees all the pointers in to_be_freed; note that to_be_freed may be overwritten during the process */ - - struct malloc_introspection_t * MALLOC_INTROSPECT_TBL_PTR(introspect); - unsigned version; - - /* aligned memory allocation. The callback may be NULL. Present in version >= 5. */ - void *(* MALLOC_ZONE_FN_PTR(memalign))(struct _malloc_zone_t *zone, size_t alignment, size_t size); - - /* free a pointer known to be in zone and known to have the given size. The callback may be NULL. Present in version >= 6.*/ - void (* MALLOC_ZONE_FN_PTR(free_definite_size))(struct _malloc_zone_t *zone, void *ptr, size_t size); - - /* Empty out caches in the face of memory pressure. The callback may be NULL. Present in version >= 8. */ - size_t (* MALLOC_ZONE_FN_PTR(pressure_relief))(struct _malloc_zone_t *zone, size_t goal); - - /* - * Checks whether an address might belong to the zone. May be NULL. Present in version >= 10. - * False positives are allowed (e.g. the pointer was freed, or it's in zone space that has - * not yet been allocated. False negatives are not allowed. - */ - boolean_t (* MALLOC_ZONE_FN_PTR(claimed_address))(struct _malloc_zone_t *zone, void *ptr); -} malloc_zone_t; - -/********* Creation and destruction ************/ - -extern malloc_zone_t *malloc_default_zone(void); - /* The initial zone */ - -extern malloc_zone_t *malloc_create_zone(vm_size_t start_size, unsigned flags); - /* Creates a new zone with default behavior and registers it */ - -extern void malloc_destroy_zone(malloc_zone_t *zone); - /* Destroys zone and everything it allocated */ - -/********* Block creation and manipulation ************/ - -extern void *malloc_zone_malloc(malloc_zone_t *zone, size_t size) __alloc_size(2); - /* Allocates a new pointer of size size; zone must be non-NULL */ - -extern void *malloc_zone_calloc(malloc_zone_t *zone, size_t num_items, size_t size) __alloc_size(2,3); - /* Allocates a new pointer of size num_items * size; block is cleared; zone must be non-NULL */ - -extern void *malloc_zone_valloc(malloc_zone_t *zone, size_t size) __alloc_size(2); - /* Allocates a new pointer of size size; zone must be non-NULL; Pointer is guaranteed to be page-aligned and block is cleared */ - -extern void malloc_zone_free(malloc_zone_t *zone, void *ptr); - /* Frees pointer in zone; zone must be non-NULL */ - -extern void *malloc_zone_realloc(malloc_zone_t *zone, void *ptr, size_t size) __alloc_size(3); - /* Enlarges block if necessary; zone must be non-NULL */ - -extern malloc_zone_t *malloc_zone_from_ptr(const void *ptr); - /* Returns the zone for a pointer, or NULL if not in any zone. - The ptr must have been returned from a malloc or realloc call. */ - -extern size_t malloc_size(const void *ptr); - /* Returns size of given ptr */ - -extern size_t malloc_good_size(size_t size); - /* Returns number of bytes greater than or equal to size that can be allocated without padding */ - -extern void *malloc_zone_memalign(malloc_zone_t *zone, size_t alignment, size_t size) __alloc_size(3) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_0); - /* - * Allocates a new pointer of size size whose address is an exact multiple of alignment. - * alignment must be a power of two and at least as large as sizeof(void *). - * zone must be non-NULL. - */ - -/********* Batch methods ************/ - -extern unsigned malloc_zone_batch_malloc(malloc_zone_t *zone, size_t size, void **results, unsigned num_requested); - /* Allocates num blocks of the same size; Returns the number truly allocated (may be 0) */ - -extern void malloc_zone_batch_free(malloc_zone_t *zone, void **to_be_freed, unsigned num); - /* frees all the pointers in to_be_freed; note that to_be_freed may be overwritten during the process; This function will always free even if the zone has no batch callback */ - -/********* Functions for libcache ************/ - -extern malloc_zone_t *malloc_default_purgeable_zone(void) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_0); - /* Returns a pointer to the default purgeable_zone. */ - -extern void malloc_make_purgeable(void *ptr) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_0); - /* Make an allocation from the purgeable zone purgeable if possible. */ - -extern int malloc_make_nonpurgeable(void *ptr) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_0); - /* Makes an allocation from the purgeable zone nonpurgeable. - * Returns zero if the contents were not purged since the last - * call to malloc_make_purgeable, else returns non-zero. */ - -/********* Functions for zone implementors ************/ - -extern void malloc_zone_register(malloc_zone_t *zone); - /* Registers a custom malloc zone; Should typically be called after a - * malloc_zone_t has been filled in with custom methods by a client. See - * malloc_create_zone for creating additional malloc zones with the - * default allocation and free behavior. */ - -extern void malloc_zone_unregister(malloc_zone_t *zone); - /* De-registers a zone - Should typically be called before calling the zone destruction routine */ - -extern void malloc_set_zone_name(malloc_zone_t *zone, const char *name); - /* Sets the name of a zone */ - -extern const char *malloc_get_zone_name(malloc_zone_t *zone); - /* Returns the name of a zone */ - -size_t malloc_zone_pressure_relief(malloc_zone_t *zone, size_t goal) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); - /* malloc_zone_pressure_relief() advises the malloc subsystem that the process is under memory pressure and - * that the subsystem should make its best effort towards releasing (i.e. munmap()-ing) "goal" bytes from "zone". - * If "goal" is passed as zero, the malloc subsystem will attempt to achieve maximal pressure relief in "zone". - * If "zone" is passed as NULL, all zones are examined for pressure relief opportunities. - * malloc_zone_pressure_relief() returns the number of bytes released. - */ - -typedef struct { - vm_address_t address; - vm_size_t size; -} vm_range_t; - -typedef struct malloc_statistics_t { - unsigned blocks_in_use; - size_t size_in_use; - size_t max_size_in_use; /* high water mark of touched memory */ - size_t size_allocated; /* reserved in memory */ -} malloc_statistics_t; - -typedef kern_return_t memory_reader_t(task_t remote_task, vm_address_t remote_address, vm_size_t size, void **local_memory); - /* given a task, "reads" the memory at the given address and size -local_memory: set to a contiguous chunk of memory; validity of local_memory is assumed to be limited (until next call) */ - -#define MALLOC_PTR_IN_USE_RANGE_TYPE 1 /* for allocated pointers */ -#define MALLOC_PTR_REGION_RANGE_TYPE 2 /* for region containing pointers */ -#define MALLOC_ADMIN_REGION_RANGE_TYPE 4 /* for region used internally */ -#define MALLOC_ZONE_SPECIFIC_FLAGS 0xff00 /* bits reserved for zone-specific purposes */ - -typedef void vm_range_recorder_t(task_t, void *, unsigned type, vm_range_t *, unsigned); - /* given a task and context, "records" the specified addresses */ - -/* Print function for the print_task() operation. */ -typedef void print_task_printer_t(const char *fmt, ...); - -typedef struct malloc_introspection_t { - kern_return_t (* MALLOC_INTROSPECT_FN_PTR(enumerator))(task_t task, void *, unsigned type_mask, vm_address_t zone_address, memory_reader_t reader, vm_range_recorder_t recorder); /* enumerates all the malloc pointers in use */ - size_t (* MALLOC_INTROSPECT_FN_PTR(good_size))(malloc_zone_t *zone, size_t size); - boolean_t (* MALLOC_INTROSPECT_FN_PTR(check))(malloc_zone_t *zone); /* Consistency checker */ - void (* MALLOC_INTROSPECT_FN_PTR(print))(malloc_zone_t *zone, boolean_t verbose); /* Prints zone */ - void (* MALLOC_INTROSPECT_FN_PTR(log))(malloc_zone_t *zone, void *address); /* Enables logging of activity */ - void (* MALLOC_INTROSPECT_FN_PTR(force_lock))(malloc_zone_t *zone); /* Forces locking zone */ - void (* MALLOC_INTROSPECT_FN_PTR(force_unlock))(malloc_zone_t *zone); /* Forces unlocking zone */ - void (* MALLOC_INTROSPECT_FN_PTR(statistics))(malloc_zone_t *zone, malloc_statistics_t *stats); /* Fills statistics */ - boolean_t (* MALLOC_INTROSPECT_FN_PTR(zone_locked))(malloc_zone_t *zone); /* Are any zone locks held */ - - /* Discharge checking. Present in version >= 7. */ - boolean_t (* MALLOC_INTROSPECT_FN_PTR(enable_discharge_checking))(malloc_zone_t *zone); - void (* MALLOC_INTROSPECT_FN_PTR(disable_discharge_checking))(malloc_zone_t *zone); - void (* MALLOC_INTROSPECT_FN_PTR(discharge))(malloc_zone_t *zone, void *memory); -#ifdef __BLOCKS__ - void (* MALLOC_INTROSPECT_FN_PTR(enumerate_discharged_pointers))(malloc_zone_t *zone, void (^report_discharged)(void *memory, void *info)); - #else - void *enumerate_unavailable_without_blocks; -#endif /* __BLOCKS__ */ - void (* MALLOC_INTROSPECT_FN_PTR(reinit_lock))(malloc_zone_t *zone); /* Reinitialize zone locks, called only from atfork_child handler. Present in version >= 9. */ - void (* MALLOC_INTROSPECT_FN_PTR(print_task))(task_t task, unsigned level, vm_address_t zone_address, memory_reader_t reader, print_task_printer_t printer); /* debug print for another process. Present in version >= 11. */ - void (* MALLOC_INTROSPECT_FN_PTR(task_statistics))(task_t task, vm_address_t zone_address, memory_reader_t reader, malloc_statistics_t *stats); /* Present in version >= 12 */ -} malloc_introspection_t; - -// The value of "level" when passed to print_task() that corresponds to -// verbose passed to print() -#define MALLOC_VERBOSE_PRINT_LEVEL 2 - -extern void malloc_printf(const char *format, ...); - /* Convenience for logging errors and warnings; - No allocation is performed during execution of this function; - Only understands usual %p %d %s formats, and %y that expresses a number of bytes (5b,10KB,1MB...) - */ - -/********* Functions for performance tools ************/ - -extern kern_return_t malloc_get_all_zones(task_t task, memory_reader_t reader, vm_address_t **addresses, unsigned *count); - /* Fills addresses and count with the addresses of the zones in task; - Note that the validity of the addresses returned correspond to the validity of the memory returned by reader */ - -/********* Debug helpers ************/ - -extern void malloc_zone_print_ptr_info(void *ptr); - /* print to stdout if this pointer is in the malloc heap, free status, and size */ - -extern boolean_t malloc_zone_check(malloc_zone_t *zone); - /* Checks zone is well formed; if !zone, checks all zones */ - -extern void malloc_zone_print(malloc_zone_t *zone, boolean_t verbose); - /* Prints summary on zone; if !zone, prints all zones */ - -extern void malloc_zone_statistics(malloc_zone_t *zone, malloc_statistics_t *stats); - /* Fills statistics for zone; if !zone, sums up all zones */ - -extern void malloc_zone_log(malloc_zone_t *zone, void *address); - /* Controls logging of all activity; if !zone, for all zones; - If address==0 nothing is logged; - If address==-1 all activity is logged; - Else only the activity regarding address is logged */ - -struct mstats { - size_t bytes_total; - size_t chunks_used; - size_t bytes_used; - size_t chunks_free; - size_t bytes_free; -}; - -extern struct mstats mstats(void); - -extern boolean_t malloc_zone_enable_discharge_checking(malloc_zone_t *zone) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); -/* Increment the discharge checking enabled counter for a zone. Returns true if the zone supports checking, false if it does not. */ - -extern void malloc_zone_disable_discharge_checking(malloc_zone_t *zone) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); -/* Decrement the discharge checking enabled counter for a zone. */ - -extern void malloc_zone_discharge(malloc_zone_t *zone, void *memory) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); -/* Register memory that the programmer expects to be freed soon. - zone may be NULL in which case the zone is determined using malloc_zone_from_ptr(). - If discharge checking is off for the zone this function is a no-op. */ - -#ifdef __BLOCKS__ -extern void malloc_zone_enumerate_discharged_pointers(malloc_zone_t *zone, void (^report_discharged)(void *memory, void *info)) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); -/* Calls report_discharged for each block that was registered using malloc_zone_discharge() but has not yet been freed. - info is used to provide zone defined information about the memory block. - If zone is NULL then the enumeration covers all zones. */ -#else -extern void malloc_zone_enumerate_discharged_pointers(malloc_zone_t *zone, void *) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); -#endif /* __BLOCKS__ */ - -__END_DECLS - -#endif /* _MALLOC_MALLOC_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/math.h b/lib/libc/include/x86_64-macos-gnu/math.h deleted file mode 100644 index 8bb019247e..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/math.h +++ /dev/null @@ -1,771 +0,0 @@ -/* - * Copyright (c) 2002-2017 Apple Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * The contents of this file constitute Original Code as defined in and - * are subject to the Apple Public Source License Version 1.1 (the - * "License"). You may not use this file except in compliance with the - * License. Please obtain a copy of the License at - * http://www.apple.com/publicsource and read it before using this file. - * - * This Original Code and all software distributed under the License are - * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the - * License for the specific language governing rights and limitations - * under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - -#ifndef __MATH_H__ -#define __MATH_H__ - -#ifndef __MATH__ -#define __MATH__ -#endif - -#include -#include - -__BEGIN_DECLS - -/****************************************************************************** - * Floating point data types * - ******************************************************************************/ - -/* Define float_t and double_t per C standard, ISO/IEC 9899:2011 7.12 2, - taking advantage of GCC's __FLT_EVAL_METHOD__ (which a compiler may - define anytime and GCC does) that shadows FLT_EVAL_METHOD (which a - compiler must define only in float.h). */ -#if __FLT_EVAL_METHOD__ == 0 - typedef float float_t; - typedef double double_t; -#elif __FLT_EVAL_METHOD__ == 1 - typedef double float_t; - typedef double double_t; -#elif __FLT_EVAL_METHOD__ == 2 || __FLT_EVAL_METHOD__ == -1 - typedef long double float_t; - typedef long double double_t; -#else /* __FLT_EVAL_METHOD__ */ -# error "Unsupported value of __FLT_EVAL_METHOD__." -#endif /* __FLT_EVAL_METHOD__ */ - -#if defined(__GNUC__) -# define HUGE_VAL __builtin_huge_val() -# define HUGE_VALF __builtin_huge_valf() -# define HUGE_VALL __builtin_huge_vall() -# define NAN __builtin_nanf("0x7fc00000") -#else -# define HUGE_VAL 1e500 -# define HUGE_VALF 1e50f -# define HUGE_VALL 1e5000L -# define NAN __nan() -#endif - -#define INFINITY HUGE_VALF - -/****************************************************************************** - * Taxonomy of floating point data types * - ******************************************************************************/ - -#define FP_NAN 1 -#define FP_INFINITE 2 -#define FP_ZERO 3 -#define FP_NORMAL 4 -#define FP_SUBNORMAL 5 -#define FP_SUPERNORMAL 6 /* legacy PowerPC support; this is otherwise unused */ - -#if defined __arm64__ || defined __ARM_VFPV4__ -/* On these architectures, fma(), fmaf( ), and fmal( ) are generally about as - fast as (or faster than) separate multiply and add of the same operands. */ -# define FP_FAST_FMA 1 -# define FP_FAST_FMAF 1 -# define FP_FAST_FMAL 1 -#elif (defined __i386__ || defined __x86_64__) && (defined __FMA__ || defined __AVX512F__) -/* When targeting the FMA ISA extension, fma() and fmaf( ) are generally - about as fast as (or faster than) separate multiply and add of the same - operands, but fmal( ) may be more costly. */ -# define FP_FAST_FMA 1 -# define FP_FAST_FMAF 1 -# undef FP_FAST_FMAL -#else -/* On these architectures, fma( ), fmaf( ), and fmal( ) function calls are - significantly more costly than separate multiply and add operations. */ -# undef FP_FAST_FMA -# undef FP_FAST_FMAF -# undef FP_FAST_FMAL -#endif - -/* The values returned by `ilogb' for 0 and NaN respectively. */ -#define FP_ILOGB0 (-2147483647 - 1) -#define FP_ILOGBNAN (-2147483647 - 1) - -/* Bitmasks for the math_errhandling macro. */ -#define MATH_ERRNO 1 /* errno set by math functions. */ -#define MATH_ERREXCEPT 2 /* Exceptions raised by math functions. */ - -#define math_errhandling (__math_errhandling()) -extern int __math_errhandling(void); - -/****************************************************************************** - * * - * Inquiry macros * - * * - * fpclassify Returns one of the FP_* values. * - * isnormal Non-zero if and only if the argument x is normalized. * - * isfinite Non-zero if and only if the argument x is finite. * - * isnan Non-zero if and only if the argument x is a NaN. * - * signbit Non-zero if and only if the sign of the argument x is * - * negative. This includes, NaNs, infinities and zeros. * - * * - ******************************************************************************/ - -#define fpclassify(x) \ - ( sizeof(x) == sizeof(float) ? __fpclassifyf((float)(x)) \ - : sizeof(x) == sizeof(double) ? __fpclassifyd((double)(x)) \ - : __fpclassifyl((long double)(x))) - -extern int __fpclassifyf(float); -extern int __fpclassifyd(double); -extern int __fpclassifyl(long double); - -#if (defined(__GNUC__) && 0 == __FINITE_MATH_ONLY__) -/* These inline functions may fail to return expected results if unsafe - math optimizations like those enabled by -ffast-math are turned on. - Thus, (somewhat surprisingly) you only get the fast inline - implementations if such compiler options are NOT enabled. This is - because the inline functions require the compiler to be adhering to - the standard in order to work properly; -ffast-math, among other - things, implies that NaNs don't happen, which allows the compiler to - optimize away checks like x != x, which might lead to things like - isnan(NaN) returning false. - - Thus, if you compile with -ffast-math, actual function calls are - generated for these utilities. */ - -#define isnormal(x) \ - ( sizeof(x) == sizeof(float) ? __inline_isnormalf((float)(x)) \ - : sizeof(x) == sizeof(double) ? __inline_isnormald((double)(x)) \ - : __inline_isnormall((long double)(x))) - -#define isfinite(x) \ - ( sizeof(x) == sizeof(float) ? __inline_isfinitef((float)(x)) \ - : sizeof(x) == sizeof(double) ? __inline_isfinited((double)(x)) \ - : __inline_isfinitel((long double)(x))) - -#define isinf(x) \ - ( sizeof(x) == sizeof(float) ? __inline_isinff((float)(x)) \ - : sizeof(x) == sizeof(double) ? __inline_isinfd((double)(x)) \ - : __inline_isinfl((long double)(x))) - -#define isnan(x) \ - ( sizeof(x) == sizeof(float) ? __inline_isnanf((float)(x)) \ - : sizeof(x) == sizeof(double) ? __inline_isnand((double)(x)) \ - : __inline_isnanl((long double)(x))) - -#define signbit(x) \ - ( sizeof(x) == sizeof(float) ? __inline_signbitf((float)(x)) \ - : sizeof(x) == sizeof(double) ? __inline_signbitd((double)(x)) \ - : __inline_signbitl((long double)(x))) - -__header_always_inline int __inline_isfinitef(float); -__header_always_inline int __inline_isfinited(double); -__header_always_inline int __inline_isfinitel(long double); -__header_always_inline int __inline_isinff(float); -__header_always_inline int __inline_isinfd(double); -__header_always_inline int __inline_isinfl(long double); -__header_always_inline int __inline_isnanf(float); -__header_always_inline int __inline_isnand(double); -__header_always_inline int __inline_isnanl(long double); -__header_always_inline int __inline_isnormalf(float); -__header_always_inline int __inline_isnormald(double); -__header_always_inline int __inline_isnormall(long double); -__header_always_inline int __inline_signbitf(float); -__header_always_inline int __inline_signbitd(double); -__header_always_inline int __inline_signbitl(long double); - -__header_always_inline int __inline_isfinitef(float __x) { - return __x == __x && __builtin_fabsf(__x) != __builtin_inff(); -} -__header_always_inline int __inline_isfinited(double __x) { - return __x == __x && __builtin_fabs(__x) != __builtin_inf(); -} -__header_always_inline int __inline_isfinitel(long double __x) { - return __x == __x && __builtin_fabsl(__x) != __builtin_infl(); -} -__header_always_inline int __inline_isinff(float __x) { - return __builtin_fabsf(__x) == __builtin_inff(); -} -__header_always_inline int __inline_isinfd(double __x) { - return __builtin_fabs(__x) == __builtin_inf(); -} -__header_always_inline int __inline_isinfl(long double __x) { - return __builtin_fabsl(__x) == __builtin_infl(); -} -__header_always_inline int __inline_isnanf(float __x) { - return __x != __x; -} -__header_always_inline int __inline_isnand(double __x) { - return __x != __x; -} -__header_always_inline int __inline_isnanl(long double __x) { - return __x != __x; -} -__header_always_inline int __inline_signbitf(float __x) { - union { float __f; unsigned int __u; } __u; - __u.__f = __x; - return (int)(__u.__u >> 31); -} -__header_always_inline int __inline_signbitd(double __x) { - union { double __f; unsigned long long __u; } __u; - __u.__f = __x; - return (int)(__u.__u >> 63); -} -#if defined __i386__ || defined __x86_64__ -__header_always_inline int __inline_signbitl(long double __x) { - union { - long double __ld; - struct{ unsigned long long __m; unsigned short __sexp; } __p; - } __u; - __u.__ld = __x; - return (int)(__u.__p.__sexp >> 15); -} -#else -__header_always_inline int __inline_signbitl(long double __x) { - union { long double __f; unsigned long long __u;} __u; - __u.__f = __x; - return (int)(__u.__u >> 63); -} -#endif -__header_always_inline int __inline_isnormalf(float __x) { - return __inline_isfinitef(__x) && __builtin_fabsf(__x) >= __FLT_MIN__; -} -__header_always_inline int __inline_isnormald(double __x) { - return __inline_isfinited(__x) && __builtin_fabs(__x) >= __DBL_MIN__; -} -__header_always_inline int __inline_isnormall(long double __x) { - return __inline_isfinitel(__x) && __builtin_fabsl(__x) >= __LDBL_MIN__; -} - -#else /* defined(__GNUC__) && 0 == __FINITE_MATH_ONLY__ */ - -/* Implementations making function calls to fall back on when -ffast-math - or similar is specified. These are not available in iOS versions prior - to 6.0. If you need them, you must target that version or later. */ - -#define isnormal(x) \ - ( sizeof(x) == sizeof(float) ? __isnormalf((float)(x)) \ - : sizeof(x) == sizeof(double) ? __isnormald((double)(x)) \ - : __isnormall((long double)(x))) - -#define isfinite(x) \ - ( sizeof(x) == sizeof(float) ? __isfinitef((float)(x)) \ - : sizeof(x) == sizeof(double) ? __isfinited((double)(x)) \ - : __isfinitel((long double)(x))) - -#define isinf(x) \ - ( sizeof(x) == sizeof(float) ? __isinff((float)(x)) \ - : sizeof(x) == sizeof(double) ? __isinfd((double)(x)) \ - : __isinfl((long double)(x))) - -#define isnan(x) \ - ( sizeof(x) == sizeof(float) ? __isnanf((float)(x)) \ - : sizeof(x) == sizeof(double) ? __isnand((double)(x)) \ - : __isnanl((long double)(x))) - -#define signbit(x) \ - ( sizeof(x) == sizeof(float) ? __signbitf((float)(x)) \ - : sizeof(x) == sizeof(double) ? __signbitd((double)(x)) \ - : __signbitl((long double)(x))) - -extern int __isnormalf(float); -extern int __isnormald(double); -extern int __isnormall(long double); -extern int __isfinitef(float); -extern int __isfinited(double); -extern int __isfinitel(long double); -extern int __isinff(float); -extern int __isinfd(double); -extern int __isinfl(long double); -extern int __isnanf(float); -extern int __isnand(double); -extern int __isnanl(long double); -extern int __signbitf(float); -extern int __signbitd(double); -extern int __signbitl(long double); - -#endif /* defined(__GNUC__) && 0 == __FINITE_MATH_ONLY__ */ - -/****************************************************************************** - * * - * Math Functions * - * * - ******************************************************************************/ - -extern float acosf(float); -extern double acos(double); -extern long double acosl(long double); - -extern float asinf(float); -extern double asin(double); -extern long double asinl(long double); - -extern float atanf(float); -extern double atan(double); -extern long double atanl(long double); - -extern float atan2f(float, float); -extern double atan2(double, double); -extern long double atan2l(long double, long double); - -extern float cosf(float); -extern double cos(double); -extern long double cosl(long double); - -extern float sinf(float); -extern double sin(double); -extern long double sinl(long double); - -extern float tanf(float); -extern double tan(double); -extern long double tanl(long double); - -extern float acoshf(float); -extern double acosh(double); -extern long double acoshl(long double); - -extern float asinhf(float); -extern double asinh(double); -extern long double asinhl(long double); - -extern float atanhf(float); -extern double atanh(double); -extern long double atanhl(long double); - -extern float coshf(float); -extern double cosh(double); -extern long double coshl(long double); - -extern float sinhf(float); -extern double sinh(double); -extern long double sinhl(long double); - -extern float tanhf(float); -extern double tanh(double); -extern long double tanhl(long double); - -extern float expf(float); -extern double exp(double); -extern long double expl(long double); - -extern float exp2f(float); -extern double exp2(double); -extern long double exp2l(long double); - -extern float expm1f(float); -extern double expm1(double); -extern long double expm1l(long double); - -extern float logf(float); -extern double log(double); -extern long double logl(long double); - -extern float log10f(float); -extern double log10(double); -extern long double log10l(long double); - -extern float log2f(float); -extern double log2(double); -extern long double log2l(long double); - -extern float log1pf(float); -extern double log1p(double); -extern long double log1pl(long double); - -extern float logbf(float); -extern double logb(double); -extern long double logbl(long double); - -extern float modff(float, float *); -extern double modf(double, double *); -extern long double modfl(long double, long double *); - -extern float ldexpf(float, int); -extern double ldexp(double, int); -extern long double ldexpl(long double, int); - -extern float frexpf(float, int *); -extern double frexp(double, int *); -extern long double frexpl(long double, int *); - -extern int ilogbf(float); -extern int ilogb(double); -extern int ilogbl(long double); - -extern float scalbnf(float, int); -extern double scalbn(double, int); -extern long double scalbnl(long double, int); - -extern float scalblnf(float, long int); -extern double scalbln(double, long int); -extern long double scalblnl(long double, long int); - -extern float fabsf(float); -extern double fabs(double); -extern long double fabsl(long double); - -extern float cbrtf(float); -extern double cbrt(double); -extern long double cbrtl(long double); - -extern float hypotf(float, float); -extern double hypot(double, double); -extern long double hypotl(long double, long double); - -extern float powf(float, float); -extern double pow(double, double); -extern long double powl(long double, long double); - -extern float sqrtf(float); -extern double sqrt(double); -extern long double sqrtl(long double); - -extern float erff(float); -extern double erf(double); -extern long double erfl(long double); - -extern float erfcf(float); -extern double erfc(double); -extern long double erfcl(long double); - -/* lgammaf, lgamma, and lgammal are not thread-safe. The thread-safe - variants lgammaf_r, lgamma_r, and lgammal_r are made available if - you define the _REENTRANT symbol before including */ -extern float lgammaf(float); -extern double lgamma(double); -extern long double lgammal(long double); - -extern float tgammaf(float); -extern double tgamma(double); -extern long double tgammal(long double); - -extern float ceilf(float); -extern double ceil(double); -extern long double ceill(long double); - -extern float floorf(float); -extern double floor(double); -extern long double floorl(long double); - -extern float nearbyintf(float); -extern double nearbyint(double); -extern long double nearbyintl(long double); - -extern float rintf(float); -extern double rint(double); -extern long double rintl(long double); - -extern long int lrintf(float); -extern long int lrint(double); -extern long int lrintl(long double); - -extern float roundf(float); -extern double round(double); -extern long double roundl(long double); - -extern long int lroundf(float); -extern long int lround(double); -extern long int lroundl(long double); - -/* long long is not part of C90. Make sure you are passing -std=c99 or - -std=gnu99 or higher if you need these functions returning long longs */ -#if !(__DARWIN_NO_LONG_LONG) -extern long long int llrintf(float); -extern long long int llrint(double); -extern long long int llrintl(long double); - -extern long long int llroundf(float); -extern long long int llround(double); -extern long long int llroundl(long double); -#endif /* !(__DARWIN_NO_LONG_LONG) */ - -extern float truncf(float); -extern double trunc(double); -extern long double truncl(long double); - -extern float fmodf(float, float); -extern double fmod(double, double); -extern long double fmodl(long double, long double); - -extern float remainderf(float, float); -extern double remainder(double, double); -extern long double remainderl(long double, long double); - -extern float remquof(float, float, int *); -extern double remquo(double, double, int *); -extern long double remquol(long double, long double, int *); - -extern float copysignf(float, float); -extern double copysign(double, double); -extern long double copysignl(long double, long double); - -extern float nanf(const char *); -extern double nan(const char *); -extern long double nanl(const char *); - -extern float nextafterf(float, float); -extern double nextafter(double, double); -extern long double nextafterl(long double, long double); - -extern double nexttoward(double, long double); -extern float nexttowardf(float, long double); -extern long double nexttowardl(long double, long double); - -extern float fdimf(float, float); -extern double fdim(double, double); -extern long double fdiml(long double, long double); - -extern float fmaxf(float, float); -extern double fmax(double, double); -extern long double fmaxl(long double, long double); - -extern float fminf(float, float); -extern double fmin(double, double); -extern long double fminl(long double, long double); - -extern float fmaf(float, float, float); -extern double fma(double, double, double); -extern long double fmal(long double, long double, long double); - -#define isgreater(x, y) __builtin_isgreater((x),(y)) -#define isgreaterequal(x, y) __builtin_isgreaterequal((x),(y)) -#define isless(x, y) __builtin_isless((x),(y)) -#define islessequal(x, y) __builtin_islessequal((x),(y)) -#define islessgreater(x, y) __builtin_islessgreater((x),(y)) -#define isunordered(x, y) __builtin_isunordered((x),(y)) - -/* Deprecated functions; use the INFINITY and NAN macros instead. */ -extern float __inff(void) -__API_DEPRECATED("use `(float)INFINITY` instead", macos(10.0, 10.9)) __API_UNAVAILABLE(ios, watchos, tvos); -extern double __inf(void) -__API_DEPRECATED("use `INFINITY` instead", macos(10.0, 10.9)) __API_UNAVAILABLE(ios, watchos, tvos); -extern long double __infl(void) -__API_DEPRECATED("use `(long double)INFINITY` instead", macos(10.0, 10.9)) __API_UNAVAILABLE(ios, watchos, tvos); -extern float __nan(void) -__API_DEPRECATED("use `NAN` instead", macos(10.0, 10.14)) __API_UNAVAILABLE(ios, watchos, tvos); - -/****************************************************************************** - * Reentrant variants of lgamma[fl] * - ******************************************************************************/ - -#ifdef _REENTRANT -/* Reentrant variants of the lgamma[fl] functions. */ -extern float lgammaf_r(float, int *) __API_AVAILABLE(macos(10.6), ios(3.1)); -extern double lgamma_r(double, int *) __API_AVAILABLE(macos(10.6), ios(3.1)); -extern long double lgammal_r(long double, int *) __API_AVAILABLE(macos(10.6), ios(3.1)); -#endif /* _REENTRANT */ - -/****************************************************************************** - * Apple extensions to the C standard * - ******************************************************************************/ - -/* Because these functions are not specified by any relevant standard, they - are prefixed with __, which places them in the implementor's namespace, so - they should not conflict with any developer or third-party code. If they - are added to a relevant standard in the future, un-prefixed names may be - added to the library and they may be moved out of this section of the - header. - - Because these functions are non-standard, they may not be available on non- - Apple platforms. */ - -/* __exp10(x) returns 10**x. Edge cases match those of exp( ) and exp2( ). */ -extern float __exp10f(float) __API_AVAILABLE(macos(10.9), ios(7.0)); -extern double __exp10(double) __API_AVAILABLE(macos(10.9), ios(7.0)); - -/* __sincos(x,sinp,cosp) computes the sine and cosine of x with a single - function call, storing the sine in the memory pointed to by sinp, and - the cosine in the memory pointed to by cosp. Edge cases match those of - separate calls to sin( ) and cos( ). */ -__header_always_inline void __sincosf(float __x, float *__sinp, float *__cosp); -__header_always_inline void __sincos(double __x, double *__sinp, double *__cosp); - -/* __sinpi(x) returns the sine of pi times x; __cospi(x) and __tanpi(x) return - the cosine and tangent, respectively. These functions can produce a more - accurate answer than expressions of the form sin(M_PI * x) because they - avoid any loss of precision that results from rounding the result of the - multiplication M_PI * x. They may also be significantly more efficient in - some cases because the argument reduction for these functions is easier - to compute. Consult the man pages for edge case details. */ -extern float __cospif(float) __API_AVAILABLE(macos(10.9), ios(7.0)); -extern double __cospi(double) __API_AVAILABLE(macos(10.9), ios(7.0)); -extern float __sinpif(float) __API_AVAILABLE(macos(10.9), ios(7.0)); -extern double __sinpi(double) __API_AVAILABLE(macos(10.9), ios(7.0)); -extern float __tanpif(float) __API_AVAILABLE(macos(10.9), ios(7.0)); -extern double __tanpi(double) __API_AVAILABLE(macos(10.9), ios(7.0)); - -#if (defined __MAC_OS_X_VERSION_MIN_REQUIRED && __MAC_OS_X_VERSION_MIN_REQUIRED < 1090) || \ - (defined __IPHONE_OS_VERSION_MIN_REQUIRED && __IPHONE_OS_VERSION_MIN_REQUIRED < 70000) -/* __sincos and __sincosf were introduced in OSX 10.9 and iOS 7.0. When - targeting an older system, we simply split them up into discrete calls - to sin( ) and cos( ). */ -__header_always_inline void __sincosf(float __x, float *__sinp, float *__cosp) { - *__sinp = sinf(__x); - *__cosp = cosf(__x); -} - -__header_always_inline void __sincos(double __x, double *__sinp, double *__cosp) { - *__sinp = sin(__x); - *__cosp = cos(__x); -} -#else -/* __sincospi(x,sinp,cosp) computes the sine and cosine of pi times x with a - single function call, storing the sine in the memory pointed to by sinp, - and the cosine in the memory pointed to by cosp. Edge cases match those - of separate calls to __sinpi( ) and __cospi( ), and are documented in the - man pages. - - These functions were introduced in OSX 10.9 and iOS 7.0. Because they are - implemented as header inlines, weak-linking does not function as normal, - and they are simply hidden when targeting earlier OS versions. */ -__header_always_inline void __sincospif(float __x, float *__sinp, float *__cosp); -__header_always_inline void __sincospi(double __x, double *__sinp, double *__cosp); - -/* Implementation details of __sincos and __sincospi allowing them to return - two results while allowing the compiler to optimize away unnecessary load- - store traffic. Although these interfaces are exposed in the math.h header - to allow compilers to generate better code, users should call __sincos[f] - and __sincospi[f] instead and allow the compiler to emit these calls. */ -struct __float2 { float __sinval; float __cosval; }; -struct __double2 { double __sinval; double __cosval; }; - -extern struct __float2 __sincosf_stret(float); -extern struct __double2 __sincos_stret(double); -extern struct __float2 __sincospif_stret(float); -extern struct __double2 __sincospi_stret(double); - -__header_always_inline void __sincosf(float __x, float *__sinp, float *__cosp) { - const struct __float2 __stret = __sincosf_stret(__x); - *__sinp = __stret.__sinval; *__cosp = __stret.__cosval; -} - -__header_always_inline void __sincos(double __x, double *__sinp, double *__cosp) { - const struct __double2 __stret = __sincos_stret(__x); - *__sinp = __stret.__sinval; *__cosp = __stret.__cosval; -} - -__header_always_inline void __sincospif(float __x, float *__sinp, float *__cosp) { - const struct __float2 __stret = __sincospif_stret(__x); - *__sinp = __stret.__sinval; *__cosp = __stret.__cosval; -} - -__header_always_inline void __sincospi(double __x, double *__sinp, double *__cosp) { - const struct __double2 __stret = __sincospi_stret(__x); - *__sinp = __stret.__sinval; *__cosp = __stret.__cosval; -} -#endif - -/****************************************************************************** - * POSIX/UNIX extensions to the C standard * - ******************************************************************************/ - -#if __DARWIN_C_LEVEL >= 199506L -extern double j0(double) __API_AVAILABLE(macos(10.0), ios(3.2)); -extern double j1(double) __API_AVAILABLE(macos(10.0), ios(3.2)); -extern double jn(int, double) __API_AVAILABLE(macos(10.0), ios(3.2)); -extern double y0(double) __API_AVAILABLE(macos(10.0), ios(3.2)); -extern double y1(double) __API_AVAILABLE(macos(10.0), ios(3.2)); -extern double yn(int, double) __API_AVAILABLE(macos(10.0), ios(3.2)); -extern double scalb(double, double); -extern int signgam; - -/* Even though these might be more useful as long doubles, POSIX requires - that they be double-precision literals. */ -#define M_E 2.71828182845904523536028747135266250 /* e */ -#define M_LOG2E 1.44269504088896340735992468100189214 /* log2(e) */ -#define M_LOG10E 0.434294481903251827651128918916605082 /* log10(e) */ -#define M_LN2 0.693147180559945309417232121458176568 /* loge(2) */ -#define M_LN10 2.30258509299404568401799145468436421 /* loge(10) */ -#define M_PI 3.14159265358979323846264338327950288 /* pi */ -#define M_PI_2 1.57079632679489661923132169163975144 /* pi/2 */ -#define M_PI_4 0.785398163397448309615660845819875721 /* pi/4 */ -#define M_1_PI 0.318309886183790671537767526745028724 /* 1/pi */ -#define M_2_PI 0.636619772367581343075535053490057448 /* 2/pi */ -#define M_2_SQRTPI 1.12837916709551257389615890312154517 /* 2/sqrt(pi) */ -#define M_SQRT2 1.41421356237309504880168872420969808 /* sqrt(2) */ -#define M_SQRT1_2 0.707106781186547524400844362104849039 /* 1/sqrt(2) */ - -#define MAXFLOAT 0x1.fffffep+127f -#endif /* __DARWIN_C_LEVEL >= 199506L */ - -/* Long-double versions of M_E, etc for convenience on Intel where long- - double is not the same as double. Define __MATH_LONG_DOUBLE_CONSTANTS - to make these constants available. */ -#if defined __MATH_LONG_DOUBLE_CONSTANTS -#define M_El 0xa.df85458a2bb4a9bp-2L -#define M_LOG2El 0xb.8aa3b295c17f0bcp-3L -#define M_LOG10El 0xd.e5bd8a937287195p-5L -#define M_LN2l 0xb.17217f7d1cf79acp-4L -#define M_LN10l 0x9.35d8dddaaa8ac17p-2L -#define M_PIl 0xc.90fdaa22168c235p-2L -#define M_PI_2l 0xc.90fdaa22168c235p-3L -#define M_PI_4l 0xc.90fdaa22168c235p-4L -#define M_1_PIl 0xa.2f9836e4e44152ap-5L -#define M_2_PIl 0xa.2f9836e4e44152ap-4L -#define M_2_SQRTPIl 0x9.06eba8214db688dp-3L -#define M_SQRT2l 0xb.504f333f9de6484p-3L -#define M_SQRT1_2l 0xb.504f333f9de6484p-4L -#endif /* defined __MATH_LONG_DOUBLE_CONSTANTS */ - -/****************************************************************************** - * Legacy BSD extensions to the C standard * - ******************************************************************************/ - -#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL -#define FP_SNAN FP_NAN -#define FP_QNAN FP_NAN -#define HUGE MAXFLOAT -#define X_TLOSS 1.41484755040568800000e+16 -#define DOMAIN 1 -#define SING 2 -#define OVERFLOW 3 -#define UNDERFLOW 4 -#define TLOSS 5 -#define PLOSS 6 - -/* Legacy BSD API; use the C99 `lrint( )` function instead. */ -extern long int rinttol(double) -__API_DEPRECATED_WITH_REPLACEMENT("lrint", macos(10.0, 10.9)) __API_UNAVAILABLE(ios, watchos, tvos); -/* Legacy BSD API; use the C99 `lround( )` function instead. */ -extern long int roundtol(double) -__API_DEPRECATED_WITH_REPLACEMENT("lround", macos(10.0, 10.9)) __API_UNAVAILABLE(ios, watchos, tvos); -/* Legacy BSD API; use the C99 `remainder( )` function instead. */ -extern double drem(double, double) -__API_DEPRECATED_WITH_REPLACEMENT("remainder", macos(10.0, 10.9)) __API_UNAVAILABLE(ios, watchos, tvos); -/* Legacy BSD API; use the C99 `isfinite( )` macro instead. */ -extern int finite(double) -__API_DEPRECATED("Use `isfinite((double)x)` instead.", macos(10.0, 10.9)) __API_UNAVAILABLE(ios, watchos, tvos); -/* Legacy BSD API; use the C99 `tgamma( )` function instead. */ -extern double gamma(double) -__API_DEPRECATED_WITH_REPLACEMENT("tgamma", macos(10.0, 10.9)) __API_UNAVAILABLE(ios, watchos, tvos); -/* Legacy BSD API; use `2*frexp( )` or `scalbn(x, -ilogb(x))` instead. */ -extern double significand(double) -__API_DEPRECATED("Use `2*frexp( )` or `scalbn(x, -ilogb(x))` instead.", macos(10.0, 10.9)) __API_UNAVAILABLE(ios, watchos, tvos); - -#if !defined __cplusplus -struct exception { - int type; - char *name; - double arg1; - double arg2; - double retval; -}; - -#endif /* !defined __cplusplus */ -#endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ - -__END_DECLS -#endif /* __MATH_H__ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/net/if.h b/lib/libc/include/x86_64-macos-gnu/net/if.h deleted file mode 100644 index c0729f0eb8..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/net/if.h +++ /dev/null @@ -1,442 +0,0 @@ -/* - * Copyright (c) 2000-2019 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * Copyright (c) 1982, 1986, 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)if.h 8.1 (Berkeley) 6/10/93 - */ - -#ifndef _NET_IF_H_ -#define _NET_IF_H_ - -#include -#include - -#define IF_NAMESIZE 16 - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#include -#ifdef __APPLE__ - -#include -#include -#include - -#endif - -struct if_clonereq { - int ifcr_total; /* total cloners (out) */ - int ifcr_count; /* room for this many in user buffer */ - char *ifcr_buffer; /* buffer for cloner names */ -}; - - -#define IFF_UP 0x1 /* interface is up */ -#define IFF_BROADCAST 0x2 /* broadcast address valid */ -#define IFF_DEBUG 0x4 /* turn on debugging */ -#define IFF_LOOPBACK 0x8 /* is a loopback net */ -#define IFF_POINTOPOINT 0x10 /* interface is point-to-point link */ -#define IFF_NOTRAILERS 0x20 /* obsolete: avoid use of trailers */ -#define IFF_RUNNING 0x40 /* resources allocated */ -#define IFF_NOARP 0x80 /* no address resolution protocol */ -#define IFF_PROMISC 0x100 /* receive all packets */ -#define IFF_ALLMULTI 0x200 /* receive all multicast packets */ -#define IFF_OACTIVE 0x400 /* transmission in progress */ -#define IFF_SIMPLEX 0x800 /* can't hear own transmissions */ -#define IFF_LINK0 0x1000 /* per link layer defined bit */ -#define IFF_LINK1 0x2000 /* per link layer defined bit */ -#define IFF_LINK2 0x4000 /* per link layer defined bit */ -#define IFF_ALTPHYS IFF_LINK2 /* use alternate physical connection */ -#define IFF_MULTICAST 0x8000 /* supports multicast */ - - - -/* - * Capabilities that interfaces can advertise. - * - * struct ifnet.if_capabilities - * contains the optional features & capabilities a particular interface - * supports (not only the driver but also the detected hw revision). - * Capabilities are defined by IFCAP_* below. - * struct ifnet.if_capenable - * contains the enabled (either by default or through ifconfig) optional - * features & capabilities on this interface. - * Capabilities are defined by IFCAP_* below. - * struct if_data.ifi_hwassist in IFNET_* form, defined in net/kpi_interface.h, - * contains the enabled optional features & capabilites that can be used - * individually per packet and are specified in the mbuf pkthdr.csum_flags - * field. IFCAP_* and IFNET_* do not match one to one and IFNET_* may be - * more detailed or differentiated than IFCAP_*. - * IFNET_* hwassist flags have corresponding CSUM_* in sys/mbuf.h - */ -#define IFCAP_RXCSUM 0x00001 /* can offload checksum on RX */ -#define IFCAP_TXCSUM 0x00002 /* can offload checksum on TX */ -#define IFCAP_VLAN_MTU 0x00004 /* VLAN-compatible MTU */ -#define IFCAP_VLAN_HWTAGGING 0x00008 /* hardware VLAN tag support */ -#define IFCAP_JUMBO_MTU 0x00010 /* 9000 byte MTU supported */ -#define IFCAP_TSO4 0x00020 /* can do TCP Segmentation Offload */ -#define IFCAP_TSO6 0x00040 /* can do TCP6 Segmentation Offload */ -#define IFCAP_LRO 0x00080 /* can do Large Receive Offload */ -#define IFCAP_AV 0x00100 /* can do 802.1 AV Bridging */ -#define IFCAP_TXSTATUS 0x00200 /* can return linklevel xmit status */ -#define IFCAP_SKYWALK 0x00400 /* Skywalk mode supported/enabled */ -#define IFCAP_HW_TIMESTAMP 0x00800 /* Time stamping in hardware */ -#define IFCAP_SW_TIMESTAMP 0x01000 /* Time stamping in software */ -#define IFCAP_CSUM_PARTIAL 0x02000 /* can offload partial checksum */ -#define IFCAP_CSUM_ZERO_INVERT 0x04000 /* can invert 0 to -0 (0xffff) */ - -#define IFCAP_HWCSUM (IFCAP_RXCSUM | IFCAP_TXCSUM) -#define IFCAP_TSO (IFCAP_TSO4 | IFCAP_TSO6) - -#define IFCAP_VALID (IFCAP_HWCSUM | IFCAP_TSO | IFCAP_LRO | IFCAP_VLAN_MTU | \ - IFCAP_VLAN_HWTAGGING | IFCAP_JUMBO_MTU | IFCAP_AV | IFCAP_TXSTATUS | \ - IFCAP_SKYWALK | IFCAP_SW_TIMESTAMP | IFCAP_HW_TIMESTAMP | \ - IFCAP_CSUM_PARTIAL | IFCAP_CSUM_ZERO_INVERT) - -#define IFQ_MAXLEN 128 -#define IFNET_SLOWHZ 1 /* granularity is 1 second */ -#define IFQ_TARGET_DELAY (10ULL * 1000 * 1000) /* 10 ms */ -#define IFQ_UPDATE_INTERVAL (100ULL * 1000 * 1000) /* 100 ms */ - -/* - * Message format for use in obtaining information about interfaces - * from sysctl and the routing socket - */ -struct if_msghdr { - unsigned short ifm_msglen; /* to skip non-understood messages */ - unsigned char ifm_version; /* future binary compatability */ - unsigned char ifm_type; /* message type */ - int ifm_addrs; /* like rtm_addrs */ - int ifm_flags; /* value of if_flags */ - unsigned short ifm_index; /* index for associated ifp */ - struct if_data ifm_data; /* statistics and other data about if */ -}; - -/* - * Message format for use in obtaining information about interface addresses - * from sysctl and the routing socket - */ -struct ifa_msghdr { - unsigned short ifam_msglen; /* to skip non-understood messages */ - unsigned char ifam_version; /* future binary compatability */ - unsigned char ifam_type; /* message type */ - int ifam_addrs; /* like rtm_addrs */ - int ifam_flags; /* value of ifa_flags */ - unsigned short ifam_index; /* index for associated ifp */ - int ifam_metric; /* value of ifa_metric */ -}; - -/* - * Message format for use in obtaining information about multicast addresses - * from the routing socket - */ -struct ifma_msghdr { - unsigned short ifmam_msglen; /* to skip non-understood messages */ - unsigned char ifmam_version; /* future binary compatability */ - unsigned char ifmam_type; /* message type */ - int ifmam_addrs; /* like rtm_addrs */ - int ifmam_flags; /* value of ifa_flags */ - unsigned short ifmam_index; /* index for associated ifp */ -}; - -/* - * Message format for use in obtaining information about interfaces - * from sysctl - */ -struct if_msghdr2 { - u_short ifm_msglen; /* to skip over non-understood messages */ - u_char ifm_version; /* future binary compatability */ - u_char ifm_type; /* message type */ - int ifm_addrs; /* like rtm_addrs */ - int ifm_flags; /* value of if_flags */ - u_short ifm_index; /* index for associated ifp */ - int ifm_snd_len; /* instantaneous length of send queue */ - int ifm_snd_maxlen; /* maximum length of send queue */ - int ifm_snd_drops; /* number of drops in send queue */ - int ifm_timer; /* time until if_watchdog called */ - struct if_data64 ifm_data; /* statistics and other data */ -}; - -/* - * Message format for use in obtaining information about multicast addresses - * from sysctl - */ -struct ifma_msghdr2 { - u_short ifmam_msglen; /* to skip over non-understood messages */ - u_char ifmam_version; /* future binary compatability */ - u_char ifmam_type; /* message type */ - int ifmam_addrs; /* like rtm_addrs */ - int ifmam_flags; /* value of ifa_flags */ - u_short ifmam_index; /* index for associated ifp */ - int32_t ifmam_refcount; -}; - -/* - * ifdevmtu: interface device mtu - * Used with SIOCGIFDEVMTU to get the current mtu in use by the device, - * as well as the minimum and maximum mtu allowed by the device. - */ -struct ifdevmtu { - int ifdm_current; - int ifdm_min; - int ifdm_max; -}; - -#pragma pack(4) - -/* - * ifkpi: interface kpi ioctl - * Used with SIOCSIFKPI and SIOCGIFKPI. - * - * ifk_module_id - From in the kernel, a value from kev_vendor_code_find. From - * user space, a value from SIOCGKEVVENDOR ioctl on a kernel event socket. - * ifk_type - The type. Types are specific to each module id. - * ifk_data - The data. ifk_ptr may be a 64bit pointer for 64 bit processes. - * - * Copying data between user space and kernel space is done using copyin - * and copyout. A process may be running in 64bit mode. In such a case, - * the pointer will be a 64bit pointer, not a 32bit pointer. The following - * sample is a safe way to copy the data in to the kernel from either a - * 32bit or 64bit process: - * - * user_addr_t tmp_ptr; - * if (IS_64BIT_PROCESS(current_proc())) { - * tmp_ptr = CAST_USER_ADDR_T(ifkpi.ifk_data.ifk_ptr64); - * } - * else { - * tmp_ptr = CAST_USER_ADDR_T(ifkpi.ifk_data.ifk_ptr); - * } - * error = copyin(tmp_ptr, allocated_dst_buffer, size of allocated_dst_buffer); - */ - -struct ifkpi { - unsigned int ifk_module_id; - unsigned int ifk_type; - union { - void *ifk_ptr; - int ifk_value; - } ifk_data; -}; - -/* Wake capabilities of a interface */ -#define IF_WAKE_ON_MAGIC_PACKET 0x01 - - -#pragma pack() - -/* - * Interface request structure used for socket - * ioctl's. All interface ioctl's must have parameter - * definitions which begin with ifr_name. The - * remainder may be interface specific. - */ -struct ifreq { -#ifndef IFNAMSIZ -#define IFNAMSIZ IF_NAMESIZE -#endif - char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */ - union { - struct sockaddr ifru_addr; - struct sockaddr ifru_dstaddr; - struct sockaddr ifru_broadaddr; - short ifru_flags; - int ifru_metric; - int ifru_mtu; - int ifru_phys; - int ifru_media; - int ifru_intval; - caddr_t ifru_data; - struct ifdevmtu ifru_devmtu; - struct ifkpi ifru_kpi; - u_int32_t ifru_wake_flags; - u_int32_t ifru_route_refcnt; - int ifru_cap[2]; - u_int32_t ifru_functional_type; -#define IFRTYPE_FUNCTIONAL_UNKNOWN 0 -#define IFRTYPE_FUNCTIONAL_LOOPBACK 1 -#define IFRTYPE_FUNCTIONAL_WIRED 2 -#define IFRTYPE_FUNCTIONAL_WIFI_INFRA 3 -#define IFRTYPE_FUNCTIONAL_WIFI_AWDL 4 -#define IFRTYPE_FUNCTIONAL_CELLULAR 5 -#define IFRTYPE_FUNCTIONAL_INTCOPROC 6 -#define IFRTYPE_FUNCTIONAL_COMPANIONLINK 7 -#define IFRTYPE_FUNCTIONAL_LAST 7 - } ifr_ifru; -#define ifr_addr ifr_ifru.ifru_addr /* address */ -#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */ -#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */ -#ifdef __APPLE__ -#define ifr_flags ifr_ifru.ifru_flags /* flags */ -#else -#define ifr_flags ifr_ifru.ifru_flags[0] /* flags */ -#define ifr_prevflags ifr_ifru.ifru_flags[1] /* flags */ -#endif /* __APPLE__ */ -#define ifr_metric ifr_ifru.ifru_metric /* metric */ -#define ifr_mtu ifr_ifru.ifru_mtu /* mtu */ -#define ifr_phys ifr_ifru.ifru_phys /* physical wire */ -#define ifr_media ifr_ifru.ifru_media /* physical media */ -#define ifr_data ifr_ifru.ifru_data /* for use by interface */ -#define ifr_devmtu ifr_ifru.ifru_devmtu -#define ifr_intval ifr_ifru.ifru_intval /* integer value */ -#define ifr_kpi ifr_ifru.ifru_kpi -#define ifr_wake_flags ifr_ifru.ifru_wake_flags /* wake capabilities */ -#define ifr_route_refcnt ifr_ifru.ifru_route_refcnt /* route references count */ -#define ifr_reqcap ifr_ifru.ifru_cap[0] /* requested capabilities */ -#define ifr_curcap ifr_ifru.ifru_cap[1] /* current capabilities */ -}; - -#define _SIZEOF_ADDR_IFREQ(ifr) \ - ((ifr).ifr_addr.sa_len > sizeof (struct sockaddr) ? \ - (sizeof (struct ifreq) - sizeof (struct sockaddr) + \ - (ifr).ifr_addr.sa_len) : sizeof (struct ifreq)) - -struct ifaliasreq { - char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */ - struct sockaddr ifra_addr; - struct sockaddr ifra_broadaddr; - struct sockaddr ifra_mask; -}; - -struct rslvmulti_req { - struct sockaddr *sa; - struct sockaddr **llsa; -}; - -#pragma pack(4) - -struct ifmediareq { - char ifm_name[IFNAMSIZ]; /* if name, e.g. "en0" */ - int ifm_current; /* current media options */ - int ifm_mask; /* don't care mask */ - int ifm_status; /* media status */ - int ifm_active; /* active options */ - int ifm_count; /* # entries in ifm_ulist array */ - int *ifm_ulist; /* media words */ -}; - -#pragma pack() - - - -#pragma pack(4) -struct ifdrv { - char ifd_name[IFNAMSIZ]; /* if name, e.g. "en0" */ - unsigned long ifd_cmd; - size_t ifd_len; /* length of ifd_data buffer */ - void *ifd_data; -}; -#pragma pack() - - -/* - * Structure used to retrieve aux status data from interfaces. - * Kernel suppliers to this interface should respect the formatting - * needed by ifconfig(8): each line starts with a TAB and ends with - * a newline. - */ - -#define IFSTATMAX 800 /* 10 lines of text */ -struct ifstat { - char ifs_name[IFNAMSIZ]; /* if name, e.g. "en0" */ - char ascii[IFSTATMAX + 1]; -}; - -/* - * Structure used in SIOCGIFCONF request. - * Used to retrieve interface configuration - * for machine (useful for programs which - * must know all networks accessible). - */ -#pragma pack(4) -struct ifconf { - int ifc_len; /* size of associated buffer */ - union { - caddr_t ifcu_buf; - struct ifreq *ifcu_req; - } ifc_ifcu; -}; -#pragma pack() -#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */ -#define ifc_req ifc_ifcu.ifcu_req /* array of structures returned */ - - -/* - * DLIL KEV_DL_PROTO_ATTACHED/DETACHED structure - */ -struct kev_dl_proto_data { - struct net_event_data link_data; - u_int32_t proto_family; - u_int32_t proto_remaining_count; -}; - - -#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ - -struct if_nameindex { - unsigned int if_index; /* 1, 2, ... */ - char *if_name; /* null terminated name: "le0", ... */ -}; - -__BEGIN_DECLS -unsigned int if_nametoindex(const char *); -char *if_indextoname(unsigned int, char *); -struct if_nameindex *if_nameindex(void); -void if_freenameindex(struct if_nameindex *); -__END_DECLS - - -#endif /* !_NET_IF_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/net/if_var.h b/lib/libc/include/x86_64-macos-gnu/net/if_var.h deleted file mode 100644 index 6dcaa3842e..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/net/if_var.h +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Copyright (c) 2000-2019 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * Copyright (c) 1982, 1986, 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * From: @(#)if.h 8.1 (Berkeley) 6/10/93 - * $FreeBSD: src/sys/net/if_var.h,v 1.18.2.7 2001/07/24 19:10:18 brooks Exp $ - */ - -#ifndef _NET_IF_VAR_H_ -#define _NET_IF_VAR_H_ - -#include -#include -#include -#include -#include /* get TAILQ macros */ -#ifdef BSD_KERN_PRIVATE -#include -#endif - - -#ifdef __APPLE__ -#define APPLE_IF_FAM_LOOPBACK 1 -#define APPLE_IF_FAM_ETHERNET 2 -#define APPLE_IF_FAM_SLIP 3 -#define APPLE_IF_FAM_TUN 4 -#define APPLE_IF_FAM_VLAN 5 -#define APPLE_IF_FAM_PPP 6 -#define APPLE_IF_FAM_PVC 7 -#define APPLE_IF_FAM_DISC 8 -#define APPLE_IF_FAM_MDECAP 9 -#define APPLE_IF_FAM_GIF 10 -#define APPLE_IF_FAM_FAITH 11 /* deprecated */ -#define APPLE_IF_FAM_STF 12 -#define APPLE_IF_FAM_FIREWIRE 13 -#define APPLE_IF_FAM_BOND 14 -#define APPLE_IF_FAM_CELLULAR 15 -#define APPLE_IF_FAM_6LOWPAN 16 -#define APPLE_IF_FAM_UTUN 17 -#define APPLE_IF_FAM_IPSEC 18 -#endif /* __APPLE__ */ - -/* - * 72 was chosen below because it is the size of a TCP/IP - * header (40) + the minimum mss (32). - */ -#define IF_MINMTU 72 -#define IF_MAXMTU 65535 - -/* - * Structures defining a network interface, providing a packet - * transport mechanism (ala level 0 of the PUP protocols). - * - * Each interface accepts output datagrams of a specified maximum - * length, and provides higher level routines with input datagrams - * received from its medium. - * - * Output occurs when the routine if_output is called, with three parameters: - * (*ifp->if_output)(ifp, m, dst, rt) - * Here m is the mbuf chain to be sent and dst is the destination address. - * The output routine encapsulates the supplied datagram if necessary, - * and then transmits it on its medium. - * - * On input, each interface unwraps the data received by it, and either - * places it on the input queue of a internetwork datagram routine - * and posts the associated software interrupt, or passes the datagram to a raw - * packet input routine. - * - * Routines exist for locating interfaces by their addresses - * or for locating a interface on a certain network, as well as more general - * routing and gateway routines maintaining information used to locate - * interfaces. These routines live in the files if.c and route.c - */ - -#define IFNAMSIZ 16 - -/* This belongs up in socket.h or socketvar.h, depending on how far the - * event bubbles up. - */ - -struct net_event_data { - u_int32_t if_family; - u_int32_t if_unit; - char if_name[IFNAMSIZ]; -}; - -#if defined(__LP64__) -#include -#define IF_DATA_TIMEVAL timeval32 -#else -#define IF_DATA_TIMEVAL timeval -#endif - -#pragma pack(4) - -/* - * Structure describing information about an interface - * which may be of interest to management entities. - */ -struct if_data { - /* generic interface information */ - u_char ifi_type; /* ethernet, tokenring, etc */ - u_char ifi_typelen; /* Length of frame type id */ - u_char ifi_physical; /* e.g., AUI, Thinnet, 10base-T, etc */ - u_char ifi_addrlen; /* media address length */ - u_char ifi_hdrlen; /* media header length */ - u_char ifi_recvquota; /* polling quota for receive intrs */ - u_char ifi_xmitquota; /* polling quota for xmit intrs */ - u_char ifi_unused1; /* for future use */ - u_int32_t ifi_mtu; /* maximum transmission unit */ - u_int32_t ifi_metric; /* routing metric (external only) */ - u_int32_t ifi_baudrate; /* linespeed */ - /* volatile statistics */ - u_int32_t ifi_ipackets; /* packets received on interface */ - u_int32_t ifi_ierrors; /* input errors on interface */ - u_int32_t ifi_opackets; /* packets sent on interface */ - u_int32_t ifi_oerrors; /* output errors on interface */ - u_int32_t ifi_collisions; /* collisions on csma interfaces */ - u_int32_t ifi_ibytes; /* total number of octets received */ - u_int32_t ifi_obytes; /* total number of octets sent */ - u_int32_t ifi_imcasts; /* packets received via multicast */ - u_int32_t ifi_omcasts; /* packets sent via multicast */ - u_int32_t ifi_iqdrops; /* dropped on input, this interface */ - u_int32_t ifi_noproto; /* destined for unsupported protocol */ - u_int32_t ifi_recvtiming; /* usec spent receiving when timing */ - u_int32_t ifi_xmittiming; /* usec spent xmitting when timing */ - struct IF_DATA_TIMEVAL ifi_lastchange; /* time of last administrative change */ - u_int32_t ifi_unused2; /* used to be the default_proto */ - u_int32_t ifi_hwassist; /* HW offload capabilities */ - u_int32_t ifi_reserved1; /* for future use */ - u_int32_t ifi_reserved2; /* for future use */ -}; - -/* - * Structure describing information about an interface - * which may be of interest to management entities. - */ -struct if_data64 { - /* generic interface information */ - u_char ifi_type; /* ethernet, tokenring, etc */ - u_char ifi_typelen; /* Length of frame type id */ - u_char ifi_physical; /* e.g., AUI, Thinnet, 10base-T, etc */ - u_char ifi_addrlen; /* media address length */ - u_char ifi_hdrlen; /* media header length */ - u_char ifi_recvquota; /* polling quota for receive intrs */ - u_char ifi_xmitquota; /* polling quota for xmit intrs */ - u_char ifi_unused1; /* for future use */ - u_int32_t ifi_mtu; /* maximum transmission unit */ - u_int32_t ifi_metric; /* routing metric (external only) */ - u_int64_t ifi_baudrate; /* linespeed */ - /* volatile statistics */ - u_int64_t ifi_ipackets; /* packets received on interface */ - u_int64_t ifi_ierrors; /* input errors on interface */ - u_int64_t ifi_opackets; /* packets sent on interface */ - u_int64_t ifi_oerrors; /* output errors on interface */ - u_int64_t ifi_collisions; /* collisions on csma interfaces */ - u_int64_t ifi_ibytes; /* total number of octets received */ - u_int64_t ifi_obytes; /* total number of octets sent */ - u_int64_t ifi_imcasts; /* packets received via multicast */ - u_int64_t ifi_omcasts; /* packets sent via multicast */ - u_int64_t ifi_iqdrops; /* dropped on input, this interface */ - u_int64_t ifi_noproto; /* destined for unsupported protocol */ - u_int32_t ifi_recvtiming; /* usec spent receiving when timing */ - u_int32_t ifi_xmittiming; /* usec spent xmitting when timing */ - struct IF_DATA_TIMEVAL ifi_lastchange; /* time of last administrative change */ -}; - - -#pragma pack() - -/* - * Structure defining a queue for a network interface. - */ -struct ifqueue { - void *ifq_head; - void *ifq_tail; - int ifq_len; - int ifq_maxlen; - int ifq_drops; -}; - - - - - - -#endif /* !_NET_IF_VAR_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/net/route.h b/lib/libc/include/x86_64-macos-gnu/net/route.h deleted file mode 100644 index ff5abdd268..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/net/route.h +++ /dev/null @@ -1,257 +0,0 @@ -/* - * Copyright (c) 2000-2017 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * Copyright (c) 1980, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)route.h 8.3 (Berkeley) 4/19/94 - * $FreeBSD: src/sys/net/route.h,v 1.36.2.1 2000/08/16 06:14:23 jayanth Exp $ - */ - -#ifndef _NET_ROUTE_H_ -#define _NET_ROUTE_H_ -#include -#include -#include -#include - -/* - * These numbers are used by reliable protocols for determining - * retransmission behavior and are included in the routing structure. - */ -struct rt_metrics { - u_int32_t rmx_locks; /* Kernel leaves these values alone */ - u_int32_t rmx_mtu; /* MTU for this path */ - u_int32_t rmx_hopcount; /* max hops expected */ - int32_t rmx_expire; /* lifetime for route, e.g. redirect */ - u_int32_t rmx_recvpipe; /* inbound delay-bandwidth product */ - u_int32_t rmx_sendpipe; /* outbound delay-bandwidth product */ - u_int32_t rmx_ssthresh; /* outbound gateway buffer limit */ - u_int32_t rmx_rtt; /* estimated round trip time */ - u_int32_t rmx_rttvar; /* estimated rtt variance */ - u_int32_t rmx_pksent; /* packets sent using this route */ - u_int32_t rmx_state; /* route state */ - u_int32_t rmx_filler[3]; /* will be used for TCP's peer-MSS cache */ -}; - -/* - * rmx_rtt and rmx_rttvar are stored as microseconds; - */ -#define RTM_RTTUNIT 1000000 /* units for rtt, rttvar, as units per sec */ - - - -#define RTF_UP 0x1 /* route usable */ -#define RTF_GATEWAY 0x2 /* destination is a gateway */ -#define RTF_HOST 0x4 /* host entry (net otherwise) */ -#define RTF_REJECT 0x8 /* host or net unreachable */ -#define RTF_DYNAMIC 0x10 /* created dynamically (by redirect) */ -#define RTF_MODIFIED 0x20 /* modified dynamically (by redirect) */ -#define RTF_DONE 0x40 /* message confirmed */ -#define RTF_DELCLONE 0x80 /* delete cloned route */ -#define RTF_CLONING 0x100 /* generate new routes on use */ -#define RTF_XRESOLVE 0x200 /* external daemon resolves name */ -#define RTF_LLINFO 0x400 /* DEPRECATED - exists ONLY for backward - * compatibility */ -#define RTF_LLDATA 0x400 /* used by apps to add/del L2 entries */ -#define RTF_STATIC 0x800 /* manually added */ -#define RTF_BLACKHOLE 0x1000 /* just discard pkts (during updates) */ -#define RTF_NOIFREF 0x2000 /* not eligible for RTF_IFREF */ -#define RTF_PROTO2 0x4000 /* protocol specific routing flag */ -#define RTF_PROTO1 0x8000 /* protocol specific routing flag */ - -#define RTF_PRCLONING 0x10000 /* protocol requires cloning */ -#define RTF_WASCLONED 0x20000 /* route generated through cloning */ -#define RTF_PROTO3 0x40000 /* protocol specific routing flag */ - /* 0x80000 unused */ -#define RTF_PINNED 0x100000 /* future use */ -#define RTF_LOCAL 0x200000 /* route represents a local address */ -#define RTF_BROADCAST 0x400000 /* route represents a bcast address */ -#define RTF_MULTICAST 0x800000 /* route represents a mcast address */ -#define RTF_IFSCOPE 0x1000000 /* has valid interface scope */ -#define RTF_CONDEMNED 0x2000000 /* defunct; no longer modifiable */ -#define RTF_IFREF 0x4000000 /* route holds a ref to interface */ -#define RTF_PROXY 0x8000000 /* proxying, no interface scope */ -#define RTF_ROUTER 0x10000000 /* host is a router */ -#define RTF_DEAD 0x20000000 /* Route entry is being freed */ - /* 0x40000000 and up unassigned */ - -#define RTPRF_OURS RTF_PROTO3 /* set on routes we manage */ -#define RTF_BITS \ - "\020\1UP\2GATEWAY\3HOST\4REJECT\5DYNAMIC\6MODIFIED\7DONE" \ - "\10DELCLONE\11CLONING\12XRESOLVE\13LLINFO\14STATIC\15BLACKHOLE" \ - "\16NOIFREF\17PROTO2\20PROTO1\21PRCLONING\22WASCLONED\23PROTO3" \ - "\25PINNED\26LOCAL\27BROADCAST\30MULTICAST\31IFSCOPE\32CONDEMNED" \ - "\33IFREF\34PROXY\35ROUTER" - -#define IS_DIRECT_HOSTROUTE(rt) \ - (((rt)->rt_flags & (RTF_HOST | RTF_GATEWAY)) == RTF_HOST) -/* - * Routing statistics. - */ -struct rtstat { - short rts_badredirect; /* bogus redirect calls */ - short rts_dynamic; /* routes created by redirects */ - short rts_newgateway; /* routes modified by redirects */ - short rts_unreach; /* lookups which failed */ - short rts_wildcard; /* lookups satisfied by a wildcard */ - short rts_badrtgwroute; /* route to gateway is not direct */ -}; - -/* - * Structures for routing messages. - */ -struct rt_msghdr { - u_short rtm_msglen; /* to skip over non-understood messages */ - u_char rtm_version; /* future binary compatibility */ - u_char rtm_type; /* message type */ - u_short rtm_index; /* index for associated ifp */ - int rtm_flags; /* flags, incl. kern & message, e.g. DONE */ - int rtm_addrs; /* bitmask identifying sockaddrs in msg */ - pid_t rtm_pid; /* identify sender */ - int rtm_seq; /* for sender to identify action */ - int rtm_errno; /* why failed */ - int rtm_use; /* from rtentry */ - u_int32_t rtm_inits; /* which metrics we are initializing */ - struct rt_metrics rtm_rmx; /* metrics themselves */ -}; - -struct rt_msghdr2 { - u_short rtm_msglen; /* to skip over non-understood messages */ - u_char rtm_version; /* future binary compatibility */ - u_char rtm_type; /* message type */ - u_short rtm_index; /* index for associated ifp */ - int rtm_flags; /* flags, incl. kern & message, e.g. DONE */ - int rtm_addrs; /* bitmask identifying sockaddrs in msg */ - int32_t rtm_refcnt; /* reference count */ - int rtm_parentflags; /* flags of the parent route */ - int rtm_reserved; /* reserved field set to 0 */ - int rtm_use; /* from rtentry */ - u_int32_t rtm_inits; /* which metrics we are initializing */ - struct rt_metrics rtm_rmx; /* metrics themselves */ -}; - - -#define RTM_VERSION 5 /* Up the ante and ignore older versions */ - -/* - * Message types. - */ -#define RTM_ADD 0x1 /* Add Route */ -#define RTM_DELETE 0x2 /* Delete Route */ -#define RTM_CHANGE 0x3 /* Change Metrics or flags */ -#define RTM_GET 0x4 /* Report Metrics */ -#define RTM_LOSING 0x5 /* RTM_LOSING is no longer generated by xnu - * and is deprecated */ -#define RTM_REDIRECT 0x6 /* Told to use different route */ -#define RTM_MISS 0x7 /* Lookup failed on this address */ -#define RTM_LOCK 0x8 /* fix specified metrics */ -#define RTM_OLDADD 0x9 /* caused by SIOCADDRT */ -#define RTM_OLDDEL 0xa /* caused by SIOCDELRT */ -#define RTM_RESOLVE 0xb /* req to resolve dst to LL addr */ -#define RTM_NEWADDR 0xc /* address being added to iface */ -#define RTM_DELADDR 0xd /* address being removed from iface */ -#define RTM_IFINFO 0xe /* iface going up/down etc. */ -#define RTM_NEWMADDR 0xf /* mcast group membership being added to if */ -#define RTM_DELMADDR 0x10 /* mcast group membership being deleted */ -#define RTM_IFINFO2 0x12 /* */ -#define RTM_NEWMADDR2 0x13 /* */ -#define RTM_GET2 0x14 /* */ - -/* - * Bitmask values for rtm_inits and rmx_locks. - */ -#define RTV_MTU 0x1 /* init or lock _mtu */ -#define RTV_HOPCOUNT 0x2 /* init or lock _hopcount */ -#define RTV_EXPIRE 0x4 /* init or lock _expire */ -#define RTV_RPIPE 0x8 /* init or lock _recvpipe */ -#define RTV_SPIPE 0x10 /* init or lock _sendpipe */ -#define RTV_SSTHRESH 0x20 /* init or lock _ssthresh */ -#define RTV_RTT 0x40 /* init or lock _rtt */ -#define RTV_RTTVAR 0x80 /* init or lock _rttvar */ - -/* - * Bitmask values for rtm_addrs. - */ -#define RTA_DST 0x1 /* destination sockaddr present */ -#define RTA_GATEWAY 0x2 /* gateway sockaddr present */ -#define RTA_NETMASK 0x4 /* netmask sockaddr present */ -#define RTA_GENMASK 0x8 /* cloning mask sockaddr present */ -#define RTA_IFP 0x10 /* interface name sockaddr present */ -#define RTA_IFA 0x20 /* interface addr sockaddr present */ -#define RTA_AUTHOR 0x40 /* sockaddr for author of redirect */ -#define RTA_BRD 0x80 /* for NEWADDR, broadcast or p-p dest addr */ - -/* - * Index offsets for sockaddr array for alternate internal encoding. - */ -#define RTAX_DST 0 /* destination sockaddr present */ -#define RTAX_GATEWAY 1 /* gateway sockaddr present */ -#define RTAX_NETMASK 2 /* netmask sockaddr present */ -#define RTAX_GENMASK 3 /* cloning mask sockaddr present */ -#define RTAX_IFP 4 /* interface name sockaddr present */ -#define RTAX_IFA 5 /* interface addr sockaddr present */ -#define RTAX_AUTHOR 6 /* sockaddr for author of redirect */ -#define RTAX_BRD 7 /* for NEWADDR, broadcast or p-p dest addr */ -#define RTAX_MAX 8 /* size of array to allocate */ - -struct rt_addrinfo { - int rti_addrs; - struct sockaddr *rti_info[RTAX_MAX]; -}; - - -#endif /* _NET_ROUTE_H_ */ diff --git a/lib/libc/include/x86_64-macos-gnu/netinet/in.h b/lib/libc/include/x86_64-macos-gnu/netinet/in.h deleted file mode 100644 index 0e921c2965..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/netinet/in.h +++ /dev/null @@ -1,671 +0,0 @@ -/* - * Copyright (c) 2000-2018 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * Copyright (c) 1982, 1986, 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)in.h 8.3 (Berkeley) 1/3/94 - * $FreeBSD: src/sys/netinet/in.h,v 1.48.2.2 2001/04/21 14:53:06 ume Exp $ - */ - -#ifndef _NETINET_IN_H_ -#define _NETINET_IN_H_ -#include -#include -#include /* uint(8|16|32)_t */ - -#include - -#include - -#include - -/* - * POSIX 1003.1-2003 - * "Inclusion of the header may also make visible all - * symbols from and ". - */ -#include - -/* - * The following two #includes insure htonl and family are defined - */ -#include -#include - -/* - * Constants and structures defined by the internet system, - * Per RFC 790, September 1981, and numerous additions. - */ - -/* - * Protocols (RFC 1700) - */ -#define IPPROTO_IP 0 /* dummy for IP */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define IPPROTO_HOPOPTS 0 /* IP6 hop-by-hop options */ -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ -#define IPPROTO_ICMP 1 /* control message protocol */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define IPPROTO_IGMP 2 /* group mgmt protocol */ -#define IPPROTO_GGP 3 /* gateway^2 (deprecated) */ -#define IPPROTO_IPV4 4 /* IPv4 encapsulation */ -#define IPPROTO_IPIP IPPROTO_IPV4 /* for compatibility */ -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ -#define IPPROTO_TCP 6 /* tcp */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define IPPROTO_ST 7 /* Stream protocol II */ -#define IPPROTO_EGP 8 /* exterior gateway protocol */ -#define IPPROTO_PIGP 9 /* private interior gateway */ -#define IPPROTO_RCCMON 10 /* BBN RCC Monitoring */ -#define IPPROTO_NVPII 11 /* network voice protocol*/ -#define IPPROTO_PUP 12 /* pup */ -#define IPPROTO_ARGUS 13 /* Argus */ -#define IPPROTO_EMCON 14 /* EMCON */ -#define IPPROTO_XNET 15 /* Cross Net Debugger */ -#define IPPROTO_CHAOS 16 /* Chaos*/ -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ -#define IPPROTO_UDP 17 /* user datagram protocol */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define IPPROTO_MUX 18 /* Multiplexing */ -#define IPPROTO_MEAS 19 /* DCN Measurement Subsystems */ -#define IPPROTO_HMP 20 /* Host Monitoring */ -#define IPPROTO_PRM 21 /* Packet Radio Measurement */ -#define IPPROTO_IDP 22 /* xns idp */ -#define IPPROTO_TRUNK1 23 /* Trunk-1 */ -#define IPPROTO_TRUNK2 24 /* Trunk-2 */ -#define IPPROTO_LEAF1 25 /* Leaf-1 */ -#define IPPROTO_LEAF2 26 /* Leaf-2 */ -#define IPPROTO_RDP 27 /* Reliable Data */ -#define IPPROTO_IRTP 28 /* Reliable Transaction */ -#define IPPROTO_TP 29 /* tp-4 w/ class negotiation */ -#define IPPROTO_BLT 30 /* Bulk Data Transfer */ -#define IPPROTO_NSP 31 /* Network Services */ -#define IPPROTO_INP 32 /* Merit Internodal */ -#define IPPROTO_SEP 33 /* Sequential Exchange */ -#define IPPROTO_3PC 34 /* Third Party Connect */ -#define IPPROTO_IDPR 35 /* InterDomain Policy Routing */ -#define IPPROTO_XTP 36 /* XTP */ -#define IPPROTO_DDP 37 /* Datagram Delivery */ -#define IPPROTO_CMTP 38 /* Control Message Transport */ -#define IPPROTO_TPXX 39 /* TP++ Transport */ -#define IPPROTO_IL 40 /* IL transport protocol */ -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ -#define IPPROTO_IPV6 41 /* IP6 header */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define IPPROTO_SDRP 42 /* Source Demand Routing */ -#define IPPROTO_ROUTING 43 /* IP6 routing header */ -#define IPPROTO_FRAGMENT 44 /* IP6 fragmentation header */ -#define IPPROTO_IDRP 45 /* InterDomain Routing*/ -#define IPPROTO_RSVP 46 /* resource reservation */ -#define IPPROTO_GRE 47 /* General Routing Encap. */ -#define IPPROTO_MHRP 48 /* Mobile Host Routing */ -#define IPPROTO_BHA 49 /* BHA */ -#define IPPROTO_ESP 50 /* IP6 Encap Sec. Payload */ -#define IPPROTO_AH 51 /* IP6 Auth Header */ -#define IPPROTO_INLSP 52 /* Integ. Net Layer Security */ -#define IPPROTO_SWIPE 53 /* IP with encryption */ -#define IPPROTO_NHRP 54 /* Next Hop Resolution */ -/* 55-57: Unassigned */ -#define IPPROTO_ICMPV6 58 /* ICMP6 */ -#define IPPROTO_NONE 59 /* IP6 no next header */ -#define IPPROTO_DSTOPTS 60 /* IP6 destination option */ -#define IPPROTO_AHIP 61 /* any host internal protocol */ -#define IPPROTO_CFTP 62 /* CFTP */ -#define IPPROTO_HELLO 63 /* "hello" routing protocol */ -#define IPPROTO_SATEXPAK 64 /* SATNET/Backroom EXPAK */ -#define IPPROTO_KRYPTOLAN 65 /* Kryptolan */ -#define IPPROTO_RVD 66 /* Remote Virtual Disk */ -#define IPPROTO_IPPC 67 /* Pluribus Packet Core */ -#define IPPROTO_ADFS 68 /* Any distributed FS */ -#define IPPROTO_SATMON 69 /* Satnet Monitoring */ -#define IPPROTO_VISA 70 /* VISA Protocol */ -#define IPPROTO_IPCV 71 /* Packet Core Utility */ -#define IPPROTO_CPNX 72 /* Comp. Prot. Net. Executive */ -#define IPPROTO_CPHB 73 /* Comp. Prot. HeartBeat */ -#define IPPROTO_WSN 74 /* Wang Span Network */ -#define IPPROTO_PVP 75 /* Packet Video Protocol */ -#define IPPROTO_BRSATMON 76 /* BackRoom SATNET Monitoring */ -#define IPPROTO_ND 77 /* Sun net disk proto (temp.) */ -#define IPPROTO_WBMON 78 /* WIDEBAND Monitoring */ -#define IPPROTO_WBEXPAK 79 /* WIDEBAND EXPAK */ -#define IPPROTO_EON 80 /* ISO cnlp */ -#define IPPROTO_VMTP 81 /* VMTP */ -#define IPPROTO_SVMTP 82 /* Secure VMTP */ -#define IPPROTO_VINES 83 /* Banyon VINES */ -#define IPPROTO_TTP 84 /* TTP */ -#define IPPROTO_IGP 85 /* NSFNET-IGP */ -#define IPPROTO_DGP 86 /* dissimilar gateway prot. */ -#define IPPROTO_TCF 87 /* TCF */ -#define IPPROTO_IGRP 88 /* Cisco/GXS IGRP */ -#define IPPROTO_OSPFIGP 89 /* OSPFIGP */ -#define IPPROTO_SRPC 90 /* Strite RPC protocol */ -#define IPPROTO_LARP 91 /* Locus Address Resoloution */ -#define IPPROTO_MTP 92 /* Multicast Transport */ -#define IPPROTO_AX25 93 /* AX.25 Frames */ -#define IPPROTO_IPEIP 94 /* IP encapsulated in IP */ -#define IPPROTO_MICP 95 /* Mobile Int.ing control */ -#define IPPROTO_SCCSP 96 /* Semaphore Comm. security */ -#define IPPROTO_ETHERIP 97 /* Ethernet IP encapsulation */ -#define IPPROTO_ENCAP 98 /* encapsulation header */ -#define IPPROTO_APES 99 /* any private encr. scheme */ -#define IPPROTO_GMTP 100 /* GMTP*/ -/* 101-252: Partly Unassigned */ -#define IPPROTO_PIM 103 /* Protocol Independent Mcast */ -#define IPPROTO_IPCOMP 108 /* payload compression (IPComp) */ -#define IPPROTO_PGM 113 /* PGM */ -#define IPPROTO_SCTP 132 /* SCTP */ -/* 253-254: Experimentation and testing; 255: Reserved (RFC3692) */ -/* BSD Private, local use, namespace incursion */ -#define IPPROTO_DIVERT 254 /* divert pseudo-protocol */ -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ -#define IPPROTO_RAW 255 /* raw IP packet */ - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define IPPROTO_MAX 256 - -/* last return value of *_input(), meaning "all job for this pkt is done". */ -#define IPPROTO_DONE 257 -#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ - -/* - * Local port number conventions: - * - * When a user does a bind(2) or connect(2) with a port number of zero, - * a non-conflicting local port address is chosen. - * The default range is IPPORT_RESERVED through - * IPPORT_USERRESERVED, although that is settable by sysctl. - * - * A user may set the IPPROTO_IP option IP_PORTRANGE to change this - * default assignment range. - * - * The value IP_PORTRANGE_DEFAULT causes the default behavior. - * - * The value IP_PORTRANGE_HIGH changes the range of candidate port numbers - * into the "high" range. These are reserved for client outbound connections - * which do not want to be filtered by any firewalls. - * - * The value IP_PORTRANGE_LOW changes the range to the "low" are - * that is (by convention) restricted to privileged processes. This - * convention is based on "vouchsafe" principles only. It is only secure - * if you trust the remote host to restrict these ports. - * - * The default range of ports and the high range can be changed by - * sysctl(3). (net.inet.ip.port{hi,low}{first,last}_auto) - * - * Changing those values has bad security implications if you are - * using a a stateless firewall that is allowing packets outside of that - * range in order to allow transparent outgoing connections. - * - * Such a firewall configuration will generally depend on the use of these - * default values. If you change them, you may find your Security - * Administrator looking for you with a heavy object. - * - * For a slightly more orthodox text view on this: - * - * ftp://ftp.isi.edu/in-notes/iana/assignments/port-numbers - * - * port numbers are divided into three ranges: - * - * 0 - 1023 Well Known Ports - * 1024 - 49151 Registered Ports - * 49152 - 65535 Dynamic and/or Private Ports - * - */ - -#define __DARWIN_IPPORT_RESERVED 1024 - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -/* - * Ports < IPPORT_RESERVED are reserved for - * privileged processes (e.g. root). (IP_PORTRANGE_LOW) - * Ports > IPPORT_USERRESERVED are reserved - * for servers, not necessarily privileged. (IP_PORTRANGE_DEFAULT) - */ -#ifndef IPPORT_RESERVED -#define IPPORT_RESERVED __DARWIN_IPPORT_RESERVED -#endif -#define IPPORT_USERRESERVED 5000 - -/* - * Default local port range to use by setting IP_PORTRANGE_HIGH - */ -#define IPPORT_HIFIRSTAUTO 49152 -#define IPPORT_HILASTAUTO 65535 - -/* - * Scanning for a free reserved port return a value below IPPORT_RESERVED, - * but higher than IPPORT_RESERVEDSTART. Traditionally the start value was - * 512, but that conflicts with some well-known-services that firewalls may - * have a fit if we use. - */ -#define IPPORT_RESERVEDSTART 600 -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ - -/* - * Internet address (a structure for historical reasons) - */ -struct in_addr { - in_addr_t s_addr; -}; - -/* - * Definitions of bits in internet address integers. - * On subnets, the decomposition of addresses to host and net parts - * is done according to subnet mask, not the masks here. - */ -#define INADDR_ANY (u_int32_t)0x00000000 -#define INADDR_BROADCAST (u_int32_t)0xffffffff /* must be masked */ - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define IN_CLASSA(i) (((u_int32_t)(i) & 0x80000000) == 0) -#define IN_CLASSA_NET 0xff000000 -#define IN_CLASSA_NSHIFT 24 -#define IN_CLASSA_HOST 0x00ffffff -#define IN_CLASSA_MAX 128 - -#define IN_CLASSB(i) (((u_int32_t)(i) & 0xc0000000) == 0x80000000) -#define IN_CLASSB_NET 0xffff0000 -#define IN_CLASSB_NSHIFT 16 -#define IN_CLASSB_HOST 0x0000ffff -#define IN_CLASSB_MAX 65536 - -#define IN_CLASSC(i) (((u_int32_t)(i) & 0xe0000000) == 0xc0000000) -#define IN_CLASSC_NET 0xffffff00 -#define IN_CLASSC_NSHIFT 8 -#define IN_CLASSC_HOST 0x000000ff - -#define IN_CLASSD(i) (((u_int32_t)(i) & 0xf0000000) == 0xe0000000) -#define IN_CLASSD_NET 0xf0000000 /* These ones aren't really */ -#define IN_CLASSD_NSHIFT 28 /* net and host fields, but */ -#define IN_CLASSD_HOST 0x0fffffff /* routing needn't know. */ -#define IN_MULTICAST(i) IN_CLASSD(i) - -#define IN_EXPERIMENTAL(i) (((u_int32_t)(i) & 0xf0000000) == 0xf0000000) -#define IN_BADCLASS(i) (((u_int32_t)(i) & 0xf0000000) == 0xf0000000) - -#define INADDR_LOOPBACK (u_int32_t)0x7f000001 - -#define INADDR_NONE 0xffffffff /* -1 return */ - -#define INADDR_UNSPEC_GROUP (u_int32_t)0xe0000000 /* 224.0.0.0 */ -#define INADDR_ALLHOSTS_GROUP (u_int32_t)0xe0000001 /* 224.0.0.1 */ -#define INADDR_ALLRTRS_GROUP (u_int32_t)0xe0000002 /* 224.0.0.2 */ -#define INADDR_ALLRPTS_GROUP (u_int32_t)0xe0000016 /* 224.0.0.22, IGMPv3 */ -#define INADDR_CARP_GROUP (u_int32_t)0xe0000012 /* 224.0.0.18 */ -#define INADDR_PFSYNC_GROUP (u_int32_t)0xe00000f0 /* 224.0.0.240 */ -#define INADDR_ALLMDNS_GROUP (u_int32_t)0xe00000fb /* 224.0.0.251 */ -#define INADDR_MAX_LOCAL_GROUP (u_int32_t)0xe00000ff /* 224.0.0.255 */ - -#ifdef __APPLE__ -#define IN_LINKLOCALNETNUM (u_int32_t)0xA9FE0000 /* 169.254.0.0 */ -#define IN_LINKLOCAL(i) (((u_int32_t)(i) & IN_CLASSB_NET) == IN_LINKLOCALNETNUM) -#define IN_LOOPBACK(i) (((u_int32_t)(i) & 0xff000000) == 0x7f000000) -#define IN_ZERONET(i) (((u_int32_t)(i) & 0xff000000) == 0) - -#define IN_PRIVATE(i) ((((u_int32_t)(i) & 0xff000000) == 0x0a000000) || \ - (((u_int32_t)(i) & 0xfff00000) == 0xac100000) || \ - (((u_int32_t)(i) & 0xffff0000) == 0xc0a80000)) - - -#define IN_LOCAL_GROUP(i) (((u_int32_t)(i) & 0xffffff00) == 0xe0000000) - -#define IN_ANY_LOCAL(i) (IN_LINKLOCAL(i) || IN_LOCAL_GROUP(i)) -#endif /* __APPLE__ */ - -#define IN_LOOPBACKNET 127 /* official! */ -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ - -/* - * Socket address, internet style. - */ -struct sockaddr_in { - __uint8_t sin_len; - sa_family_t sin_family; - in_port_t sin_port; - struct in_addr sin_addr; - char sin_zero[8]; -}; - -#define IN_ARE_ADDR_EQUAL(a, b) \ - (bcmp(&(a)->s_addr, &(b)->s_addr, \ - sizeof (struct in_addr)) == 0) - - -#define INET_ADDRSTRLEN 16 - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -/* - * Structure used to describe IP options. - * Used to store options internally, to pass them to a process, - * or to restore options retrieved earlier. - * The ip_dst is used for the first-hop gateway when using a source route - * (this gets put into the header proper). - */ -struct ip_opts { - struct in_addr ip_dst; /* first hop, 0 w/o src rt */ - char ip_opts[40]; /* actually variable in size */ -}; - -/* - * Options for use with [gs]etsockopt at the IP level. - * First word of comment is data type; bool is stored in int. - */ -#define IP_OPTIONS 1 /* buf/ip_opts; set/get IP options */ -#define IP_HDRINCL 2 /* int; header is included with data */ -#define IP_TOS 3 /* int; IP type of service and preced. */ -#define IP_TTL 4 /* int; IP time to live */ -#define IP_RECVOPTS 5 /* bool; receive all IP opts w/dgram */ -#define IP_RECVRETOPTS 6 /* bool; receive IP opts for response */ -#define IP_RECVDSTADDR 7 /* bool; receive IP dst addr w/dgram */ -#define IP_RETOPTS 8 /* ip_opts; set/get IP options */ -#define IP_MULTICAST_IF 9 /* u_char; set/get IP multicast i/f */ -#define IP_MULTICAST_TTL 10 /* u_char; set/get IP multicast ttl */ -#define IP_MULTICAST_LOOP 11 /* u_char; set/get IP multicast loopback */ -#define IP_ADD_MEMBERSHIP 12 /* ip_mreq; add an IP group membership */ -#define IP_DROP_MEMBERSHIP 13 /* ip_mreq; drop an IP group membership */ -#define IP_MULTICAST_VIF 14 /* set/get IP mcast virt. iface */ -#define IP_RSVP_ON 15 /* enable RSVP in kernel */ -#define IP_RSVP_OFF 16 /* disable RSVP in kernel */ -#define IP_RSVP_VIF_ON 17 /* set RSVP per-vif socket */ -#define IP_RSVP_VIF_OFF 18 /* unset RSVP per-vif socket */ -#define IP_PORTRANGE 19 /* int; range to choose for unspec port */ -#define IP_RECVIF 20 /* bool; receive reception if w/dgram */ -/* for IPSEC */ -#define IP_IPSEC_POLICY 21 /* int; set/get security policy */ -#define IP_FAITH 22 /* deprecated */ -#ifdef __APPLE__ -#define IP_STRIPHDR 23 /* bool: drop receive of raw IP header */ -#endif -#define IP_RECVTTL 24 /* bool; receive reception TTL w/dgram */ -#define IP_BOUND_IF 25 /* int; set/get bound interface */ -#define IP_PKTINFO 26 /* get pktinfo on recv socket, set src on sent dgram */ -#define IP_RECVPKTINFO IP_PKTINFO /* receive pktinfo w/dgram */ -#define IP_RECVTOS 27 /* bool; receive IP TOS w/dgram */ - -#define IP_FW_ADD 40 /* add a firewall rule to chain */ -#define IP_FW_DEL 41 /* delete a firewall rule from chain */ -#define IP_FW_FLUSH 42 /* flush firewall rule chain */ -#define IP_FW_ZERO 43 /* clear single/all firewall counter(s) */ -#define IP_FW_GET 44 /* get entire firewall rule chain */ -#define IP_FW_RESETLOG 45 /* reset logging counters */ - -/* These older firewall socket option codes are maintained for backward compatibility. */ -#define IP_OLD_FW_ADD 50 /* add a firewall rule to chain */ -#define IP_OLD_FW_DEL 51 /* delete a firewall rule from chain */ -#define IP_OLD_FW_FLUSH 52 /* flush firewall rule chain */ -#define IP_OLD_FW_ZERO 53 /* clear single/all firewall counter(s) */ -#define IP_OLD_FW_GET 54 /* get entire firewall rule chain */ -#define IP_NAT__XXX 55 /* set/get NAT opts XXX Deprecated, do not use */ -#define IP_OLD_FW_RESETLOG 56 /* reset logging counters */ - -#define IP_DUMMYNET_CONFIGURE 60 /* add/configure a dummynet pipe */ -#define IP_DUMMYNET_DEL 61 /* delete a dummynet pipe from chain */ -#define IP_DUMMYNET_FLUSH 62 /* flush dummynet */ -#define IP_DUMMYNET_GET 64 /* get entire dummynet pipes */ - -#define IP_TRAFFIC_MGT_BACKGROUND 65 /* int*; get background IO flags; set background IO */ -#define IP_MULTICAST_IFINDEX 66 /* int*; set/get IP multicast i/f index */ - -/* IPv4 Source Filter Multicast API [RFC3678] */ -#define IP_ADD_SOURCE_MEMBERSHIP 70 /* join a source-specific group */ -#define IP_DROP_SOURCE_MEMBERSHIP 71 /* drop a single source */ -#define IP_BLOCK_SOURCE 72 /* block a source */ -#define IP_UNBLOCK_SOURCE 73 /* unblock a source */ - -/* The following option is private; do not use it from user applications. */ -#define IP_MSFILTER 74 /* set/get filter list */ - -/* Protocol Independent Multicast API [RFC3678] */ -#define MCAST_JOIN_GROUP 80 /* join an any-source group */ -#define MCAST_LEAVE_GROUP 81 /* leave all sources for group */ -#define MCAST_JOIN_SOURCE_GROUP 82 /* join a source-specific group */ -#define MCAST_LEAVE_SOURCE_GROUP 83 /* leave a single source */ -#define MCAST_BLOCK_SOURCE 84 /* block a source */ -#define MCAST_UNBLOCK_SOURCE 85 /* unblock a source */ - - -/* - * Defaults and limits for options - */ -#define IP_DEFAULT_MULTICAST_TTL 1 /* normally limit m'casts to 1 hop */ -#define IP_DEFAULT_MULTICAST_LOOP 1 /* normally hear sends if a member */ - -/* - * The imo_membership vector for each socket is now dynamically allocated at - * run-time, bounded by USHRT_MAX, and is reallocated when needed, sized - * according to a power-of-two increment. - */ -#define IP_MIN_MEMBERSHIPS 31 -#define IP_MAX_MEMBERSHIPS 4095 - -/* - * Default resource limits for IPv4 multicast source filtering. - * These may be modified by sysctl. - */ -#define IP_MAX_GROUP_SRC_FILTER 512 /* sources per group */ -#define IP_MAX_SOCK_SRC_FILTER 128 /* sources per socket/group */ -#define IP_MAX_SOCK_MUTE_FILTER 128 /* XXX no longer used */ - -/* - * Argument structure for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP. - */ -struct ip_mreq { - struct in_addr imr_multiaddr; /* IP multicast address of group */ - struct in_addr imr_interface; /* local IP address of interface */ -}; - -/* - * Modified argument structure for IP_MULTICAST_IF, obtained from Linux. - * This is used to specify an interface index for multicast sends, as - * the IPv4 legacy APIs do not support this (unless IP_SENDIF is available). - */ -struct ip_mreqn { - struct in_addr imr_multiaddr; /* IP multicast address of group */ - struct in_addr imr_address; /* local IP address of interface */ - int imr_ifindex; /* Interface index; cast to uint32_t */ -}; - -#pragma pack(4) -/* - * Argument structure for IPv4 Multicast Source Filter APIs. [RFC3678] - */ -struct ip_mreq_source { - struct in_addr imr_multiaddr; /* IP multicast address of group */ - struct in_addr imr_sourceaddr; /* IP address of source */ - struct in_addr imr_interface; /* local IP address of interface */ -}; - -/* - * Argument structures for Protocol-Independent Multicast Source - * Filter APIs. [RFC3678] - */ -struct group_req { - uint32_t gr_interface; /* interface index */ - struct sockaddr_storage gr_group; /* group address */ -}; - -struct group_source_req { - uint32_t gsr_interface; /* interface index */ - struct sockaddr_storage gsr_group; /* group address */ - struct sockaddr_storage gsr_source; /* source address */ -}; - -#ifndef __MSFILTERREQ_DEFINED -#define __MSFILTERREQ_DEFINED -/* - * The following structure is private; do not use it from user applications. - * It is used to communicate IP_MSFILTER/IPV6_MSFILTER information between - * the RFC 3678 libc functions and the kernel. - */ -struct __msfilterreq { - uint32_t msfr_ifindex; /* interface index */ - uint32_t msfr_fmode; /* filter mode for group */ - uint32_t msfr_nsrcs; /* # of sources in msfr_srcs */ - uint32_t __msfr_align; - struct sockaddr_storage msfr_group; /* group address */ - struct sockaddr_storage *msfr_srcs; -}; - -#endif /* __MSFILTERREQ_DEFINED */ - -#pragma pack() -struct sockaddr; - -/* - * Advanced (Full-state) APIs [RFC3678] - * The RFC specifies uint_t for the 6th argument to [sg]etsourcefilter(). - * We use uint32_t here to be consistent. - */ -int setipv4sourcefilter(int, struct in_addr, struct in_addr, uint32_t, - uint32_t, struct in_addr *) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); -int getipv4sourcefilter(int, struct in_addr, struct in_addr, uint32_t *, - uint32_t *, struct in_addr *) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); -int setsourcefilter(int, uint32_t, struct sockaddr *, socklen_t, - uint32_t, uint32_t, struct sockaddr_storage *) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); -int getsourcefilter(int, uint32_t, struct sockaddr *, socklen_t, - uint32_t *, uint32_t *, struct sockaddr_storage *) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); - -/* - * Filter modes; also used to represent per-socket filter mode internally. - */ -#define MCAST_UNDEFINED 0 /* fmode: not yet defined */ -#define MCAST_INCLUDE 1 /* fmode: include these source(s) */ -#define MCAST_EXCLUDE 2 /* fmode: exclude these source(s) */ - -/* - * Argument for IP_PORTRANGE: - * - which range to search when port is unspecified at bind() or connect() - */ -#define IP_PORTRANGE_DEFAULT 0 /* default range */ -#define IP_PORTRANGE_HIGH 1 /* "high" - request firewall bypass */ -#define IP_PORTRANGE_LOW 2 /* "low" - vouchsafe security */ - - -/* - * IP_PKTINFO: Packet information (equivalent to RFC2292 sec 5 for IPv4) - * This structure is used for - * - * 1) Receiving ancilliary data about the datagram if IP_PKTINFO sockopt is - * set on the socket. In this case ipi_ifindex will contain the interface - * index the datagram was received on, ipi_addr is the IP address the - * datagram was received to. - * - * 2) Sending a datagram using a specific interface or IP source address. - * if ipi_ifindex is set to non-zero when in_pktinfo is passed as - * ancilliary data of type IP_PKTINFO, this will be used as the source - * interface to send the datagram from. If ipi_ifindex is null, ip_spec_dst - * will be used for the source address. - * - * Note: if IP_BOUND_IF is set on the socket, ipi_ifindex in the ancillary - * IP_PKTINFO option silently overrides the bound interface when it is - * specified during send time. - */ -struct in_pktinfo { - unsigned int ipi_ifindex; /* send/recv interface index */ - struct in_addr ipi_spec_dst; /* Local address */ - struct in_addr ipi_addr; /* IP Header dst address */ -}; - -/* - * Definitions for inet sysctl operations. - * - * Third level is protocol number. - * Fourth level is desired variable within that protocol. - */ -#define IPPROTO_MAXID (IPPROTO_AH + 1) /* don't list to IPPROTO_MAX */ - - -/* - * Names for IP sysctl objects - */ -#define IPCTL_FORWARDING 1 /* act as router */ -#define IPCTL_SENDREDIRECTS 2 /* may send redirects when forwarding */ -#define IPCTL_DEFTTL 3 /* default TTL */ -#ifdef notyet -#define IPCTL_DEFMTU 4 /* default MTU */ -#endif -#define IPCTL_RTEXPIRE 5 /* cloned route expiration time */ -#define IPCTL_RTMINEXPIRE 6 /* min value for expiration time */ -#define IPCTL_RTMAXCACHE 7 /* trigger level for dynamic expire */ -#define IPCTL_SOURCEROUTE 8 /* may perform source routes */ -#define IPCTL_DIRECTEDBROADCAST 9 /* may re-broadcast received packets */ -#define IPCTL_INTRQMAXLEN 10 /* max length of netisr queue */ -#define IPCTL_INTRQDROPS 11 /* number of netisr q drops */ -#define IPCTL_STATS 12 /* ipstat structure */ -#define IPCTL_ACCEPTSOURCEROUTE 13 /* may accept source routed packets */ -#define IPCTL_FASTFORWARDING 14 /* use fast IP forwarding code */ -#define IPCTL_KEEPFAITH 15 /* deprecated */ -#define IPCTL_GIF_TTL 16 /* default TTL for gif encap packet */ -#define IPCTL_MAXID 17 - -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ - -/* INET6 stuff */ -#define __KAME_NETINET_IN_H_INCLUDED_ -#include -#undef __KAME_NETINET_IN_H_INCLUDED_ - - - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -__BEGIN_DECLS -int bindresvport(int, struct sockaddr_in *); -struct sockaddr; -int bindresvport_sa(int, struct sockaddr *); -__END_DECLS -#endif -#endif /* _NETINET_IN_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/netinet/tcp.h b/lib/libc/include/x86_64-macos-gnu/netinet/tcp.h deleted file mode 100644 index f089db156e..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/netinet/tcp.h +++ /dev/null @@ -1,283 +0,0 @@ -/* - * Copyright (c) 2000-2018 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)tcp.h 8.1 (Berkeley) 6/10/93 - * $FreeBSD: src/sys/netinet/tcp.h,v 1.13.2.3 2001/03/01 22:08:42 jlemon Exp $ - */ - -#ifndef _NETINET_TCP_H_ -#define _NETINET_TCP_H_ -#include -#include -#include -#include /* __uint32_t */ - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -typedef __uint32_t tcp_seq; -typedef __uint32_t tcp_cc; /* connection count per rfc1644 */ - -#define tcp6_seq tcp_seq /* for KAME src sync over BSD*'s */ -#define tcp6hdr tcphdr /* for KAME src sync over BSD*'s */ - -/* - * TCP header. - * Per RFC 793, September, 1981. - */ -struct tcphdr { - unsigned short th_sport; /* source port */ - unsigned short th_dport; /* destination port */ - tcp_seq th_seq; /* sequence number */ - tcp_seq th_ack; /* acknowledgement number */ -#if __DARWIN_BYTE_ORDER == __DARWIN_LITTLE_ENDIAN - unsigned int th_x2:4, /* (unused) */ - th_off:4; /* data offset */ -#endif -#if __DARWIN_BYTE_ORDER == __DARWIN_BIG_ENDIAN - unsigned int th_off:4, /* data offset */ - th_x2:4; /* (unused) */ -#endif - unsigned char th_flags; -#define TH_FIN 0x01 -#define TH_SYN 0x02 -#define TH_RST 0x04 -#define TH_PUSH 0x08 -#define TH_ACK 0x10 -#define TH_URG 0x20 -#define TH_ECE 0x40 -#define TH_CWR 0x80 -#define TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR) -#define TH_ACCEPT (TH_FIN|TH_SYN|TH_RST|TH_ACK) - - unsigned short th_win; /* window */ - unsigned short th_sum; /* checksum */ - unsigned short th_urp; /* urgent pointer */ -}; - -#define TCPOPT_EOL 0 -#define TCPOPT_NOP 1 -#define TCPOPT_MAXSEG 2 -#define TCPOLEN_MAXSEG 4 -#define TCPOPT_WINDOW 3 -#define TCPOLEN_WINDOW 3 -#define TCPOPT_SACK_PERMITTED 4 /* Experimental */ -#define TCPOLEN_SACK_PERMITTED 2 -#define TCPOPT_SACK 5 /* Experimental */ -#define TCPOLEN_SACK 8 /* len of sack block */ -#define TCPOPT_TIMESTAMP 8 -#define TCPOLEN_TIMESTAMP 10 -#define TCPOLEN_TSTAMP_APPA (TCPOLEN_TIMESTAMP+2) /* appendix A */ -#define TCPOPT_TSTAMP_HDR \ - (TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_TIMESTAMP<<8|TCPOLEN_TIMESTAMP) - -#define MAX_TCPOPTLEN 40 /* Absolute maximum TCP options len */ - -#define TCPOPT_CC 11 /* CC options: RFC-1644 */ -#define TCPOPT_CCNEW 12 -#define TCPOPT_CCECHO 13 -#define TCPOLEN_CC 6 -#define TCPOLEN_CC_APPA (TCPOLEN_CC+2) -#define TCPOPT_CC_HDR(ccopt) \ - (TCPOPT_NOP<<24|TCPOPT_NOP<<16|(ccopt)<<8|TCPOLEN_CC) -#define TCPOPT_SIGNATURE 19 /* Keyed MD5: RFC 2385 */ -#define TCPOLEN_SIGNATURE 18 -#if MPTCP -#define TCPOPT_MULTIPATH 30 -#endif - -#define TCPOPT_FASTOPEN 34 -#define TCPOLEN_FASTOPEN_REQ 2 - -/* Option definitions */ -#define TCPOPT_SACK_PERMIT_HDR \ -(TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_SACK_PERMITTED<<8|TCPOLEN_SACK_PERMITTED) -#define TCPOPT_SACK_HDR (TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_SACK<<8) -/* Miscellaneous constants */ -#define MAX_SACK_BLKS 6 /* Max # SACK blocks stored at sender side */ - -/* - * A SACK option that specifies n blocks will have a length of (8*n + 2) - * bytes, so the 40 bytes available for TCP options can specify a - * maximum of 4 blocks. - */ - -#define TCP_MAX_SACK 4 /* MAX # SACKs sent in any segment */ - - -/* - * Default maximum segment size for TCP. - * With an IP MTU of 576, this is 536, - * but 512 is probably more convenient. - * This should be defined as MIN(512, IP_MSS - sizeof (struct tcpiphdr)). - */ -#define TCP_MSS 512 - -/* - * TCP_MINMSS is defined to be 216 which is fine for the smallest - * link MTU (256 bytes, SLIP interface) in the Internet. - * However it is very unlikely to come across such low MTU interfaces - * these days (anno dato 2004). - * Probably it can be set to 512 without ill effects. But we play safe. - * See tcp_subr.c tcp_minmss SYSCTL declaration for more comments. - * Setting this to "0" disables the minmss check. - */ -#define TCP_MINMSS 216 - -/* - * Default maximum segment size for TCP6. - * With an IP6 MSS of 1280, this is 1220, - * but 1024 is probably more convenient. (xxx kazu in doubt) - * This should be defined as MIN(1024, IP6_MSS - sizeof (struct tcpip6hdr)) - */ -#define TCP6_MSS 1024 - -#define TCP_MAXWIN 65535 /* largest value for (unscaled) window */ -#define TTCP_CLIENT_SND_WND 4096 /* dflt send window for T/TCP client */ - -#define TCP_MAX_WINSHIFT 14 /* maximum window shift */ - -#define TCP_MAXHLEN (0xf<<2) /* max length of header in bytes */ -#define TCP_MAXOLEN (TCP_MAXHLEN - sizeof(struct tcphdr)) -/* max space left for options */ -#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ - -/* - * User-settable options (used with setsockopt). - */ -#define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define TCP_MAXSEG 0x02 /* set maximum segment size */ -#define TCP_NOPUSH 0x04 /* don't push last block of write */ -#define TCP_NOOPT 0x08 /* don't use TCP options */ -#define TCP_KEEPALIVE 0x10 /* idle time used when SO_KEEPALIVE is enabled */ -#define TCP_CONNECTIONTIMEOUT 0x20 /* connection timeout */ -#define PERSIST_TIMEOUT 0x40 /* time after which a connection in - * persist timeout will terminate. - * see draft-ananth-tcpm-persist-02.txt - */ -#define TCP_RXT_CONNDROPTIME 0x80 /* time after which tcp retransmissions will be - * stopped and the connection will be dropped - */ -#define TCP_RXT_FINDROP 0x100 /* when this option is set, drop a connection - * after retransmitting the FIN 3 times. It will - * prevent holding too many mbufs in socket - * buffer queues. - */ -#define TCP_KEEPINTVL 0x101 /* interval between keepalives */ -#define TCP_KEEPCNT 0x102 /* number of keepalives before close */ -#define TCP_SENDMOREACKS 0x103 /* always ack every other packet */ -#define TCP_ENABLE_ECN 0x104 /* Enable ECN on a connection */ -#define TCP_FASTOPEN 0x105 /* Enable/Disable TCP Fastopen on this socket */ -#define TCP_CONNECTION_INFO 0x106 /* State of TCP connection */ - - - -#define TCP_NOTSENT_LOWAT 0x201 /* Low water mark for TCP unsent data */ - - -struct tcp_connection_info { - u_int8_t tcpi_state; /* connection state */ - u_int8_t tcpi_snd_wscale; /* Window scale for send window */ - u_int8_t tcpi_rcv_wscale; /* Window scale for receive window */ - u_int8_t __pad1; - u_int32_t tcpi_options; /* TCP options supported */ -#define TCPCI_OPT_TIMESTAMPS 0x00000001 /* Timestamps enabled */ -#define TCPCI_OPT_SACK 0x00000002 /* SACK enabled */ -#define TCPCI_OPT_WSCALE 0x00000004 /* Window scaling enabled */ -#define TCPCI_OPT_ECN 0x00000008 /* ECN enabled */ - u_int32_t tcpi_flags; /* flags */ -#define TCPCI_FLAG_LOSSRECOVERY 0x00000001 -#define TCPCI_FLAG_REORDERING_DETECTED 0x00000002 - u_int32_t tcpi_rto; /* retransmit timeout in ms */ - u_int32_t tcpi_maxseg; /* maximum segment size supported */ - u_int32_t tcpi_snd_ssthresh; /* slow start threshold in bytes */ - u_int32_t tcpi_snd_cwnd; /* send congestion window in bytes */ - u_int32_t tcpi_snd_wnd; /* send widnow in bytes */ - u_int32_t tcpi_snd_sbbytes; /* bytes in send socket buffer, including in-flight data */ - u_int32_t tcpi_rcv_wnd; /* receive window in bytes*/ - u_int32_t tcpi_rttcur; /* most recent RTT in ms */ - u_int32_t tcpi_srtt; /* average RTT in ms */ - u_int32_t tcpi_rttvar; /* RTT variance */ - u_int32_t - tcpi_tfo_cookie_req:1, /* Cookie requested? */ - tcpi_tfo_cookie_rcv:1, /* Cookie received? */ - tcpi_tfo_syn_loss:1, /* Fallback to reg. TCP after SYN-loss */ - tcpi_tfo_syn_data_sent:1, /* SYN+data has been sent out */ - tcpi_tfo_syn_data_acked:1, /* SYN+data has been fully acknowledged */ - tcpi_tfo_syn_data_rcv:1, /* Server received SYN+data with a valid cookie */ - tcpi_tfo_cookie_req_rcv:1, /* Server received cookie-request */ - tcpi_tfo_cookie_sent:1, /* Server announced cookie */ - tcpi_tfo_cookie_invalid:1, /* Server received an invalid cookie */ - tcpi_tfo_cookie_wrong:1, /* Our sent cookie was wrong */ - tcpi_tfo_no_cookie_rcv:1, /* We did not receive a cookie upon our request */ - tcpi_tfo_heuristics_disable:1, /* TFO-heuristics disabled it */ - tcpi_tfo_send_blackhole:1, /* A sending-blackhole got detected */ - tcpi_tfo_recv_blackhole:1, /* A receiver-blackhole got detected */ - tcpi_tfo_onebyte_proxy:1, /* A proxy acknowledges all but one byte of the SYN */ - __pad2:17; - u_int64_t tcpi_txpackets __attribute__((aligned(8))); - u_int64_t tcpi_txbytes __attribute__((aligned(8))); - u_int64_t tcpi_txretransmitbytes __attribute__((aligned(8))); - u_int64_t tcpi_rxpackets __attribute__((aligned(8))); - u_int64_t tcpi_rxbytes __attribute__((aligned(8))); - u_int64_t tcpi_rxoutoforderbytes __attribute__((aligned(8))); - u_int64_t tcpi_txretransmitpackets __attribute__((aligned(8))); -}; -#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ - -#endif \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/netinet6/in6.h b/lib/libc/include/x86_64-macos-gnu/netinet6/in6.h deleted file mode 100644 index 19899090ad..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/netinet6/in6.h +++ /dev/null @@ -1,667 +0,0 @@ -/* - * Copyright (c) 2008-2018 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ - -/* - * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the project nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Copyright (c) 1982, 1986, 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)in.h 8.3 (Berkeley) 1/3/94 - */ - -#ifndef __KAME_NETINET_IN_H_INCLUDED_ -#error "do not include netinet6/in6.h directly, include netinet/in.h. " \ - " see RFC2553" -#endif - -#ifndef _NETINET6_IN6_H_ -#define _NETINET6_IN6_H_ -#include -#include -#include - -/* - * Identification of the network protocol stack - * for *BSD-current/release: http://www.kame.net/dev/cvsweb.cgi/kame/COVERAGE - * has the table of implementation/integration differences. - */ -#define __KAME__ -#define __KAME_VERSION "2009/apple-darwin" - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -/* - * Local port number conventions: - * - * Ports < IPPORT_RESERVED are reserved for privileged processes (e.g. root), - * unless a kernel is compiled with IPNOPRIVPORTS defined. - * - * When a user does a bind(2) or connect(2) with a port number of zero, - * a non-conflicting local port address is chosen. - * - * The default range is IPPORT_ANONMIN to IPPORT_ANONMAX, although - * that is settable by sysctl(3); net.inet.ip.anonportmin and - * net.inet.ip.anonportmax respectively. - * - * A user may set the IPPROTO_IP option IP_PORTRANGE to change this - * default assignment range. - * - * The value IP_PORTRANGE_DEFAULT causes the default behavior. - * - * The value IP_PORTRANGE_HIGH is the same as IP_PORTRANGE_DEFAULT, - * and exists only for FreeBSD compatibility purposes. - * - * The value IP_PORTRANGE_LOW changes the range to the "low" are - * that is (by convention) restricted to privileged processes. - * This convention is based on "vouchsafe" principles only. - * It is only secure if you trust the remote host to restrict these ports. - * The range is IPPORT_RESERVEDMIN to IPPORT_RESERVEDMAX. - */ - -#define IPV6PORT_RESERVED 1024 -#define IPV6PORT_ANONMIN 49152 -#define IPV6PORT_ANONMAX 65535 -#define IPV6PORT_RESERVEDMIN 600 -#define IPV6PORT_RESERVEDMAX (IPV6PORT_RESERVED-1) -#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ - -/* - * IPv6 address - */ -typedef struct in6_addr { - union { - __uint8_t __u6_addr8[16]; - __uint16_t __u6_addr16[8]; - __uint32_t __u6_addr32[4]; - } __u6_addr; /* 128-bit IP6 address */ -} in6_addr_t; - -#define s6_addr __u6_addr.__u6_addr8 - -#define INET6_ADDRSTRLEN 46 - -/* - * Socket address for IPv6 - */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define SIN6_LEN -#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ -struct sockaddr_in6 { - __uint8_t sin6_len; /* length of this struct(sa_family_t) */ - sa_family_t sin6_family; /* AF_INET6 (sa_family_t) */ - in_port_t sin6_port; /* Transport layer port # (in_port_t) */ - __uint32_t sin6_flowinfo; /* IP6 flow information */ - struct in6_addr sin6_addr; /* IP6 address */ - __uint32_t sin6_scope_id; /* scope zone index */ -}; - - - - -/* - * Definition of some useful macros to handle IP6 addresses - */ -#define IN6ADDR_ANY_INIT \ - {{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}} -#define IN6ADDR_LOOPBACK_INIT \ - {{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}} -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define IN6ADDR_NODELOCAL_ALLNODES_INIT \ - {{{ 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}} -#define IN6ADDR_INTFACELOCAL_ALLNODES_INIT \ - {{{ 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}} -#define IN6ADDR_LINKLOCAL_ALLNODES_INIT \ - {{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}} -#define IN6ADDR_LINKLOCAL_ALLROUTERS_INIT \ - {{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 }}} -#define IN6ADDR_LINKLOCAL_ALLV2ROUTERS_INIT \ - {{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16 }}} -#define IN6ADDR_V4MAPPED_INIT \ - {{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ - 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }}} -#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ - -extern const struct in6_addr in6addr_any; -extern const struct in6_addr in6addr_loopback; -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -extern const struct in6_addr in6addr_nodelocal_allnodes; -extern const struct in6_addr in6addr_linklocal_allnodes; -extern const struct in6_addr in6addr_linklocal_allrouters; -extern const struct in6_addr in6addr_linklocal_allv2routers; -#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ - -/* - * Equality - * NOTE: Some of kernel programming environment (for example, openbsd/sparc) - * does not supply memcmp(). For userland memcmp() is preferred as it is - * in ANSI standard. - */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define IN6_ARE_ADDR_EQUAL(a, b) \ - (memcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof (struct in6_addr)) \ - == 0) -#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ - - -/* - * Unspecified - */ -#define IN6_IS_ADDR_UNSPECIFIED(a) \ - ((*(const __uint32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \ - (*(const __uint32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \ - (*(const __uint32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \ - (*(const __uint32_t *)(const void *)(&(a)->s6_addr[12]) == 0)) - -/* - * Loopback - */ -#define IN6_IS_ADDR_LOOPBACK(a) \ - ((*(const __uint32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \ - (*(const __uint32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \ - (*(const __uint32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \ - (*(const __uint32_t *)(const void *)(&(a)->s6_addr[12]) == ntohl(1))) - -/* - * IPv4 compatible - */ -#define IN6_IS_ADDR_V4COMPAT(a) \ - ((*(const __uint32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \ - (*(const __uint32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \ - (*(const __uint32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \ - (*(const __uint32_t *)(const void *)(&(a)->s6_addr[12]) != 0) && \ - (*(const __uint32_t *)(const void *)(&(a)->s6_addr[12]) != ntohl(1))) - -/* - * Mapped - */ -#define IN6_IS_ADDR_V4MAPPED(a) \ - ((*(const __uint32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \ - (*(const __uint32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \ - (*(const __uint32_t *)(const void *)(&(a)->s6_addr[8]) == \ - ntohl(0x0000ffff))) - -/* - * 6to4 - */ -#define IN6_IS_ADDR_6TO4(x) (ntohs((x)->s6_addr16[0]) == 0x2002) - -/* - * KAME Scope Values - */ - -#define __IPV6_ADDR_SCOPE_NODELOCAL 0x01 -#define __IPV6_ADDR_SCOPE_INTFACELOCAL 0x01 -#define __IPV6_ADDR_SCOPE_LINKLOCAL 0x02 -#define __IPV6_ADDR_SCOPE_SITELOCAL 0x05 -#define __IPV6_ADDR_SCOPE_ORGLOCAL 0x08 /* just used in this file */ -#define __IPV6_ADDR_SCOPE_GLOBAL 0x0e - -/* - * Unicast Scope - * Note that we must check topmost 10 bits only, not 16 bits (see RFC2373). - */ -#define IN6_IS_ADDR_LINKLOCAL(a) \ - (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80)) -#define IN6_IS_ADDR_SITELOCAL(a) \ - (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0)) - -/* - * Multicast - */ -#define IN6_IS_ADDR_MULTICAST(a) ((a)->s6_addr[0] == 0xff) - -/* - * Unique Local IPv6 Unicast Addresses (per RFC 4193) - */ -#define IN6_IS_ADDR_UNIQUE_LOCAL(a) \ - (((a)->s6_addr[0] == 0xfc) || ((a)->s6_addr[0] == 0xfd)) - -#define __IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f) - -/* - * Multicast Scope - */ -#define IN6_IS_ADDR_MC_NODELOCAL(a) \ - (IN6_IS_ADDR_MULTICAST(a) && \ - (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_NODELOCAL)) -#define IN6_IS_ADDR_MC_LINKLOCAL(a) \ - (IN6_IS_ADDR_MULTICAST(a) && \ - (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_LINKLOCAL)) -#define IN6_IS_ADDR_MC_SITELOCAL(a) \ - (IN6_IS_ADDR_MULTICAST(a) && \ - (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_SITELOCAL)) -#define IN6_IS_ADDR_MC_ORGLOCAL(a) \ - (IN6_IS_ADDR_MULTICAST(a) && \ - (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_ORGLOCAL)) -#define IN6_IS_ADDR_MC_GLOBAL(a) \ - (IN6_IS_ADDR_MULTICAST(a) && \ - (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_GLOBAL)) - - - - -/* - * Options for use with [gs]etsockopt at the IPV6 level. - * First word of comment is data type; bool is stored in int. - */ -/* no hdrincl */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -/* - * RFC 3542 define the following socket options in a manner incompatible - * with RFC 2292: - * IPV6_PKTINFO - * IPV6_HOPLIMIT - * IPV6_NEXTHOP - * IPV6_HOPOPTS - * IPV6_DSTOPTS - * IPV6_RTHDR - * - * To use the new IPv6 Sockets options introduced by RFC 3542 - * the constant __APPLE_USE_RFC_3542 must be defined before - * including - * - * To use the old IPv6 Sockets options from RFC 2292 - * the constant __APPLE_USE_RFC_2292 must be defined before - * including - * - * Note that eventually RFC 3542 is going to be the - * default and RFC 2292 will be obsolete. - */ - -#if defined(__APPLE_USE_RFC_3542) && defined(__APPLE_USE_RFC_2292) -#error "__APPLE_USE_RFC_3542 and __APPLE_USE_RFC_2292 cannot be both defined" -#endif - -#if 0 /* the followings are relic in IPv4 and hence are disabled */ -#define IPV6_OPTIONS 1 /* buf/ip6_opts; set/get IP6 options */ -#define IPV6_RECVOPTS 5 /* bool; receive all IP6 opts w/dgram */ -#define IPV6_RECVRETOPTS 6 /* bool; receive IP6 opts for response */ -#define IPV6_RECVDSTADDR 7 /* bool; receive IP6 dst addr w/dgram */ -#define IPV6_RETOPTS 8 /* ip6_opts; set/get IP6 options */ -#endif /* 0 */ -#define IPV6_SOCKOPT_RESERVED1 3 /* reserved for future use */ -#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ -#define IPV6_UNICAST_HOPS 4 /* int; IP6 hops */ -#define IPV6_MULTICAST_IF 9 /* __uint8_t; set/get IP6 multicast i/f */ -#define IPV6_MULTICAST_HOPS 10 /* __uint8_t; set/get IP6 multicast hops */ -#define IPV6_MULTICAST_LOOP 11 /* __uint8_t; set/get IP6 mcast loopback */ -#define IPV6_JOIN_GROUP 12 /* ip6_mreq; join a group membership */ -#define IPV6_LEAVE_GROUP 13 /* ip6_mreq; leave a group membership */ - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define IPV6_PORTRANGE 14 /* int; range to choose for unspec port */ -#define ICMP6_FILTER 18 /* icmp6_filter; icmp6 filter */ -#define IPV6_2292PKTINFO 19 /* bool; send/recv if, src/dst addr */ -#define IPV6_2292HOPLIMIT 20 /* bool; hop limit */ -#define IPV6_2292NEXTHOP 21 /* bool; next hop addr */ -#define IPV6_2292HOPOPTS 22 /* bool; hop-by-hop option */ -#define IPV6_2292DSTOPTS 23 /* bool; destinaion option */ -#define IPV6_2292RTHDR 24 /* ip6_rthdr: routing header */ - -/* buf/cmsghdr; set/get IPv6 options [obsoleted by RFC3542] */ -#define IPV6_2292PKTOPTIONS 25 - -#ifdef __APPLE_USE_RFC_2292 -#define IPV6_PKTINFO IPV6_2292PKTINFO -#define IPV6_HOPLIMIT IPV6_2292HOPLIMIT -#define IPV6_NEXTHOP IPV6_2292NEXTHOP -#define IPV6_HOPOPTS IPV6_2292HOPOPTS -#define IPV6_DSTOPTS IPV6_2292DSTOPTS -#define IPV6_RTHDR IPV6_2292RTHDR -#define IPV6_PKTOPTIONS IPV6_2292PKTOPTIONS -#endif /* __APPLE_USE_RFC_2292 */ - -#define IPV6_CHECKSUM 26 /* int; checksum offset for raw socket */ -#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ -#define IPV6_V6ONLY 27 /* bool; only bind INET6 at wildcard bind */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define IPV6_BINDV6ONLY IPV6_V6ONLY - - -#if 1 /* IPSEC */ -#define IPV6_IPSEC_POLICY 28 /* struct; get/set security policy */ -#endif /* 1 */ -#define IPV6_FAITH 29 /* deprecated */ - -#if 1 /* IPV6FIREWALL */ -#define IPV6_FW_ADD 30 /* add a firewall rule to chain */ -#define IPV6_FW_DEL 31 /* delete a firewall rule from chain */ -#define IPV6_FW_FLUSH 32 /* flush firewall rule chain */ -#define IPV6_FW_ZERO 33 /* clear single/all firewall counter(s) */ -#define IPV6_FW_GET 34 /* get entire firewall rule chain */ -#endif /* 1 */ - -/* - * APPLE: NOTE the value of those 2 options is kept unchanged from - * previous version of darwin/OS X for binary compatibility reasons - * and differ from FreeBSD (values 57 and 61). See below. - */ -#define IPV6_RECVTCLASS 35 /* bool; recv traffic class values */ -#define IPV6_TCLASS 36 /* int; send traffic class value */ - -#ifdef __APPLE_USE_RFC_3542 -/* new socket options introduced in RFC3542 */ -/* - * ip6_dest; send dst option before rthdr - * APPLE: Value purposely different than FreeBSD (35) to avoid - * collision with definition of IPV6_RECVTCLASS in previous - * darwin implementations - */ -#define IPV6_RTHDRDSTOPTS 57 - -/* - * bool; recv if, dst addr - * APPLE: Value purposely different than FreeBSD(36) to avoid - * collision with definition of IPV6_TCLASS in previous - * darwin implementations - */ -#define IPV6_RECVPKTINFO 61 - -#define IPV6_RECVHOPLIMIT 37 /* bool; recv hop limit */ -#define IPV6_RECVRTHDR 38 /* bool; recv routing header */ -#define IPV6_RECVHOPOPTS 39 /* bool; recv hop-by-hop option */ -#define IPV6_RECVDSTOPTS 40 /* bool; recv dst option after rthdr */ - -#define IPV6_USE_MIN_MTU 42 /* bool; send packets at the minimum MTU */ -#define IPV6_RECVPATHMTU 43 /* bool; notify an according MTU */ - -/* - * mtuinfo; get the current path MTU (sopt), 4 bytes int; - * MTU notification (cmsg) - */ -#define IPV6_PATHMTU 44 - -#if 0 /* obsoleted during 2292bis -> 3542 */ -/* no data; ND reachability confirm (cmsg only/not in of RFC3542) */ -#define IPV6_REACHCONF 45 -#endif -/* more new socket options introduced in RFC3542 */ -#define IPV6_3542PKTINFO 46 /* in6_pktinfo; send if, src addr */ -#define IPV6_3542HOPLIMIT 47 /* int; send hop limit */ -#define IPV6_3542NEXTHOP 48 /* sockaddr; next hop addr */ -#define IPV6_3542HOPOPTS 49 /* ip6_hbh; send hop-by-hop option */ -#define IPV6_3542DSTOPTS 50 /* ip6_dest; send dst option befor rthdr */ -#define IPV6_3542RTHDR 51 /* ip6_rthdr; send routing header */ - -#define IPV6_PKTINFO IPV6_3542PKTINFO -#define IPV6_HOPLIMIT IPV6_3542HOPLIMIT -#define IPV6_NEXTHOP IPV6_3542NEXTHOP -#define IPV6_HOPOPTS IPV6_3542HOPOPTS -#define IPV6_DSTOPTS IPV6_3542DSTOPTS -#define IPV6_RTHDR IPV6_3542RTHDR - -#define IPV6_AUTOFLOWLABEL 59 /* bool; attach flowlabel automagically */ - -#define IPV6_DONTFRAG 62 /* bool; disable IPv6 fragmentation */ - -/* int; prefer temporary addresses as the source address. */ -#define IPV6_PREFER_TEMPADDR 63 - -/* - * The following option is private; do not use it from user applications. - * It is deliberately defined to the same value as IP_MSFILTER. - */ -#define IPV6_MSFILTER 74 /* struct __msfilterreq; */ -#endif /* __APPLE_USE_RFC_3542 */ - -#define IPV6_BOUND_IF 125 /* int; set/get bound interface */ - - -/* to define items, should talk with KAME guys first, for *BSD compatibility */ - -#define IPV6_RTHDR_LOOSE 0 /* this hop need not be a neighbor. */ -#define IPV6_RTHDR_STRICT 1 /* this hop must be a neighbor. */ -#define IPV6_RTHDR_TYPE_0 0 /* IPv6 routing header type 0 */ - -/* - * Defaults and limits for options - */ -#define IPV6_DEFAULT_MULTICAST_HOPS 1 /* normally limit m'casts to 1 hop */ -#define IPV6_DEFAULT_MULTICAST_LOOP 1 /* normally hear sends if a member */ - -/* - * The im6o_membership vector for each socket is now dynamically allocated at - * run-time, bounded by USHRT_MAX, and is reallocated when needed, sized - * according to a power-of-two increment. - */ -#define IPV6_MIN_MEMBERSHIPS 31 -#define IPV6_MAX_MEMBERSHIPS 4095 - -/* - * Default resource limits for IPv6 multicast source filtering. - * These may be modified by sysctl. - */ -#define IPV6_MAX_GROUP_SRC_FILTER 512 /* sources per group */ -#define IPV6_MAX_SOCK_SRC_FILTER 128 /* sources per socket/group */ - -/* - * Argument structure for IPV6_JOIN_GROUP and IPV6_LEAVE_GROUP. - */ -struct ipv6_mreq { - struct in6_addr ipv6mr_multiaddr; - unsigned int ipv6mr_interface; -}; - -/* - * IPV6_2292PKTINFO: Packet information(RFC2292 sec 5) - */ -struct in6_pktinfo { - struct in6_addr ipi6_addr; /* src/dst IPv6 address */ - unsigned int ipi6_ifindex; /* send/recv interface index */ -}; - -/* - * Control structure for IPV6_RECVPATHMTU socket option. - */ -struct ip6_mtuinfo { - struct sockaddr_in6 ip6m_addr; /* or sockaddr_storage? */ - uint32_t ip6m_mtu; -}; - -/* - * Argument for IPV6_PORTRANGE: - * - which range to search when port is unspecified at bind() or connect() - */ -#define IPV6_PORTRANGE_DEFAULT 0 /* default range */ -#define IPV6_PORTRANGE_HIGH 1 /* "high" - request firewall bypass */ -#define IPV6_PORTRANGE_LOW 2 /* "low" - vouchsafe security */ - -/* - * Definitions for inet6 sysctl operations. - * - * Third level is protocol number. - * Fourth level is desired variable within that protocol. - */ -#define IPV6PROTO_MAXID (IPPROTO_PIM + 1) /* don't list to IPV6PROTO_MAX */ - -/* - * Names for IP sysctl objects - */ -#define IPV6CTL_FORWARDING 1 /* act as router */ -#define IPV6CTL_SENDREDIRECTS 2 /* may send redirects when forwarding */ -#define IPV6CTL_DEFHLIM 3 /* default Hop-Limit */ -#ifdef notyet -#define IPV6CTL_DEFMTU 4 /* default MTU */ -#endif -#define IPV6CTL_FORWSRCRT 5 /* forward source-routed dgrams */ -#define IPV6CTL_STATS 6 /* stats */ -#define IPV6CTL_MRTSTATS 7 /* multicast forwarding stats */ -#define IPV6CTL_MRTPROTO 8 /* multicast routing protocol */ -#define IPV6CTL_MAXFRAGPACKETS 9 /* max packets reassembly queue */ -#define IPV6CTL_SOURCECHECK 10 /* verify source route and intf */ -#define IPV6CTL_SOURCECHECK_LOGINT 11 /* minimume logging interval */ -#define IPV6CTL_ACCEPT_RTADV 12 -#define IPV6CTL_KEEPFAITH 13 /* deprecated */ -#define IPV6CTL_LOG_INTERVAL 14 -#define IPV6CTL_HDRNESTLIMIT 15 -#define IPV6CTL_DAD_COUNT 16 -#define IPV6CTL_AUTO_FLOWLABEL 17 -#define IPV6CTL_DEFMCASTHLIM 18 -#define IPV6CTL_GIF_HLIM 19 /* default HLIM for gif encap packet */ -#define IPV6CTL_KAME_VERSION 20 -#define IPV6CTL_USE_DEPRECATED 21 /* use deprec addr (RFC2462 5.5.4) */ -#define IPV6CTL_RR_PRUNE 22 /* walk timer for router renumbering */ -#if 0 /* obsolete */ -#define IPV6CTL_MAPPED_ADDR 23 -#endif -#define IPV6CTL_V6ONLY 24 -#define IPV6CTL_RTEXPIRE 25 /* cloned route expiration time */ -#define IPV6CTL_RTMINEXPIRE 26 /* min value for expiration time */ -#define IPV6CTL_RTMAXCACHE 27 /* trigger level for dynamic expire */ - -#define IPV6CTL_USETEMPADDR 32 /* use temporary addresses [RFC 4941] */ -#define IPV6CTL_TEMPPLTIME 33 /* preferred lifetime for tmpaddrs */ -#define IPV6CTL_TEMPVLTIME 34 /* valid lifetime for tmpaddrs */ -#define IPV6CTL_AUTO_LINKLOCAL 35 /* automatic link-local addr assign */ -#define IPV6CTL_RIP6STATS 36 /* raw_ip6 stats */ -#define IPV6CTL_PREFER_TEMPADDR 37 /* prefer temporary addr as src */ -#define IPV6CTL_ADDRCTLPOLICY 38 /* get/set address selection policy */ -#define IPV6CTL_USE_DEFAULTZONE 39 /* use default scope zone */ - -#define IPV6CTL_MAXFRAGS 41 /* max fragments */ -#define IPV6CTL_MCAST_PMTU 44 /* enable pMTU discovery for mcast? */ - -#define IPV6CTL_NEIGHBORGCTHRESH 46 -#define IPV6CTL_MAXIFPREFIXES 47 -#define IPV6CTL_MAXIFDEFROUTERS 48 -#define IPV6CTL_MAXDYNROUTES 49 -#define ICMPV6CTL_ND6_ONLINKNSRFC4861 50 - -/* New entries should be added here from current IPV6CTL_MAXID value. */ -/* to define items, should talk with KAME guys first, for *BSD compatibility */ -#define IPV6CTL_MAXID 51 - - - - - -__BEGIN_DECLS -struct cmsghdr; - -extern int inet6_option_space(int); -extern int inet6_option_init(void *, struct cmsghdr **, int); -extern int inet6_option_append(struct cmsghdr *, const __uint8_t *, int, int); -extern __uint8_t *inet6_option_alloc(struct cmsghdr *, int, int, int); -extern int inet6_option_next(const struct cmsghdr *, __uint8_t **); -extern int inet6_option_find(const struct cmsghdr *, __uint8_t **, int); - -extern size_t inet6_rthdr_space(int, int); -extern struct cmsghdr *inet6_rthdr_init(void *, int); -extern int inet6_rthdr_add(struct cmsghdr *, const struct in6_addr *, - unsigned int); -extern int inet6_rthdr_lasthop(struct cmsghdr *, unsigned int); -#if 0 /* not implemented yet */ -extern int inet6_rthdr_reverse(const struct cmsghdr *, struct cmsghdr *); -#endif -extern int inet6_rthdr_segments(const struct cmsghdr *); -extern struct in6_addr *inet6_rthdr_getaddr(struct cmsghdr *, int); -extern int inet6_rthdr_getflags(const struct cmsghdr *, int); - -extern int inet6_opt_init(void *, socklen_t); -extern int inet6_opt_append(void *, socklen_t, int, __uint8_t, socklen_t, - __uint8_t, void **); -extern int inet6_opt_finish(void *, socklen_t, int); -extern int inet6_opt_set_val(void *, int, void *, socklen_t); - -extern int inet6_opt_next(void *, socklen_t, int, __uint8_t *, socklen_t *, - void **); -extern int inet6_opt_find(void *, socklen_t, int, __uint8_t, socklen_t *, - void **); -extern int inet6_opt_get_val(void *, int, void *, socklen_t); -extern socklen_t inet6_rth_space(int, int); -extern void *inet6_rth_init(void *, socklen_t, int, int); -extern int inet6_rth_add(void *, const struct in6_addr *); -extern int inet6_rth_reverse(const void *, void *); -extern int inet6_rth_segments(const void *); -extern struct in6_addr *inet6_rth_getaddr(const void *, int); - -__END_DECLS -#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ -#endif /* !_NETINET6_IN6_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/objc/objc-api.h b/lib/libc/include/x86_64-macos-gnu/objc/objc-api.h deleted file mode 100644 index 504fee6113..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/objc/objc-api.h +++ /dev/null @@ -1,280 +0,0 @@ -/* - * Copyright (c) 1999-2006 Apple Inc. All Rights Reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ -// Copyright 1988-1996 NeXT Software, Inc. - -#ifndef _OBJC_OBJC_API_H_ -#define _OBJC_OBJC_API_H_ - -#include -#include -#include -#include - -#ifndef __has_feature -# define __has_feature(x) 0 -#endif - -#ifndef __has_extension -# define __has_extension __has_feature -#endif - -#ifndef __has_attribute -# define __has_attribute(x) 0 -#endif - -#if !__has_feature(nullability) -# ifndef _Nullable -# define _Nullable -# endif -# ifndef _Nonnull -# define _Nonnull -# endif -# ifndef _Null_unspecified -# define _Null_unspecified -# endif -#endif - - - -/* - * OBJC_API_VERSION 0 or undef: Tiger and earlier API only - * OBJC_API_VERSION 2: Leopard and later API available - */ -#if !defined(OBJC_API_VERSION) -# if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_5 -# define OBJC_API_VERSION 0 -# else -# define OBJC_API_VERSION 2 -# endif -#endif - - -/* - * OBJC_NO_GC 1: GC is not supported - * OBJC_NO_GC undef: GC is supported. This SDK no longer supports this mode. - * - * OBJC_NO_GC_API undef: Libraries must export any symbols that - * dual-mode code may links to. - * OBJC_NO_GC_API 1: Libraries need not export GC-related symbols. - */ -#if defined(__OBJC_GC__) -# error Objective-C garbage collection is not supported. -#elif TARGET_OS_OSX - /* GC is unsupported. GC API symbols are exported. */ -# define OBJC_NO_GC 1 -# undef OBJC_NO_GC_API -#else - /* GC is unsupported. GC API symbols are not exported. */ -# define OBJC_NO_GC 1 -# define OBJC_NO_GC_API 1 -#endif - - -/* NS_ENFORCE_NSOBJECT_DESIGNATED_INITIALIZER == 1 - * marks -[NSObject init] as a designated initializer. */ -#if !defined(NS_ENFORCE_NSOBJECT_DESIGNATED_INITIALIZER) -# define NS_ENFORCE_NSOBJECT_DESIGNATED_INITIALIZER 1 -#endif - - -/* OBJC_OLD_DISPATCH_PROTOTYPES == 0 enforces the rule that the dispatch - * functions must be cast to an appropriate function pointer type. */ -#if !defined(OBJC_OLD_DISPATCH_PROTOTYPES) -# if __swift__ - // Existing Swift code expects IMP to be Comparable. - // Variadic IMP is comparable via OpaquePointer; non-variadic IMP isn't. -# define OBJC_OLD_DISPATCH_PROTOTYPES 1 -# else -# define OBJC_OLD_DISPATCH_PROTOTYPES 0 -# endif -#endif - - -/* OBJC_AVAILABLE: shorthand for all-OS availability */ - -# if !defined(OBJC_AVAILABLE) -# define OBJC_AVAILABLE(x, i, t, w, b) \ - __OSX_AVAILABLE(x) __IOS_AVAILABLE(i) __TVOS_AVAILABLE(t) \ - __WATCHOS_AVAILABLE(w) -# endif - - - -/* OBJC_OSX_DEPRECATED_OTHERS_UNAVAILABLE: Deprecated on OS X, - * unavailable everywhere else. */ - -# if !defined(OBJC_OSX_DEPRECATED_OTHERS_UNAVAILABLE) -# define OBJC_OSX_DEPRECATED_OTHERS_UNAVAILABLE(_start, _dep, _msg) \ - __OSX_DEPRECATED(_start, _dep, _msg) \ - __IOS_UNAVAILABLE __TVOS_UNAVAILABLE \ - __WATCHOS_UNAVAILABLE -# endif - - - -/* OBJC_OSX_AVAILABLE_OTHERS_UNAVAILABLE: Available on OS X, - * unavailable everywhere else. */ - -# if !defined(OBJC_OSX_AVAILABLE_OTHERS_UNAVAILABLE) -# define OBJC_OSX_AVAILABLE_OTHERS_UNAVAILABLE(vers) \ - __OSX_AVAILABLE(vers) \ - __IOS_UNAVAILABLE __TVOS_UNAVAILABLE \ - __WATCHOS_UNAVAILABLE -# endif - - - -/* OBJC_ISA_AVAILABILITY: `isa` will be deprecated or unavailable - * in the future */ -#if !defined(OBJC_ISA_AVAILABILITY) -# if __OBJC2__ -# define OBJC_ISA_AVAILABILITY __attribute__((deprecated)) -# else -# define OBJC_ISA_AVAILABILITY /* still available */ -# endif -#endif - - -/* OBJC2_UNAVAILABLE: unavailable in objc 2.0, deprecated in Leopard */ -#if !defined(OBJC2_UNAVAILABLE) -# if __OBJC2__ -# define OBJC2_UNAVAILABLE UNAVAILABLE_ATTRIBUTE -# else - /* plain C code also falls here, but this is close enough */ -# define OBJC2_UNAVAILABLE \ - __OSX_DEPRECATED(10.5, 10.5, "not available in __OBJC2__") \ - __IOS_DEPRECATED(2.0, 2.0, "not available in __OBJC2__") \ - __TVOS_UNAVAILABLE __WATCHOS_UNAVAILABLE -# endif -#endif - -/* OBJC_UNAVAILABLE: unavailable, with a message where supported */ -#if !defined(OBJC_UNAVAILABLE) -# if __has_extension(attribute_unavailable_with_message) -# define OBJC_UNAVAILABLE(_msg) __attribute__((unavailable(_msg))) -# else -# define OBJC_UNAVAILABLE(_msg) __attribute__((unavailable)) -# endif -#endif - -/* OBJC_DEPRECATED: deprecated, with a message where supported */ -#if !defined(OBJC_DEPRECATED) -# if __has_extension(attribute_deprecated_with_message) -# define OBJC_DEPRECATED(_msg) __attribute__((deprecated(_msg))) -# else -# define OBJC_DEPRECATED(_msg) __attribute__((deprecated)) -# endif -#endif - -/* OBJC_ARC_UNAVAILABLE: unavailable with -fobjc-arc */ -#if !defined(OBJC_ARC_UNAVAILABLE) -# if __has_feature(objc_arc) -# define OBJC_ARC_UNAVAILABLE OBJC_UNAVAILABLE("not available in automatic reference counting mode") -# else -# define OBJC_ARC_UNAVAILABLE -# endif -#endif - -/* OBJC_SWIFT_UNAVAILABLE: unavailable in Swift */ -#if !defined(OBJC_SWIFT_UNAVAILABLE) -# if __has_feature(attribute_availability_swift) -# define OBJC_SWIFT_UNAVAILABLE(_msg) __attribute__((availability(swift, unavailable, message=_msg))) -# else -# define OBJC_SWIFT_UNAVAILABLE(_msg) -# endif -#endif - -/* OBJC_ARM64_UNAVAILABLE: unavailable on arm64 (i.e. stret dispatch) */ -#if !defined(OBJC_ARM64_UNAVAILABLE) -# if defined(__arm64__) -# define OBJC_ARM64_UNAVAILABLE OBJC_UNAVAILABLE("not available in arm64") -# else -# define OBJC_ARM64_UNAVAILABLE -# endif -#endif - -/* OBJC_GC_UNAVAILABLE: unavailable with -fobjc-gc or -fobjc-gc-only */ -#if !defined(OBJC_GC_UNAVAILABLE) -# define OBJC_GC_UNAVAILABLE -#endif - -#if !defined(OBJC_EXTERN) -# if defined(__cplusplus) -# define OBJC_EXTERN extern "C" -# else -# define OBJC_EXTERN extern -# endif -#endif - -#if !defined(OBJC_VISIBLE) - -# define OBJC_VISIBLE __attribute__((visibility("default"))) - -#endif - -#if !defined(OBJC_EXPORT) -# define OBJC_EXPORT OBJC_EXTERN OBJC_VISIBLE -#endif - -#if !defined(OBJC_IMPORT) -# define OBJC_IMPORT extern -#endif - -#if !defined(OBJC_ROOT_CLASS) -# if __has_attribute(objc_root_class) -# define OBJC_ROOT_CLASS __attribute__((objc_root_class)) -# else -# define OBJC_ROOT_CLASS -# endif -#endif - -#ifndef __DARWIN_NULL -#define __DARWIN_NULL NULL -#endif - -#if !defined(OBJC_INLINE) -# define OBJC_INLINE __inline -#endif - -// Declares an enum type or option bits type as appropriate for each language. -#if (__cplusplus && __cplusplus >= 201103L && (__has_extension(cxx_strong_enums) || __has_feature(objc_fixed_enum))) || (!__cplusplus && __has_feature(objc_fixed_enum)) -#define OBJC_ENUM(_type, _name) enum _name : _type _name; enum _name : _type -#if (__cplusplus) -#define OBJC_OPTIONS(_type, _name) _type _name; enum : _type -#else -#define OBJC_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type -#endif -#else -#define OBJC_ENUM(_type, _name) _type _name; enum -#define OBJC_OPTIONS(_type, _name) _type _name; enum -#endif - -#if !defined(OBJC_RETURNS_RETAINED) -# if __OBJC__ && __has_attribute(ns_returns_retained) -# define OBJC_RETURNS_RETAINED __attribute__((ns_returns_retained)) -# else -# define OBJC_RETURNS_RETAINED -# endif -#endif - -#endif \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/objc/runtime.h b/lib/libc/include/x86_64-macos-gnu/objc/runtime.h deleted file mode 100644 index 0b49b72559..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/objc/runtime.h +++ /dev/null @@ -1,2169 +0,0 @@ -/* - * Copyright (c) 1999-2007 Apple Inc. All Rights Reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - -#ifndef _OBJC_RUNTIME_H -#define _OBJC_RUNTIME_H - -#include -#include -#include -#include -#include -#include - -#if TARGET_OS_MAC -#include -#endif - - -/* Types */ - -#if !OBJC_TYPES_DEFINED - -/// An opaque type that represents a method in a class definition. -typedef struct objc_method *Method; - -/// An opaque type that represents an instance variable. -typedef struct objc_ivar *Ivar; - -/// An opaque type that represents a category. -typedef struct objc_category *Category; - -/// An opaque type that represents an Objective-C declared property. -typedef struct objc_property *objc_property_t; - -struct objc_class { - Class _Nonnull isa OBJC_ISA_AVAILABILITY; - -#if !__OBJC2__ - Class _Nullable super_class OBJC2_UNAVAILABLE; - const char * _Nonnull name OBJC2_UNAVAILABLE; - long version OBJC2_UNAVAILABLE; - long info OBJC2_UNAVAILABLE; - long instance_size OBJC2_UNAVAILABLE; - struct objc_ivar_list * _Nullable ivars OBJC2_UNAVAILABLE; - struct objc_method_list * _Nullable * _Nullable methodLists OBJC2_UNAVAILABLE; - struct objc_cache * _Nonnull cache OBJC2_UNAVAILABLE; - struct objc_protocol_list * _Nullable protocols OBJC2_UNAVAILABLE; -#endif - -} OBJC2_UNAVAILABLE; -/* Use `Class` instead of `struct objc_class *` */ - -#endif - -#ifdef __OBJC__ -@class Protocol; -#else -typedef struct objc_object Protocol; -#endif - -/// Defines a method -struct objc_method_description { - SEL _Nullable name; /**< The name of the method */ - char * _Nullable types; /**< The types of the method arguments */ -}; - -/// Defines a property attribute -typedef struct { - const char * _Nonnull name; /**< The name of the attribute */ - const char * _Nonnull value; /**< The value of the attribute (usually empty) */ -} objc_property_attribute_t; - - -/* Functions */ - -/* Working with Instances */ - -/** - * Returns a copy of a given object. - * - * @param obj An Objective-C object. - * @param size The size of the object \e obj. - * - * @return A copy of \e obj. - */ -OBJC_EXPORT id _Nullable object_copy(id _Nullable obj, size_t size) - OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0) - OBJC_ARC_UNAVAILABLE; - -/** - * Frees the memory occupied by a given object. - * - * @param obj An Objective-C object. - * - * @return nil - */ -OBJC_EXPORT id _Nullable -object_dispose(id _Nullable obj) - OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0) - OBJC_ARC_UNAVAILABLE; - -/** - * Returns the class of an object. - * - * @param obj The object you want to inspect. - * - * @return The class object of which \e object is an instance, - * or \c Nil if \e object is \c nil. - */ -OBJC_EXPORT Class _Nullable -object_getClass(id _Nullable obj) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Sets the class of an object. - * - * @param obj The object to modify. - * @param cls A class object. - * - * @return The previous value of \e object's class, or \c Nil if \e object is \c nil. - */ -OBJC_EXPORT Class _Nullable -object_setClass(id _Nullable obj, Class _Nonnull cls) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - - -/** - * Returns whether an object is a class object. - * - * @param obj An Objective-C object. - * - * @return true if the object is a class or metaclass, false otherwise. - */ -OBJC_EXPORT BOOL -object_isClass(id _Nullable obj) - OBJC_AVAILABLE(10.10, 8.0, 9.0, 1.0, 2.0); - - -/** - * Reads the value of an instance variable in an object. - * - * @param obj The object containing the instance variable whose value you want to read. - * @param ivar The Ivar describing the instance variable whose value you want to read. - * - * @return The value of the instance variable specified by \e ivar, or \c nil if \e object is \c nil. - * - * @note \c object_getIvar is faster than \c object_getInstanceVariable if the Ivar - * for the instance variable is already known. - */ -OBJC_EXPORT id _Nullable -object_getIvar(id _Nullable obj, Ivar _Nonnull ivar) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Sets the value of an instance variable in an object. - * - * @param obj The object containing the instance variable whose value you want to set. - * @param ivar The Ivar describing the instance variable whose value you want to set. - * @param value The new value for the instance variable. - * - * @note Instance variables with known memory management (such as ARC strong and weak) - * use that memory management. Instance variables with unknown memory management - * are assigned as if they were unsafe_unretained. - * @note \c object_setIvar is faster than \c object_setInstanceVariable if the Ivar - * for the instance variable is already known. - */ -OBJC_EXPORT void -object_setIvar(id _Nullable obj, Ivar _Nonnull ivar, id _Nullable value) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Sets the value of an instance variable in an object. - * - * @param obj The object containing the instance variable whose value you want to set. - * @param ivar The Ivar describing the instance variable whose value you want to set. - * @param value The new value for the instance variable. - * - * @note Instance variables with known memory management (such as ARC strong and weak) - * use that memory management. Instance variables with unknown memory management - * are assigned as if they were strong. - * @note \c object_setIvar is faster than \c object_setInstanceVariable if the Ivar - * for the instance variable is already known. - */ -OBJC_EXPORT void -object_setIvarWithStrongDefault(id _Nullable obj, Ivar _Nonnull ivar, - id _Nullable value) - OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0, 2.0); - -/** - * Changes the value of an instance variable of a class instance. - * - * @param obj A pointer to an instance of a class. Pass the object containing - * the instance variable whose value you wish to modify. - * @param name A C string. Pass the name of the instance variable whose value you wish to modify. - * @param value The new value for the instance variable. - * - * @return A pointer to the \c Ivar data structure that defines the type and - * name of the instance variable specified by \e name. - * - * @note Instance variables with known memory management (such as ARC strong and weak) - * use that memory management. Instance variables with unknown memory management - * are assigned as if they were unsafe_unretained. - */ -OBJC_EXPORT Ivar _Nullable -object_setInstanceVariable(id _Nullable obj, const char * _Nonnull name, - void * _Nullable value) - OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0) - OBJC_ARC_UNAVAILABLE; - -/** - * Changes the value of an instance variable of a class instance. - * - * @param obj A pointer to an instance of a class. Pass the object containing - * the instance variable whose value you wish to modify. - * @param name A C string. Pass the name of the instance variable whose value you wish to modify. - * @param value The new value for the instance variable. - * - * @return A pointer to the \c Ivar data structure that defines the type and - * name of the instance variable specified by \e name. - * - * @note Instance variables with known memory management (such as ARC strong and weak) - * use that memory management. Instance variables with unknown memory management - * are assigned as if they were strong. - */ -OBJC_EXPORT Ivar _Nullable -object_setInstanceVariableWithStrongDefault(id _Nullable obj, - const char * _Nonnull name, - void * _Nullable value) - OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0, 2.0) - OBJC_ARC_UNAVAILABLE; - -/** - * Obtains the value of an instance variable of a class instance. - * - * @param obj A pointer to an instance of a class. Pass the object containing - * the instance variable whose value you wish to obtain. - * @param name A C string. Pass the name of the instance variable whose value you wish to obtain. - * @param outValue On return, contains a pointer to the value of the instance variable. - * - * @return A pointer to the \c Ivar data structure that defines the type and name of - * the instance variable specified by \e name. - */ -OBJC_EXPORT Ivar _Nullable -object_getInstanceVariable(id _Nullable obj, const char * _Nonnull name, - void * _Nullable * _Nullable outValue) - OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0) - OBJC_ARC_UNAVAILABLE; - - -/* Obtaining Class Definitions */ - -/** - * Returns the class definition of a specified class. - * - * @param name The name of the class to look up. - * - * @return The Class object for the named class, or \c nil - * if the class is not registered with the Objective-C runtime. - * - * @note \c objc_getClass is different from \c objc_lookUpClass in that if the class - * is not registered, \c objc_getClass calls the class handler callback and then checks - * a second time to see whether the class is registered. \c objc_lookUpClass does - * not call the class handler callback. - * - * @warning Earlier implementations of this function (prior to OS X v10.0) - * terminate the program if the class does not exist. - */ -OBJC_EXPORT Class _Nullable -objc_getClass(const char * _Nonnull name) - OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns the metaclass definition of a specified class. - * - * @param name The name of the class to look up. - * - * @return The \c Class object for the metaclass of the named class, or \c nil if the class - * is not registered with the Objective-C runtime. - * - * @note If the definition for the named class is not registered, this function calls the class handler - * callback and then checks a second time to see if the class is registered. However, every class - * definition must have a valid metaclass definition, and so the metaclass definition is always returned, - * whether it’s valid or not. - */ -OBJC_EXPORT Class _Nullable -objc_getMetaClass(const char * _Nonnull name) - OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns the class definition of a specified class. - * - * @param name The name of the class to look up. - * - * @return The Class object for the named class, or \c nil if the class - * is not registered with the Objective-C runtime. - * - * @note \c objc_getClass is different from this function in that if the class is not - * registered, \c objc_getClass calls the class handler callback and then checks a second - * time to see whether the class is registered. This function does not call the class handler callback. - */ -OBJC_EXPORT Class _Nullable -objc_lookUpClass(const char * _Nonnull name) - OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns the class definition of a specified class. - * - * @param name The name of the class to look up. - * - * @return The Class object for the named class. - * - * @note This function is the same as \c objc_getClass, but kills the process if the class is not found. - * @note This function is used by ZeroLink, where failing to find a class would be a compile-time link error without ZeroLink. - */ -OBJC_EXPORT Class _Nonnull -objc_getRequiredClass(const char * _Nonnull name) - OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); - -/** - * Obtains the list of registered class definitions. - * - * @param buffer An array of \c Class values. On output, each \c Class value points to - * one class definition, up to either \e bufferCount or the total number of registered classes, - * whichever is less. You can pass \c NULL to obtain the total number of registered class - * definitions without actually retrieving any class definitions. - * @param bufferCount An integer value. Pass the number of pointers for which you have allocated space - * in \e buffer. On return, this function fills in only this number of elements. If this number is less - * than the number of registered classes, this function returns an arbitrary subset of the registered classes. - * - * @return An integer value indicating the total number of registered classes. - * - * @note The Objective-C runtime library automatically registers all the classes defined in your source code. - * You can create class definitions at runtime and register them with the \c objc_addClass function. - * - * @warning You cannot assume that class objects you get from this function are classes that inherit from \c NSObject, - * so you cannot safely call any methods on such classes without detecting that the method is implemented first. - */ -OBJC_EXPORT int -objc_getClassList(Class _Nonnull * _Nullable buffer, int bufferCount) - OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); - -/** - * Creates and returns a list of pointers to all registered class definitions. - * - * @param outCount An integer pointer used to store the number of classes returned by - * this function in the list. It can be \c nil. - * - * @return A nil terminated array of classes. It must be freed with \c free(). - * - * @see objc_getClassList - */ -OBJC_EXPORT Class _Nonnull * _Nullable -objc_copyClassList(unsigned int * _Nullable outCount) - OBJC_AVAILABLE(10.7, 3.1, 9.0, 1.0, 2.0); - - -/* Working with Classes */ - -/** - * Returns the name of a class. - * - * @param cls A class object. - * - * @return The name of the class, or the empty string if \e cls is \c Nil. - */ -OBJC_EXPORT const char * _Nonnull -class_getName(Class _Nullable cls) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns a Boolean value that indicates whether a class object is a metaclass. - * - * @param cls A class object. - * - * @return \c YES if \e cls is a metaclass, \c NO if \e cls is a non-meta class, - * \c NO if \e cls is \c Nil. - */ -OBJC_EXPORT BOOL -class_isMetaClass(Class _Nullable cls) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns the superclass of a class. - * - * @param cls A class object. - * - * @return The superclass of the class, or \c Nil if - * \e cls is a root class, or \c Nil if \e cls is \c Nil. - * - * @note You should usually use \c NSObject's \c superclass method instead of this function. - */ -OBJC_EXPORT Class _Nullable -class_getSuperclass(Class _Nullable cls) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Sets the superclass of a given class. - * - * @param cls The class whose superclass you want to set. - * @param newSuper The new superclass for cls. - * - * @return The old superclass for cls. - * - * @warning You should not use this function. - */ -OBJC_EXPORT Class _Nonnull -class_setSuperclass(Class _Nonnull cls, Class _Nonnull newSuper) - __OSX_DEPRECATED(10.5, 10.5, "not recommended") - __IOS_DEPRECATED(2.0, 2.0, "not recommended") - __TVOS_DEPRECATED(9.0, 9.0, "not recommended") - __WATCHOS_DEPRECATED(1.0, 1.0, "not recommended") - -; - -/** - * Returns the version number of a class definition. - * - * @param cls A pointer to a \c Class data structure. Pass - * the class definition for which you wish to obtain the version. - * - * @return An integer indicating the version number of the class definition. - * - * @see class_setVersion - */ -OBJC_EXPORT int -class_getVersion(Class _Nullable cls) - OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); - -/** - * Sets the version number of a class definition. - * - * @param cls A pointer to an Class data structure. - * Pass the class definition for which you wish to set the version. - * @param version An integer. Pass the new version number of the class definition. - * - * @note You can use the version number of the class definition to provide versioning of the - * interface that your class represents to other classes. This is especially useful for object - * serialization (that is, archiving of the object in a flattened form), where it is important to - * recognize changes to the layout of the instance variables in different class-definition versions. - * @note Classes derived from the Foundation framework \c NSObject class can set the class-definition - * version number using the \c setVersion: class method, which is implemented using the \c class_setVersion function. - */ -OBJC_EXPORT void -class_setVersion(Class _Nullable cls, int version) - OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns the size of instances of a class. - * - * @param cls A class object. - * - * @return The size in bytes of instances of the class \e cls, or \c 0 if \e cls is \c Nil. - */ -OBJC_EXPORT size_t -class_getInstanceSize(Class _Nullable cls) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns the \c Ivar for a specified instance variable of a given class. - * - * @param cls The class whose instance variable you wish to obtain. - * @param name The name of the instance variable definition to obtain. - * - * @return A pointer to an \c Ivar data structure containing information about - * the instance variable specified by \e name. - */ -OBJC_EXPORT Ivar _Nullable -class_getInstanceVariable(Class _Nullable cls, const char * _Nonnull name) - OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns the Ivar for a specified class variable of a given class. - * - * @param cls The class definition whose class variable you wish to obtain. - * @param name The name of the class variable definition to obtain. - * - * @return A pointer to an \c Ivar data structure containing information about the class variable specified by \e name. - */ -OBJC_EXPORT Ivar _Nullable -class_getClassVariable(Class _Nullable cls, const char * _Nonnull name) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Describes the instance variables declared by a class. - * - * @param cls The class to inspect. - * @param outCount On return, contains the length of the returned array. - * If outCount is NULL, the length is not returned. - * - * @return An array of pointers of type Ivar describing the instance variables declared by the class. - * Any instance variables declared by superclasses are not included. The array contains *outCount - * pointers followed by a NULL terminator. You must free the array with free(). - * - * If the class declares no instance variables, or cls is Nil, NULL is returned and *outCount is 0. - */ -OBJC_EXPORT Ivar _Nonnull * _Nullable -class_copyIvarList(Class _Nullable cls, unsigned int * _Nullable outCount) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns a specified instance method for a given class. - * - * @param cls The class you want to inspect. - * @param name The selector of the method you want to retrieve. - * - * @return The method that corresponds to the implementation of the selector specified by - * \e name for the class specified by \e cls, or \c NULL if the specified class or its - * superclasses do not contain an instance method with the specified selector. - * - * @note This function searches superclasses for implementations, whereas \c class_copyMethodList does not. - */ -OBJC_EXPORT Method _Nullable -class_getInstanceMethod(Class _Nullable cls, SEL _Nonnull name) - OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns a pointer to the data structure describing a given class method for a given class. - * - * @param cls A pointer to a class definition. Pass the class that contains the method you want to retrieve. - * @param name A pointer of type \c SEL. Pass the selector of the method you want to retrieve. - * - * @return A pointer to the \c Method data structure that corresponds to the implementation of the - * selector specified by aSelector for the class specified by aClass, or NULL if the specified - * class or its superclasses do not contain an instance method with the specified selector. - * - * @note Note that this function searches superclasses for implementations, - * whereas \c class_copyMethodList does not. - */ -OBJC_EXPORT Method _Nullable -class_getClassMethod(Class _Nullable cls, SEL _Nonnull name) - OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns the function pointer that would be called if a - * particular message were sent to an instance of a class. - * - * @param cls The class you want to inspect. - * @param name A selector. - * - * @return The function pointer that would be called if \c [object name] were called - * with an instance of the class, or \c NULL if \e cls is \c Nil. - * - * @note \c class_getMethodImplementation may be faster than \c method_getImplementation(class_getInstanceMethod(cls, name)). - * @note The function pointer returned may be a function internal to the runtime instead of - * an actual method implementation. For example, if instances of the class do not respond to - * the selector, the function pointer returned will be part of the runtime's message forwarding machinery. - */ -OBJC_EXPORT IMP _Nullable -class_getMethodImplementation(Class _Nullable cls, SEL _Nonnull name) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns the function pointer that would be called if a particular - * message were sent to an instance of a class. - * - * @param cls The class you want to inspect. - * @param name A selector. - * - * @return The function pointer that would be called if \c [object name] were called - * with an instance of the class, or \c NULL if \e cls is \c Nil. - */ -OBJC_EXPORT IMP _Nullable -class_getMethodImplementation_stret(Class _Nullable cls, SEL _Nonnull name) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0) - OBJC_ARM64_UNAVAILABLE; - -/** - * Returns a Boolean value that indicates whether instances of a class respond to a particular selector. - * - * @param cls The class you want to inspect. - * @param sel A selector. - * - * @return \c YES if instances of the class respond to the selector, otherwise \c NO. - * - * @note You should usually use \c NSObject's \c respondsToSelector: or \c instancesRespondToSelector: - * methods instead of this function. - */ -OBJC_EXPORT BOOL -class_respondsToSelector(Class _Nullable cls, SEL _Nonnull sel) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Describes the instance methods implemented by a class. - * - * @param cls The class you want to inspect. - * @param outCount On return, contains the length of the returned array. - * If outCount is NULL, the length is not returned. - * - * @return An array of pointers of type Method describing the instance methods - * implemented by the class—any instance methods implemented by superclasses are not included. - * The array contains *outCount pointers followed by a NULL terminator. You must free the array with free(). - * - * If cls implements no instance methods, or cls is Nil, returns NULL and *outCount is 0. - * - * @note To get the class methods of a class, use \c class_copyMethodList(object_getClass(cls), &count). - * @note To get the implementations of methods that may be implemented by superclasses, - * use \c class_getInstanceMethod or \c class_getClassMethod. - */ -OBJC_EXPORT Method _Nonnull * _Nullable -class_copyMethodList(Class _Nullable cls, unsigned int * _Nullable outCount) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns a Boolean value that indicates whether a class conforms to a given protocol. - * - * @param cls The class you want to inspect. - * @param protocol A protocol. - * - * @return YES if cls conforms to protocol, otherwise NO. - * - * @note You should usually use NSObject's conformsToProtocol: method instead of this function. - */ -OBJC_EXPORT BOOL -class_conformsToProtocol(Class _Nullable cls, Protocol * _Nullable protocol) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Describes the protocols adopted by a class. - * - * @param cls The class you want to inspect. - * @param outCount On return, contains the length of the returned array. - * If outCount is NULL, the length is not returned. - * - * @return An array of pointers of type Protocol* describing the protocols adopted - * by the class. Any protocols adopted by superclasses or other protocols are not included. - * The array contains *outCount pointers followed by a NULL terminator. You must free the array with free(). - * - * If cls adopts no protocols, or cls is Nil, returns NULL and *outCount is 0. - */ -OBJC_EXPORT Protocol * __unsafe_unretained _Nonnull * _Nullable -class_copyProtocolList(Class _Nullable cls, unsigned int * _Nullable outCount) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns a property with a given name of a given class. - * - * @param cls The class you want to inspect. - * @param name The name of the property you want to inspect. - * - * @return A pointer of type \c objc_property_t describing the property, or - * \c NULL if the class does not declare a property with that name, - * or \c NULL if \e cls is \c Nil. - */ -OBJC_EXPORT objc_property_t _Nullable -class_getProperty(Class _Nullable cls, const char * _Nonnull name) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Describes the properties declared by a class. - * - * @param cls The class you want to inspect. - * @param outCount On return, contains the length of the returned array. - * If \e outCount is \c NULL, the length is not returned. - * - * @return An array of pointers of type \c objc_property_t describing the properties - * declared by the class. Any properties declared by superclasses are not included. - * The array contains \c *outCount pointers followed by a \c NULL terminator. You must free the array with \c free(). - * - * If \e cls declares no properties, or \e cls is \c Nil, returns \c NULL and \c *outCount is \c 0. - */ -OBJC_EXPORT objc_property_t _Nonnull * _Nullable -class_copyPropertyList(Class _Nullable cls, unsigned int * _Nullable outCount) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns a description of the \c Ivar layout for a given class. - * - * @param cls The class to inspect. - * - * @return A description of the \c Ivar layout for \e cls. - */ -OBJC_EXPORT const uint8_t * _Nullable -class_getIvarLayout(Class _Nullable cls) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns a description of the layout of weak Ivars for a given class. - * - * @param cls The class to inspect. - * - * @return A description of the layout of the weak \c Ivars for \e cls. - */ -OBJC_EXPORT const uint8_t * _Nullable -class_getWeakIvarLayout(Class _Nullable cls) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Adds a new method to a class with a given name and implementation. - * - * @param cls The class to which to add a method. - * @param name A selector that specifies the name of the method being added. - * @param imp A function which is the implementation of the new method. The function must take at least two arguments—self and _cmd. - * @param types An array of characters that describe the types of the arguments to the method. - * - * @return YES if the method was added successfully, otherwise NO - * (for example, the class already contains a method implementation with that name). - * - * @note class_addMethod will add an override of a superclass's implementation, - * but will not replace an existing implementation in this class. - * To change an existing implementation, use method_setImplementation. - */ -OBJC_EXPORT BOOL -class_addMethod(Class _Nullable cls, SEL _Nonnull name, IMP _Nonnull imp, - const char * _Nullable types) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Replaces the implementation of a method for a given class. - * - * @param cls The class you want to modify. - * @param name A selector that identifies the method whose implementation you want to replace. - * @param imp The new implementation for the method identified by name for the class identified by cls. - * @param types An array of characters that describe the types of the arguments to the method. - * Since the function must take at least two arguments—self and _cmd, the second and third characters - * must be “@:” (the first character is the return type). - * - * @return The previous implementation of the method identified by \e name for the class identified by \e cls. - * - * @note This function behaves in two different ways: - * - If the method identified by \e name does not yet exist, it is added as if \c class_addMethod were called. - * The type encoding specified by \e types is used as given. - * - If the method identified by \e name does exist, its \c IMP is replaced as if \c method_setImplementation were called. - * The type encoding specified by \e types is ignored. - */ -OBJC_EXPORT IMP _Nullable -class_replaceMethod(Class _Nullable cls, SEL _Nonnull name, IMP _Nonnull imp, - const char * _Nullable types) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Adds a new instance variable to a class. - * - * @return YES if the instance variable was added successfully, otherwise NO - * (for example, the class already contains an instance variable with that name). - * - * @note This function may only be called after objc_allocateClassPair and before objc_registerClassPair. - * Adding an instance variable to an existing class is not supported. - * @note The class must not be a metaclass. Adding an instance variable to a metaclass is not supported. - * @note The instance variable's minimum alignment in bytes is 1< Type Encodings. - */ -OBJC_EXPORT const char * _Nullable -ivar_getTypeEncoding(Ivar _Nonnull v) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns the offset of an instance variable. - * - * @param v The instance variable you want to enquire about. - * - * @return The offset of \e v. - * - * @note For instance variables of type \c id or other object types, call \c object_getIvar - * and \c object_setIvar instead of using this offset to access the instance variable data directly. - */ -OBJC_EXPORT ptrdiff_t -ivar_getOffset(Ivar _Nonnull v) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - - -/* Working with Properties */ - -/** - * Returns the name of a property. - * - * @param property The property you want to inquire about. - * - * @return A C string containing the property's name. - */ -OBJC_EXPORT const char * _Nonnull -property_getName(objc_property_t _Nonnull property) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns the attribute string of a property. - * - * @param property A property. - * - * @return A C string containing the property's attributes. - * - * @note The format of the attribute string is described in Declared Properties in Objective-C Runtime Programming Guide. - */ -OBJC_EXPORT const char * _Nullable -property_getAttributes(objc_property_t _Nonnull property) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns an array of property attributes for a property. - * - * @param property The property whose attributes you want copied. - * @param outCount The number of attributes returned in the array. - * - * @return An array of property attributes; must be free'd() by the caller. - */ -OBJC_EXPORT objc_property_attribute_t * _Nullable -property_copyAttributeList(objc_property_t _Nonnull property, - unsigned int * _Nullable outCount) - OBJC_AVAILABLE(10.7, 4.3, 9.0, 1.0, 2.0); - -/** - * Returns the value of a property attribute given the attribute name. - * - * @param property The property whose attribute value you are interested in. - * @param attributeName C string representing the attribute name. - * - * @return The value string of the attribute \e attributeName if it exists in - * \e property, \c nil otherwise. - */ -OBJC_EXPORT char * _Nullable -property_copyAttributeValue(objc_property_t _Nonnull property, - const char * _Nonnull attributeName) - OBJC_AVAILABLE(10.7, 4.3, 9.0, 1.0, 2.0); - - -/* Working with Protocols */ - -/** - * Returns a specified protocol. - * - * @param name The name of a protocol. - * - * @return The protocol named \e name, or \c NULL if no protocol named \e name could be found. - * - * @note This function acquires the runtime lock. - */ -OBJC_EXPORT Protocol * _Nullable -objc_getProtocol(const char * _Nonnull name) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns an array of all the protocols known to the runtime. - * - * @param outCount Upon return, contains the number of protocols in the returned array. - * - * @return A C array of all the protocols known to the runtime. The array contains \c *outCount - * pointers followed by a \c NULL terminator. You must free the list with \c free(). - * - * @note This function acquires the runtime lock. - */ -OBJC_EXPORT Protocol * __unsafe_unretained _Nonnull * _Nullable -objc_copyProtocolList(unsigned int * _Nullable outCount) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns a Boolean value that indicates whether one protocol conforms to another protocol. - * - * @param proto A protocol. - * @param other A protocol. - * - * @return \c YES if \e proto conforms to \e other, otherwise \c NO. - * - * @note One protocol can incorporate other protocols using the same syntax - * that classes use to adopt a protocol: - * \code - * @protocol ProtocolName < protocol list > - * \endcode - * All the protocols listed between angle brackets are considered part of the ProtocolName protocol. - */ -OBJC_EXPORT BOOL -protocol_conformsToProtocol(Protocol * _Nullable proto, - Protocol * _Nullable other) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns a Boolean value that indicates whether two protocols are equal. - * - * @param proto A protocol. - * @param other A protocol. - * - * @return \c YES if \e proto is the same as \e other, otherwise \c NO. - */ -OBJC_EXPORT BOOL -protocol_isEqual(Protocol * _Nullable proto, Protocol * _Nullable other) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns the name of a protocol. - * - * @param proto A protocol. - * - * @return The name of the protocol \e p as a C string. - */ -OBJC_EXPORT const char * _Nonnull -protocol_getName(Protocol * _Nonnull proto) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns a method description structure for a specified method of a given protocol. - * - * @param proto A protocol. - * @param aSel A selector. - * @param isRequiredMethod A Boolean value that indicates whether aSel is a required method. - * @param isInstanceMethod A Boolean value that indicates whether aSel is an instance method. - * - * @return An \c objc_method_description structure that describes the method specified by \e aSel, - * \e isRequiredMethod, and \e isInstanceMethod for the protocol \e p. - * If the protocol does not contain the specified method, returns an \c objc_method_description structure - * with the value \c {NULL, \c NULL}. - * - * @note This function recursively searches any protocols that this protocol conforms to. - */ -OBJC_EXPORT struct objc_method_description -protocol_getMethodDescription(Protocol * _Nonnull proto, SEL _Nonnull aSel, - BOOL isRequiredMethod, BOOL isInstanceMethod) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns an array of method descriptions of methods meeting a given specification for a given protocol. - * - * @param proto A protocol. - * @param isRequiredMethod A Boolean value that indicates whether returned methods should - * be required methods (pass YES to specify required methods). - * @param isInstanceMethod A Boolean value that indicates whether returned methods should - * be instance methods (pass YES to specify instance methods). - * @param outCount Upon return, contains the number of method description structures in the returned array. - * - * @return A C array of \c objc_method_description structures containing the names and types of \e p's methods - * specified by \e isRequiredMethod and \e isInstanceMethod. The array contains \c *outCount pointers followed - * by a \c NULL terminator. You must free the list with \c free(). - * If the protocol declares no methods that meet the specification, \c NULL is returned and \c *outCount is 0. - * - * @note Methods in other protocols adopted by this protocol are not included. - */ -OBJC_EXPORT struct objc_method_description * _Nullable -protocol_copyMethodDescriptionList(Protocol * _Nonnull proto, - BOOL isRequiredMethod, - BOOL isInstanceMethod, - unsigned int * _Nullable outCount) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns the specified property of a given protocol. - * - * @param proto A protocol. - * @param name The name of a property. - * @param isRequiredProperty \c YES searches for a required property, \c NO searches for an optional property. - * @param isInstanceProperty \c YES searches for an instance property, \c NO searches for a class property. - * - * @return The property specified by \e name, \e isRequiredProperty, and \e isInstanceProperty for \e proto, - * or \c NULL if none of \e proto's properties meets the specification. - */ -OBJC_EXPORT objc_property_t _Nullable -protocol_getProperty(Protocol * _Nonnull proto, - const char * _Nonnull name, - BOOL isRequiredProperty, BOOL isInstanceProperty) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns an array of the required instance properties declared by a protocol. - * - * @note Identical to - * \code - * protocol_copyPropertyList2(proto, outCount, YES, YES); - * \endcode - */ -OBJC_EXPORT objc_property_t _Nonnull * _Nullable -protocol_copyPropertyList(Protocol * _Nonnull proto, - unsigned int * _Nullable outCount) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns an array of properties declared by a protocol. - * - * @param proto A protocol. - * @param outCount Upon return, contains the number of elements in the returned array. - * @param isRequiredProperty \c YES returns required properties, \c NO returns optional properties. - * @param isInstanceProperty \c YES returns instance properties, \c NO returns class properties. - * - * @return A C array of pointers of type \c objc_property_t describing the properties declared by \e proto. - * Any properties declared by other protocols adopted by this protocol are not included. The array contains - * \c *outCount pointers followed by a \c NULL terminator. You must free the array with \c free(). - * If the protocol declares no matching properties, \c NULL is returned and \c *outCount is \c 0. - */ -OBJC_EXPORT objc_property_t _Nonnull * _Nullable -protocol_copyPropertyList2(Protocol * _Nonnull proto, - unsigned int * _Nullable outCount, - BOOL isRequiredProperty, BOOL isInstanceProperty) - OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0, 2.0); - -/** - * Returns an array of the protocols adopted by a protocol. - * - * @param proto A protocol. - * @param outCount Upon return, contains the number of elements in the returned array. - * - * @return A C array of protocols adopted by \e proto. The array contains \e *outCount pointers - * followed by a \c NULL terminator. You must free the array with \c free(). - * If the protocol adopts no other protocols, \c NULL is returned and \c *outCount is \c 0. - */ -OBJC_EXPORT Protocol * __unsafe_unretained _Nonnull * _Nullable -protocol_copyProtocolList(Protocol * _Nonnull proto, - unsigned int * _Nullable outCount) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Creates a new protocol instance that cannot be used until registered with - * \c objc_registerProtocol() - * - * @param name The name of the protocol to create. - * - * @return The Protocol instance on success, \c nil if a protocol - * with the same name already exists. - * @note There is no dispose method for this. - */ -OBJC_EXPORT Protocol * _Nullable -objc_allocateProtocol(const char * _Nonnull name) - OBJC_AVAILABLE(10.7, 4.3, 9.0, 1.0, 2.0); - -/** - * Registers a newly constructed protocol with the runtime. The protocol - * will be ready for use and is immutable after this. - * - * @param proto The protocol you want to register. - */ -OBJC_EXPORT void -objc_registerProtocol(Protocol * _Nonnull proto) - OBJC_AVAILABLE(10.7, 4.3, 9.0, 1.0, 2.0); - -/** - * Adds a method to a protocol. The protocol must be under construction. - * - * @param proto The protocol to add a method to. - * @param name The name of the method to add. - * @param types A C string that represents the method signature. - * @param isRequiredMethod YES if the method is not an optional method. - * @param isInstanceMethod YES if the method is an instance method. - */ -OBJC_EXPORT void -protocol_addMethodDescription(Protocol * _Nonnull proto, SEL _Nonnull name, - const char * _Nullable types, - BOOL isRequiredMethod, BOOL isInstanceMethod) - OBJC_AVAILABLE(10.7, 4.3, 9.0, 1.0, 2.0); - -/** - * Adds an incorporated protocol to another protocol. The protocol being - * added to must still be under construction, while the additional protocol - * must be already constructed. - * - * @param proto The protocol you want to add to, it must be under construction. - * @param addition The protocol you want to incorporate into \e proto, it must be registered. - */ -OBJC_EXPORT void -protocol_addProtocol(Protocol * _Nonnull proto, Protocol * _Nonnull addition) - OBJC_AVAILABLE(10.7, 4.3, 9.0, 1.0, 2.0); - -/** - * Adds a property to a protocol. The protocol must be under construction. - * - * @param proto The protocol to add a property to. - * @param name The name of the property. - * @param attributes An array of property attributes. - * @param attributeCount The number of attributes in \e attributes. - * @param isRequiredProperty YES if the property (accessor methods) is not optional. - * @param isInstanceProperty YES if the property (accessor methods) are instance methods. - * This is the only case allowed fo a property, as a result, setting this to NO will - * not add the property to the protocol at all. - */ -OBJC_EXPORT void -protocol_addProperty(Protocol * _Nonnull proto, const char * _Nonnull name, - const objc_property_attribute_t * _Nullable attributes, - unsigned int attributeCount, - BOOL isRequiredProperty, BOOL isInstanceProperty) - OBJC_AVAILABLE(10.7, 4.3, 9.0, 1.0, 2.0); - - -/* Working with Libraries */ - -/** - * Returns the names of all the loaded Objective-C frameworks and dynamic - * libraries. - * - * @param outCount The number of names returned. - * - * @return An array of C strings of names. Must be free()'d by caller. - */ -OBJC_EXPORT const char * _Nonnull * _Nonnull -objc_copyImageNames(unsigned int * _Nullable outCount) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns the dynamic library name a class originated from. - * - * @param cls The class you are inquiring about. - * - * @return The name of the library containing this class. - */ -OBJC_EXPORT const char * _Nullable -class_getImageName(Class _Nullable cls) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns the names of all the classes within a library. - * - * @param image The library or framework you are inquiring about. - * @param outCount The number of class names returned. - * - * @return An array of C strings representing the class names. - */ -OBJC_EXPORT const char * _Nonnull * _Nullable -objc_copyClassNamesForImage(const char * _Nonnull image, - unsigned int * _Nullable outCount) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - - -/* Working with Selectors */ - -/** - * Returns the name of the method specified by a given selector. - * - * @param sel A pointer of type \c SEL. Pass the selector whose name you wish to determine. - * - * @return A C string indicating the name of the selector. - */ -OBJC_EXPORT const char * _Nonnull -sel_getName(SEL _Nonnull sel) - OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); - - -/** - * Registers a method with the Objective-C runtime system, maps the method - * name to a selector, and returns the selector value. - * - * @param str A pointer to a C string. Pass the name of the method you wish to register. - * - * @return A pointer of type SEL specifying the selector for the named method. - * - * @note You must register a method name with the Objective-C runtime system to obtain the - * method’s selector before you can add the method to a class definition. If the method name - * has already been registered, this function simply returns the selector. - */ -OBJC_EXPORT SEL _Nonnull -sel_registerName(const char * _Nonnull str) - OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); - -/** - * Returns a Boolean value that indicates whether two selectors are equal. - * - * @param lhs The selector to compare with rhs. - * @param rhs The selector to compare with lhs. - * - * @return \c YES if \e lhs and \e rhs are equal, otherwise \c NO. - * - * @note sel_isEqual is equivalent to ==. - */ -OBJC_EXPORT BOOL -sel_isEqual(SEL _Nonnull lhs, SEL _Nonnull rhs) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - - -/* Objective-C Language Features */ - -/** - * This function is inserted by the compiler when a mutation - * is detected during a foreach iteration. It gets called - * when a mutation occurs, and the enumerationMutationHandler - * is enacted if it is set up. A fatal error occurs if a handler is not set up. - * - * @param obj The object being mutated. - * - */ -OBJC_EXPORT void -objc_enumerationMutation(id _Nonnull obj) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Sets the current mutation handler. - * - * @param handler Function pointer to the new mutation handler. - */ -OBJC_EXPORT void -objc_setEnumerationMutationHandler(void (*_Nullable handler)(id _Nonnull )) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Set the function to be called by objc_msgForward. - * - * @param fwd Function to be jumped to by objc_msgForward. - * @param fwd_stret Function to be jumped to by objc_msgForward_stret. - * - * @see message.h::_objc_msgForward - */ -OBJC_EXPORT void -objc_setForwardHandler(void * _Nonnull fwd, void * _Nonnull fwd_stret) - OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); - -/** - * Creates a pointer to a function that will call the block - * when the method is called. - * - * @param block The block that implements this method. Its signature should - * be: method_return_type ^(id self, method_args...). - * The selector is not available as a parameter to this block. - * The block is copied with \c Block_copy(). - * - * @return The IMP that calls this block. Must be disposed of with - * \c imp_removeBlock. - */ -OBJC_EXPORT IMP _Nonnull -imp_implementationWithBlock(id _Nonnull block) - OBJC_AVAILABLE(10.7, 4.3, 9.0, 1.0, 2.0); - -/** - * Return the block associated with an IMP that was created using - * \c imp_implementationWithBlock. - * - * @param anImp The IMP that calls this block. - * - * @return The block called by \e anImp. - */ -OBJC_EXPORT id _Nullable -imp_getBlock(IMP _Nonnull anImp) - OBJC_AVAILABLE(10.7, 4.3, 9.0, 1.0, 2.0); - -/** - * Disassociates a block from an IMP that was created using - * \c imp_implementationWithBlock and releases the copy of the - * block that was created. - * - * @param anImp An IMP that was created using \c imp_implementationWithBlock. - * - * @return YES if the block was released successfully, NO otherwise. - * (For example, the block might not have been used to create an IMP previously). - */ -OBJC_EXPORT BOOL -imp_removeBlock(IMP _Nonnull anImp) - OBJC_AVAILABLE(10.7, 4.3, 9.0, 1.0, 2.0); - -/** - * This loads the object referenced by a weak pointer and returns it, after - * retaining and autoreleasing the object to ensure that it stays alive - * long enough for the caller to use it. This function would be used - * anywhere a __weak variable is used in an expression. - * - * @param location The weak pointer address - * - * @return The object pointed to by \e location, or \c nil if \e *location is \c nil. - */ -OBJC_EXPORT id _Nullable -objc_loadWeak(id _Nullable * _Nonnull location) - OBJC_AVAILABLE(10.7, 5.0, 9.0, 1.0, 2.0); - -/** - * This function stores a new value into a __weak variable. It would - * be used anywhere a __weak variable is the target of an assignment. - * - * @param location The address of the weak pointer itself - * @param obj The new object this weak ptr should now point to - * - * @return The value stored into \e location, i.e. \e obj - */ -OBJC_EXPORT id _Nullable -objc_storeWeak(id _Nullable * _Nonnull location, id _Nullable obj) - OBJC_AVAILABLE(10.7, 5.0, 9.0, 1.0, 2.0); - - -/* Associative References */ - -/** - * Policies related to associative references. - * These are options to objc_setAssociatedObject() - */ -typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) { - OBJC_ASSOCIATION_ASSIGN = 0, /**< Specifies a weak reference to the associated object. */ - OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, /**< Specifies a strong reference to the associated object. - * The association is not made atomically. */ - OBJC_ASSOCIATION_COPY_NONATOMIC = 3, /**< Specifies that the associated object is copied. - * The association is not made atomically. */ - OBJC_ASSOCIATION_RETAIN = 01401, /**< Specifies a strong reference to the associated object. - * The association is made atomically. */ - OBJC_ASSOCIATION_COPY = 01403 /**< Specifies that the associated object is copied. - * The association is made atomically. */ -}; - -/** - * Sets an associated value for a given object using a given key and association policy. - * - * @param object The source object for the association. - * @param key The key for the association. - * @param value The value to associate with the key key for object. Pass nil to clear an existing association. - * @param policy The policy for the association. For possible values, see “Associative Object Behaviors.” - * - * @see objc_setAssociatedObject - * @see objc_removeAssociatedObjects - */ -OBJC_EXPORT void -objc_setAssociatedObject(id _Nonnull object, const void * _Nonnull key, - id _Nullable value, objc_AssociationPolicy policy) - OBJC_AVAILABLE(10.6, 3.1, 9.0, 1.0, 2.0); - -/** - * Returns the value associated with a given object for a given key. - * - * @param object The source object for the association. - * @param key The key for the association. - * - * @return The value associated with the key \e key for \e object. - * - * @see objc_setAssociatedObject - */ -OBJC_EXPORT id _Nullable -objc_getAssociatedObject(id _Nonnull object, const void * _Nonnull key) - OBJC_AVAILABLE(10.6, 3.1, 9.0, 1.0, 2.0); - -/** - * Removes all associations for a given object. - * - * @param object An object that maintains associated objects. - * - * @note The main purpose of this function is to make it easy to return an object - * to a "pristine state”. You should not use this function for general removal of - * associations from objects, since it also removes associations that other clients - * may have added to the object. Typically you should use \c objc_setAssociatedObject - * with a nil value to clear an association. - * - * @see objc_setAssociatedObject - * @see objc_getAssociatedObject - */ -OBJC_EXPORT void -objc_removeAssociatedObjects(id _Nonnull object) - OBJC_AVAILABLE(10.6, 3.1, 9.0, 1.0, 2.0); - - -/* Hooks for Swift */ - -/** - * Function type for a hook that intercepts class_getImageName(). - * - * @param cls The class whose image name is being looked up. - * @param outImageName On return, the result of the image name lookup. - * @return YES if an image name for this class was found, NO otherwise. - * - * @see class_getImageName - * @see objc_setHook_getImageName - */ -typedef BOOL (*objc_hook_getImageName)(Class _Nonnull cls, const char * _Nullable * _Nonnull outImageName); - -/** - * Install a hook for class_getImageName(). - * - * @param newValue The hook function to install. - * @param outOldValue The address of a function pointer variable. On return, - * the old hook function is stored in the variable. - * - * @note The store to *outOldValue is thread-safe: the variable will be - * updated before class_getImageName() calls your new hook to read it, - * even if your new hook is called from another thread before this - * setter completes. - * @note The first hook in the chain is the native implementation of - * class_getImageName(). Your hook should call the previous hook for - * classes that you do not recognize. - * - * @see class_getImageName - * @see objc_hook_getImageName - */ -OBJC_EXPORT void objc_setHook_getImageName(objc_hook_getImageName _Nonnull newValue, - objc_hook_getImageName _Nullable * _Nonnull outOldValue) - OBJC_AVAILABLE(10.14, 12.0, 12.0, 5.0, 3.0); - -/** - * Function type for a hook that assists objc_getClass() and related functions. - * - * @param name The class name to look up. - * @param outClass On return, the result of the class lookup. - * @return YES if a class with this name was found, NO otherwise. - * - * @see objc_getClass - * @see objc_setHook_getClass - */ -typedef BOOL (*objc_hook_getClass)(const char * _Nonnull name, Class _Nullable * _Nonnull outClass); - -/** - * Install a hook for objc_getClass() and related functions. - * - * @param newValue The hook function to install. - * @param outOldValue The address of a function pointer variable. On return, - * the old hook function is stored in the variable. - * - * @note The store to *outOldValue is thread-safe: the variable will be - * updated before objc_getClass() calls your new hook to read it, - * even if your new hook is called from another thread before this - * setter completes. - * @note Your hook should call the previous hook for class names - * that you do not recognize. - * - * @see objc_getClass - * @see objc_hook_getClass - */ -#if !(TARGET_OS_OSX && __i386__) -#define OBJC_GETCLASSHOOK_DEFINED 1 -OBJC_EXPORT void objc_setHook_getClass(objc_hook_getClass _Nonnull newValue, - objc_hook_getClass _Nullable * _Nonnull outOldValue) - OBJC_AVAILABLE(10.14.4, 12.2, 12.2, 5.2, 3.2); -#endif - -/** - * Function type for a hook that assists objc_setAssociatedObject(). - * - * @param object The source object for the association. - * @param key The key for the association. - * @param value The value to associate with the key key for object. Pass nil to clear an existing association. - * @param policy The policy for the association. For possible values, see “Associative Object Behaviors.” - * - * @see objc_setAssociatedObject - * @see objc_setHook_setAssociatedObject - */ -typedef void (*objc_hook_setAssociatedObject)(id _Nonnull object, const void * _Nonnull key, - id _Nullable value, objc_AssociationPolicy policy); - -/** - * Install a hook for objc_setAssociatedObject(). - * - * @param newValue The hook function to install. - * @param outOldValue The address of a function pointer variable. On return, - * the old hook function is stored in the variable. - * - * @note The store to *outOldValue is thread-safe: the variable will be - * updated before objc_setAssociatedObject() calls your new hook to read it, - * even if your new hook is called from another thread before this - * setter completes. - * @note Your hook should always call the previous hook. - * - * @see objc_setAssociatedObject - * @see objc_hook_setAssociatedObject - */ -#if !(TARGET_OS_OSX && __i386__) -#define OBJC_SETASSOCIATEDOBJECTHOOK_DEFINED 1 -OBJC_EXPORT void objc_setHook_setAssociatedObject(objc_hook_setAssociatedObject _Nonnull newValue, - objc_hook_setAssociatedObject _Nullable * _Nonnull outOldValue) - OBJC_AVAILABLE(10.15, 13.0, 13.0, 6.0, 4.0); -#endif - -/** - * Function type for a function that is called when an image is loaded. - * - * @param header The newly loaded header. - */ -struct mach_header; -typedef void (*objc_func_loadImage)(const struct mach_header * _Nonnull header); - -/** - * Add a function to be called when a new image is loaded. The function is - * called after ObjC has scanned and fixed up the image. It is called - * BEFORE +load methods are invoked. - * - * When adding a new function, that function is immediately called with all - * images that are currently loaded. It is then called as needed for images - * that are loaded afterwards. - * - * Note: the function is called with ObjC's internal runtime lock held. - * Be VERY careful with what the function does to avoid deadlocks or - * poor performance. - * - * @param func The function to add. - */ -#define OBJC_ADDLOADIMAGEFUNC_DEFINED 1 -OBJC_EXPORT void objc_addLoadImageFunc(objc_func_loadImage _Nonnull func) - OBJC_AVAILABLE(10.15, 13.0, 13.0, 6.0, 4.0); - -/** - * Callback from Objective-C to Swift to perform Swift class initialization. - */ -#if !(TARGET_OS_OSX && __i386__) -typedef Class _Nullable -(*_objc_swiftMetadataInitializer)(Class _Nonnull cls, void * _Nullable arg); -#endif - - -/** - * Perform Objective-C initialization of a Swift class. - * Do not call this function. It is provided for the Swift runtime's use only - * and will change without notice or mercy. - */ -#if !(TARGET_OS_OSX && __i386__) -#define OBJC_REALIZECLASSFROMSWIFT_DEFINED 1 -OBJC_EXPORT Class _Nullable -_objc_realizeClassFromSwift(Class _Nullable cls, void * _Nullable previously) - OBJC_AVAILABLE(10.14.4, 12.2, 12.2, 5.2, 3.2); -#endif - - -#define _C_ID '@' -#define _C_CLASS '#' -#define _C_SEL ':' -#define _C_CHR 'c' -#define _C_UCHR 'C' -#define _C_SHT 's' -#define _C_USHT 'S' -#define _C_INT 'i' -#define _C_UINT 'I' -#define _C_LNG 'l' -#define _C_ULNG 'L' -#define _C_LNG_LNG 'q' -#define _C_ULNG_LNG 'Q' -#define _C_FLT 'f' -#define _C_DBL 'd' -#define _C_BFLD 'b' -#define _C_BOOL 'B' -#define _C_VOID 'v' -#define _C_UNDEF '?' -#define _C_PTR '^' -#define _C_CHARPTR '*' -#define _C_ATOM '%' -#define _C_ARY_B '[' -#define _C_ARY_E ']' -#define _C_UNION_B '(' -#define _C_UNION_E ')' -#define _C_STRUCT_B '{' -#define _C_STRUCT_E '}' -#define _C_VECTOR '!' -#define _C_CONST 'r' - - -/* Obsolete types */ - -#if !__OBJC2__ - -#define CLS_GETINFO(cls,infomask) ((cls)->info & (infomask)) -#define CLS_SETINFO(cls,infomask) ((cls)->info |= (infomask)) - -// class is not a metaclass -#define CLS_CLASS 0x1 -// class is a metaclass -#define CLS_META 0x2 -// class's +initialize method has completed -#define CLS_INITIALIZED 0x4 -// class is posing -#define CLS_POSING 0x8 -// unused -#define CLS_MAPPED 0x10 -// class and subclasses need cache flush during image loading -#define CLS_FLUSH_CACHE 0x20 -// method cache should grow when full -#define CLS_GROW_CACHE 0x40 -// unused -#define CLS_NEED_BIND 0x80 -// methodLists is array of method lists -#define CLS_METHOD_ARRAY 0x100 -// the JavaBridge constructs classes with these markers -#define CLS_JAVA_HYBRID 0x200 -#define CLS_JAVA_CLASS 0x400 -// thread-safe +initialize -#define CLS_INITIALIZING 0x800 -// bundle unloading -#define CLS_FROM_BUNDLE 0x1000 -// C++ ivar support -#define CLS_HAS_CXX_STRUCTORS 0x2000 -// Lazy method list arrays -#define CLS_NO_METHOD_ARRAY 0x4000 -// +load implementation -#define CLS_HAS_LOAD_METHOD 0x8000 -// objc_allocateClassPair API -#define CLS_CONSTRUCTING 0x10000 -// class compiled with bigger class structure -#define CLS_EXT 0x20000 - - -struct objc_method_description_list { - int count; - struct objc_method_description list[1]; -}; - - -struct objc_protocol_list { - struct objc_protocol_list * _Nullable next; - long count; - __unsafe_unretained Protocol * _Nullable list[1]; -}; - - -struct objc_category { - char * _Nonnull category_name OBJC2_UNAVAILABLE; - char * _Nonnull class_name OBJC2_UNAVAILABLE; - struct objc_method_list * _Nullable instance_methods OBJC2_UNAVAILABLE; - struct objc_method_list * _Nullable class_methods OBJC2_UNAVAILABLE; - struct objc_protocol_list * _Nullable protocols OBJC2_UNAVAILABLE; -} OBJC2_UNAVAILABLE; - - -struct objc_ivar { - char * _Nullable ivar_name OBJC2_UNAVAILABLE; - char * _Nullable ivar_type OBJC2_UNAVAILABLE; - int ivar_offset OBJC2_UNAVAILABLE; -#ifdef __LP64__ - int space OBJC2_UNAVAILABLE; -#endif -} OBJC2_UNAVAILABLE; - -struct objc_ivar_list { - int ivar_count OBJC2_UNAVAILABLE; -#ifdef __LP64__ - int space OBJC2_UNAVAILABLE; -#endif - /* variable length structure */ - struct objc_ivar ivar_list[1] OBJC2_UNAVAILABLE; -} OBJC2_UNAVAILABLE; - - -struct objc_method { - SEL _Nonnull method_name OBJC2_UNAVAILABLE; - char * _Nullable method_types OBJC2_UNAVAILABLE; - IMP _Nonnull method_imp OBJC2_UNAVAILABLE; -} OBJC2_UNAVAILABLE; - -struct objc_method_list { - struct objc_method_list * _Nullable obsolete OBJC2_UNAVAILABLE; - - int method_count OBJC2_UNAVAILABLE; -#ifdef __LP64__ - int space OBJC2_UNAVAILABLE; -#endif - /* variable length structure */ - struct objc_method method_list[1] OBJC2_UNAVAILABLE; -} OBJC2_UNAVAILABLE; - - -typedef struct objc_symtab *Symtab OBJC2_UNAVAILABLE; - -struct objc_symtab { - unsigned long sel_ref_cnt OBJC2_UNAVAILABLE; - SEL _Nonnull * _Nullable refs OBJC2_UNAVAILABLE; - unsigned short cls_def_cnt OBJC2_UNAVAILABLE; - unsigned short cat_def_cnt OBJC2_UNAVAILABLE; - void * _Nullable defs[1] /* variable size */ OBJC2_UNAVAILABLE; -} OBJC2_UNAVAILABLE; - - -typedef struct objc_cache *Cache OBJC2_UNAVAILABLE; - -#define CACHE_BUCKET_NAME(B) ((B)->method_name) -#define CACHE_BUCKET_IMP(B) ((B)->method_imp) -#define CACHE_BUCKET_VALID(B) (B) -#ifndef __LP64__ -#define CACHE_HASH(sel, mask) (((uintptr_t)(sel)>>2) & (mask)) -#else -#define CACHE_HASH(sel, mask) (((unsigned int)((uintptr_t)(sel)>>3)) & (mask)) -#endif -struct objc_cache { - unsigned int mask /* total = mask + 1 */ OBJC2_UNAVAILABLE; - unsigned int occupied OBJC2_UNAVAILABLE; - Method _Nullable buckets[1] OBJC2_UNAVAILABLE; -}; - - -typedef struct objc_module *Module OBJC2_UNAVAILABLE; - -struct objc_module { - unsigned long version OBJC2_UNAVAILABLE; - unsigned long size OBJC2_UNAVAILABLE; - const char * _Nullable name OBJC2_UNAVAILABLE; - Symtab _Nullable symtab OBJC2_UNAVAILABLE; -} OBJC2_UNAVAILABLE; - -#else - -struct objc_method_list; - -#endif - - -/* Obsolete functions */ - -OBJC_EXPORT IMP _Nullable -class_lookupMethod(Class _Nullable cls, SEL _Nonnull sel) - __OSX_DEPRECATED(10.0, 10.5, "use class_getMethodImplementation instead") - __IOS_DEPRECATED(2.0, 2.0, "use class_getMethodImplementation instead") - __TVOS_DEPRECATED(9.0, 9.0, "use class_getMethodImplementation instead") - __WATCHOS_DEPRECATED(1.0, 1.0, "use class_getMethodImplementation instead") - -; -OBJC_EXPORT BOOL -class_respondsToMethod(Class _Nullable cls, SEL _Nonnull sel) - __OSX_DEPRECATED(10.0, 10.5, "use class_respondsToSelector instead") - __IOS_DEPRECATED(2.0, 2.0, "use class_respondsToSelector instead") - __TVOS_DEPRECATED(9.0, 9.0, "use class_respondsToSelector instead") - __WATCHOS_DEPRECATED(1.0, 1.0, "use class_respondsToSelector instead") - -; - -OBJC_EXPORT void -_objc_flush_caches(Class _Nullable cls) - __OSX_DEPRECATED(10.0, 10.5, "not recommended") - __IOS_DEPRECATED(2.0, 2.0, "not recommended") - __TVOS_DEPRECATED(9.0, 9.0, "not recommended") - __WATCHOS_DEPRECATED(1.0, 1.0, "not recommended") - -; - -OBJC_EXPORT id _Nullable -object_copyFromZone(id _Nullable anObject, size_t nBytes, void * _Nullable z) - OBJC_OSX_DEPRECATED_OTHERS_UNAVAILABLE(10.0, 10.5, "use object_copy instead"); - -OBJC_EXPORT id _Nullable -object_realloc(id _Nullable anObject, size_t nBytes) - OBJC2_UNAVAILABLE; - -OBJC_EXPORT id _Nullable -object_reallocFromZone(id _Nullable anObject, size_t nBytes, void * _Nullable z) - OBJC2_UNAVAILABLE; - -#define OBSOLETE_OBJC_GETCLASSES 1 -OBJC_EXPORT void * _Nonnull -objc_getClasses(void) - OBJC2_UNAVAILABLE; - -OBJC_EXPORT void -objc_addClass(Class _Nonnull myClass) - OBJC2_UNAVAILABLE; - -OBJC_EXPORT void -objc_setClassHandler(int (* _Nullable )(const char * _Nonnull)) - OBJC2_UNAVAILABLE; - -OBJC_EXPORT void -objc_setMultithreaded(BOOL flag) - OBJC2_UNAVAILABLE; - -OBJC_EXPORT id _Nullable -class_createInstanceFromZone(Class _Nullable, size_t idxIvars, - void * _Nullable z) - OBJC_OSX_DEPRECATED_OTHERS_UNAVAILABLE(10.0, 10.5, "use class_createInstance instead"); - -OBJC_EXPORT void -class_addMethods(Class _Nullable, struct objc_method_list * _Nonnull) - OBJC2_UNAVAILABLE; - -OBJC_EXPORT void -class_removeMethods(Class _Nullable, struct objc_method_list * _Nonnull) - OBJC2_UNAVAILABLE; - -OBJC_EXPORT void -_objc_resolve_categories_for_class(Class _Nonnull cls) - OBJC2_UNAVAILABLE; - -OBJC_EXPORT Class _Nonnull -class_poseAs(Class _Nonnull imposter, Class _Nonnull original) - OBJC2_UNAVAILABLE; - -OBJC_EXPORT unsigned int -method_getSizeOfArguments(Method _Nonnull m) - OBJC2_UNAVAILABLE; - -OBJC_EXPORT unsigned -method_getArgumentInfo(struct objc_method * _Nonnull m, int arg, - const char * _Nullable * _Nonnull type, - int * _Nonnull offset) - UNAVAILABLE_ATTRIBUTE // This function was accidentally deleted in 10.9. - OBJC2_UNAVAILABLE; - -OBJC_EXPORT Class _Nullable -objc_getOrigClass(const char * _Nonnull name) - OBJC2_UNAVAILABLE; - -#define OBJC_NEXT_METHOD_LIST 1 -OBJC_EXPORT struct objc_method_list * _Nullable -class_nextMethodList(Class _Nullable, void * _Nullable * _Nullable) - OBJC2_UNAVAILABLE; -// usage for nextMethodList -// -// void *iterator = 0; -// struct objc_method_list *mlist; -// while ( mlist = class_nextMethodList( cls, &iterator ) ) -// ; - -OBJC_EXPORT id _Nullable -(* _Nonnull _alloc)(Class _Nullable, size_t) - OBJC2_UNAVAILABLE; - -OBJC_EXPORT id _Nullable -(* _Nonnull _copy)(id _Nullable, size_t) - OBJC2_UNAVAILABLE; - -OBJC_EXPORT id _Nullable -(* _Nonnull _realloc)(id _Nullable, size_t) - OBJC2_UNAVAILABLE; - -OBJC_EXPORT id _Nullable -(* _Nonnull _dealloc)(id _Nullable) - OBJC2_UNAVAILABLE; - -OBJC_EXPORT id _Nullable -(* _Nonnull _zoneAlloc)(Class _Nullable, size_t, void * _Nullable) - OBJC2_UNAVAILABLE; - -OBJC_EXPORT id _Nullable -(* _Nonnull _zoneRealloc)(id _Nullable, size_t, void * _Nullable) - OBJC2_UNAVAILABLE; - -OBJC_EXPORT id _Nullable -(* _Nonnull _zoneCopy)(id _Nullable, size_t, void * _Nullable) - OBJC2_UNAVAILABLE; - -OBJC_EXPORT void -(* _Nonnull _error)(id _Nullable, const char * _Nonnull, va_list) - OBJC2_UNAVAILABLE; - -#endif \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/os/base.h b/lib/libc/include/x86_64-macos-gnu/os/base.h deleted file mode 100644 index a57f8373a4..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/os/base.h +++ /dev/null @@ -1,325 +0,0 @@ -/* - * Copyright (c) 2008-2013 Apple Inc. All rights reserved. - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -#ifndef __OS_BASE__ -#define __OS_BASE__ - -#include - -#ifndef __has_builtin -#define __has_builtin(x) 0 -#endif -#ifndef __has_include -#define __has_include(x) 0 -#endif -#ifndef __has_feature -#define __has_feature(x) 0 -#endif -#ifndef __has_attribute -#define __has_attribute(x) 0 -#endif -#ifndef __has_extension -#define __has_extension(x) 0 -#endif - -#undef OS_INLINE // -#if __GNUC__ -#define OS_NORETURN __attribute__((__noreturn__)) -#define OS_NOTHROW __attribute__((__nothrow__)) -#define OS_NONNULL1 __attribute__((__nonnull__(1))) -#define OS_NONNULL2 __attribute__((__nonnull__(2))) -#define OS_NONNULL3 __attribute__((__nonnull__(3))) -#define OS_NONNULL4 __attribute__((__nonnull__(4))) -#define OS_NONNULL5 __attribute__((__nonnull__(5))) -#define OS_NONNULL6 __attribute__((__nonnull__(6))) -#define OS_NONNULL7 __attribute__((__nonnull__(7))) -#define OS_NONNULL8 __attribute__((__nonnull__(8))) -#define OS_NONNULL9 __attribute__((__nonnull__(9))) -#define OS_NONNULL10 __attribute__((__nonnull__(10))) -#define OS_NONNULL11 __attribute__((__nonnull__(11))) -#define OS_NONNULL12 __attribute__((__nonnull__(12))) -#define OS_NONNULL13 __attribute__((__nonnull__(13))) -#define OS_NONNULL14 __attribute__((__nonnull__(14))) -#define OS_NONNULL15 __attribute__((__nonnull__(15))) -#define OS_NONNULL_ALL __attribute__((__nonnull__)) -#define OS_SENTINEL __attribute__((__sentinel__)) -#define OS_PURE __attribute__((__pure__)) -#define OS_CONST __attribute__((__const__)) -#define OS_WARN_RESULT __attribute__((__warn_unused_result__)) -#define OS_MALLOC __attribute__((__malloc__)) -#define OS_USED __attribute__((__used__)) -#define OS_UNUSED __attribute__((__unused__)) -#define OS_COLD __attribute__((__cold__)) -#define OS_WEAK __attribute__((__weak__)) -#define OS_WEAK_IMPORT __attribute__((__weak_import__)) -#define OS_NOINLINE __attribute__((__noinline__)) -#define OS_ALWAYS_INLINE __attribute__((__always_inline__)) -#define OS_TRANSPARENT_UNION __attribute__((__transparent_union__)) -#define OS_ALIGNED(n) __attribute__((__aligned__((n)))) -#define OS_FORMAT_PRINTF(x,y) __attribute__((__format__(printf,x,y))) -#define OS_EXPORT extern __attribute__((__visibility__("default"))) -#define OS_INLINE static __inline__ -#define OS_EXPECT(x, v) __builtin_expect((x), (v)) -#else -#define OS_NORETURN -#define OS_NOTHROW -#define OS_NONNULL1 -#define OS_NONNULL2 -#define OS_NONNULL3 -#define OS_NONNULL4 -#define OS_NONNULL5 -#define OS_NONNULL6 -#define OS_NONNULL7 -#define OS_NONNULL8 -#define OS_NONNULL9 -#define OS_NONNULL10 -#define OS_NONNULL11 -#define OS_NONNULL12 -#define OS_NONNULL13 -#define OS_NONNULL14 -#define OS_NONNULL15 -#define OS_NONNULL_ALL -#define OS_SENTINEL -#define OS_PURE -#define OS_CONST -#define OS_WARN_RESULT -#define OS_MALLOC -#define OS_USED -#define OS_UNUSED -#define OS_COLD -#define OS_WEAK -#define OS_WEAK_IMPORT -#define OS_NOINLINE -#define OS_ALWAYS_INLINE -#define OS_TRANSPARENT_UNION -#define OS_ALIGNED(n) -#define OS_FORMAT_PRINTF(x,y) -#define OS_EXPORT extern -#define OS_INLINE static inline -#define OS_EXPECT(x, v) (x) -#endif - -#if __has_attribute(noescape) -#define OS_NOESCAPE __attribute__((__noescape__)) -#else -#define OS_NOESCAPE -#endif - -#if defined(__cplusplus) && defined(__clang__) -#define OS_FALLTHROUGH [[clang::fallthrough]] -#else -#define OS_FALLTHROUGH -#endif - -#if __has_feature(assume_nonnull) -#define OS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin") -#define OS_ASSUME_NONNULL_END _Pragma("clang assume_nonnull end") -#else -#define OS_ASSUME_NONNULL_BEGIN -#define OS_ASSUME_NONNULL_END -#endif - -#if __has_builtin(__builtin_assume) -#define OS_COMPILER_CAN_ASSUME(expr) __builtin_assume(expr) -#else -#define OS_COMPILER_CAN_ASSUME(expr) ((void)(expr)) -#endif - -#if __has_extension(attribute_overloadable) -#define OS_OVERLOADABLE __attribute__((__overloadable__)) -#else -#define OS_OVERLOADABLE -#endif - -#if __has_attribute(enum_extensibility) -#define __OS_ENUM_ATTR __attribute__((enum_extensibility(open))) -#define __OS_ENUM_ATTR_CLOSED __attribute__((enum_extensibility(closed))) -#else -#define __OS_ENUM_ATTR -#define __OS_ENUM_ATTR_CLOSED -#endif // __has_attribute(enum_extensibility) - -#if __has_attribute(flag_enum) -/*! - * Compile with -Wflag-enum and -Wassign-enum to enforce at definition and - * assignment, respectively, i.e. -Wflag-enum prevents you from creating new - * enumeration values from illegal values within the enum definition, and - * -Wassign-enum prevents you from assigning illegal values to a variable of the - * enum type. - */ -#ifndef __OPEN_SOURCE__ -/*! - * @internal - * - */ -#endif // __OPEN_SOURCE__ -#define __OS_OPTIONS_ATTR __attribute__((flag_enum)) -#else -#define __OS_OPTIONS_ATTR -#endif // __has_attribute(flag_enum) - -#if __has_feature(objc_fixed_enum) || __has_extension(cxx_fixed_enum) || \ - __has_extension(cxx_strong_enums) -#define OS_ENUM(_name, _type, ...) \ - typedef enum : _type { __VA_ARGS__ } _name##_t -#define OS_CLOSED_ENUM(_name, _type, ...) \ - typedef enum : _type { __VA_ARGS__ } \ - __OS_ENUM_ATTR_CLOSED _name##_t -#define OS_OPTIONS(_name, _type, ...) \ - typedef enum : _type { __VA_ARGS__ } \ - __OS_ENUM_ATTR __OS_OPTIONS_ATTR _name##_t -#define OS_CLOSED_OPTIONS(_name, _type, ...) \ - typedef enum : _type { __VA_ARGS__ } \ - __OS_ENUM_ATTR_CLOSED __OS_OPTIONS_ATTR _name##_t -#else -/*! - * There is unfortunately no good way in plain C to have both fixed-type enums - * and enforcement for clang's enum_extensibility extensions. The primary goal - * of these macros is to allow you to define an enum and specify its width in a - * single statement, and for plain C that is accomplished by defining an - * anonymous enum and then separately typedef'ing the requested type name to the - * requested underlying integer type. So the type emitted actually has no - * relationship at all to the enum, and therefore while the compiler could - * enforce enum extensibility if you used the enum type, it cannot do so if you - * use the "_t" type resulting from this expression. - * - * But we still define a named enum type and decorate it appropriately for you, - * so if you really want the enum extensibility enforcement, you can use the - * enum type yourself, i.e. when compiling with a C compiler: - * - * OS_CLOSED_ENUM(my_type, uint64_t, - * FOO, - * BAR, - * BAZ, - * ); - * - * my_type_t mt = 98; // legal - * enum my_type emt = 98; // illegal - * - * But be aware that the underlying enum type's width is subject only to the C - * language's guarantees -- namely that it will be compatible with int, char, - * and unsigned char. It is not safe to rely on the size of this type. - * - * When compiling in ObjC or C++, both of the above assignments are illegal. - */ -#define __OS_ENUM_C_FALLBACK(_name, _type, ...) \ - typedef _type _name##_t; enum _name { __VA_ARGS__ } - -#define OS_ENUM(_name, _type, ...) \ - typedef _type _name##_t; enum { __VA_ARGS__ } -#define OS_CLOSED_ENUM(_name, _type, ...) \ - __OS_ENUM_C_FALLBACK(_name, _type, ## __VA_ARGS__) \ - __OS_ENUM_ATTR_CLOSED -#define OS_OPTIONS(_name, _type, ...) \ - __OS_ENUM_C_FALLBACK(_name, _type, ## __VA_ARGS__) \ - __OS_ENUM_ATTR __OS_OPTIONS_ATTR -#define OS_CLOSED_OPTIONS(_name, _type, ...) \ - __OS_ENUM_C_FALLBACK(_name, _type, ## __VA_ARGS__) \ - __OS_ENUM_ATTR_CLOSED __OS_OPTIONS_ATTR -#endif // __has_feature(objc_fixed_enum) || __has_extension(cxx_strong_enums) - -#if __has_feature(attribute_availability_swift) -// equivalent to __SWIFT_UNAVAILABLE from Availability.h -#define OS_SWIFT_UNAVAILABLE(_msg) \ - __attribute__((__availability__(swift, unavailable, message=_msg))) -#else -#define OS_SWIFT_UNAVAILABLE(_msg) -#endif - -#if __has_attribute(swift_private) -# define OS_REFINED_FOR_SWIFT __attribute__((__swift_private__)) -#else -# define OS_REFINED_FOR_SWIFT -#endif - -#if __has_attribute(swift_name) -# define OS_SWIFT_NAME(_name) __attribute__((__swift_name__(#_name))) -#else -# define OS_SWIFT_NAME(_name) -#endif - -#define __OS_STRINGIFY(s) #s -#define OS_STRINGIFY(s) __OS_STRINGIFY(s) -#define __OS_CONCAT(x, y) x ## y -#define OS_CONCAT(x, y) __OS_CONCAT(x, y) - -#ifdef __GNUC__ -#define os_prevent_tail_call_optimization() __asm__("") -#define os_is_compile_time_constant(expr) __builtin_constant_p(expr) -#define os_compiler_barrier() __asm__ __volatile__("" ::: "memory") -#else -#define os_prevent_tail_call_optimization() do { } while (0) -#define os_is_compile_time_constant(expr) 0 -#define os_compiler_barrier() do { } while (0) -#endif - -#if __has_attribute(not_tail_called) -#define OS_NOT_TAIL_CALLED __attribute__((__not_tail_called__)) -#else -#define OS_NOT_TAIL_CALLED -#endif - -typedef void (*os_function_t)(void *_Nullable); - -#ifdef __BLOCKS__ -/*! - * @typedef os_block_t - * - * @abstract - * Generic type for a block taking no arguments and returning no value. - * - * @discussion - * When not building with Objective-C ARC, a block object allocated on or - * copied to the heap must be released with a -[release] message or the - * Block_release() function. - * - * The declaration of a block literal allocates storage on the stack. - * Therefore, this is an invalid construct: - * - * os_block_t block; - * if (x) { - * block = ^{ printf("true\n"); }; - * } else { - * block = ^{ printf("false\n"); }; - * } - * block(); // unsafe!!! - * - * - * What is happening behind the scenes: - * - * if (x) { - * struct Block __tmp_1 = ...; // setup details - * block = &__tmp_1; - * } else { - * struct Block __tmp_2 = ...; // setup details - * block = &__tmp_2; - * } - * - * - * As the example demonstrates, the address of a stack variable is escaping the - * scope in which it is allocated. That is a classic C bug. - * - * Instead, the block literal must be copied to the heap with the Block_copy() - * function or by sending it a -[copy] message. - */ -typedef void (^os_block_t)(void); -#endif - -#endif // __OS_BASE__ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/os/clock.h b/lib/libc/include/x86_64-macos-gnu/os/clock.h deleted file mode 100644 index 665e1d8716..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/os/clock.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef __OS_CLOCK__ -#define __OS_CLOCK__ - -#include -#include - -/* - * @typedef os_clockid_t - * - * @abstract - * Describes the kind of clock that the workgroup timestamp parameters are - * specified in - */ -OS_ENUM(os_clockid, uint32_t, - OS_CLOCK_MACH_ABSOLUTE_TIME = 32, -); - -#endif /* __OS_CLOCK__ */ diff --git a/lib/libc/include/x86_64-macos-gnu/os/object.h b/lib/libc/include/x86_64-macos-gnu/os/object.h deleted file mode 100644 index be281bcd9a..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/os/object.h +++ /dev/null @@ -1,271 +0,0 @@ -/* - * Copyright (c) 2011-2014 Apple Inc. All rights reserved. - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -#ifndef __OS_OBJECT__ -#define __OS_OBJECT__ - -#ifdef __APPLE__ -#include -#include -#include -#include -#elif defined(_WIN32) -#include -#elif defined(__unix__) -#include -#endif - -/*! - * @header - * - * @preprocinfo - * By default, libSystem objects such as GCD and XPC objects are declared as - * Objective-C types when building with an Objective-C compiler. This allows - * them to participate in ARC, in RR management by the Blocks runtime and in - * leaks checking by the static analyzer, and enables them to be added to Cocoa - * collections. - * - * NOTE: this requires explicit cancellation of dispatch sources and xpc - * connections whose handler blocks capture the source/connection object, - * resp. ensuring that such captures do not form retain cycles (e.g. by - * declaring the source as __weak). - * - * To opt-out of this default behavior, add -DOS_OBJECT_USE_OBJC=0 to your - * compiler flags. - * - * This mode requires a platform with the modern Objective-C runtime, the - * Objective-C GC compiler option to be disabled, and at least a Mac OS X 10.8 - * or iOS 6.0 deployment target. - */ - -#ifndef OS_OBJECT_HAVE_OBJC_SUPPORT -#if !defined(__OBJC__) || defined(__OBJC_GC__) -# define OS_OBJECT_HAVE_OBJC_SUPPORT 0 -#elif !defined(TARGET_OS_MAC) || !TARGET_OS_MAC -# define OS_OBJECT_HAVE_OBJC_SUPPORT 0 -#elif TARGET_OS_IOS && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0 -# define OS_OBJECT_HAVE_OBJC_SUPPORT 0 -#elif TARGET_OS_MAC && !TARGET_OS_IPHONE -# if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_8 -# define OS_OBJECT_HAVE_OBJC_SUPPORT 0 -# elif defined(__i386__) && __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_12 -# define OS_OBJECT_HAVE_OBJC_SUPPORT 0 -# else -# define OS_OBJECT_HAVE_OBJC_SUPPORT 1 -# endif -#else -# define OS_OBJECT_HAVE_OBJC_SUPPORT 1 -#endif -#endif // OS_OBJECT_HAVE_OBJC_SUPPORT - -#if OS_OBJECT_HAVE_OBJC_SUPPORT -#if defined(__swift__) && __swift__ && !OS_OBJECT_USE_OBJC -#define OS_OBJECT_USE_OBJC 1 -#endif -#ifndef OS_OBJECT_USE_OBJC -#define OS_OBJECT_USE_OBJC 1 -#endif -#elif defined(OS_OBJECT_USE_OBJC) && OS_OBJECT_USE_OBJC -/* Unsupported platform for OS_OBJECT_USE_OBJC=1 */ -#undef OS_OBJECT_USE_OBJC -#define OS_OBJECT_USE_OBJC 0 -#else -#define OS_OBJECT_USE_OBJC 0 -#endif - -#ifndef OS_OBJECT_SWIFT3 -#ifdef __swift__ -#define OS_OBJECT_SWIFT3 1 -#else // __swift__ -#define OS_OBJECT_SWIFT3 0 -#endif // __swift__ -#endif // OS_OBJECT_SWIFT3 - -#if OS_OBJECT_USE_OBJC -#import -#if __has_attribute(objc_independent_class) -#define OS_OBJC_INDEPENDENT_CLASS __attribute__((objc_independent_class)) -#endif // __has_attribute(objc_independent_class) -#ifndef OS_OBJC_INDEPENDENT_CLASS -#define OS_OBJC_INDEPENDENT_CLASS -#endif -#define OS_OBJECT_CLASS(name) OS_##name -#define OS_OBJECT_DECL_PROTOCOL(name, ...) \ - @protocol OS_OBJECT_CLASS(name) __VA_ARGS__ \ - @end -#define OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL_IMPL(name, proto) \ - @interface name () \ - @end -#define OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL(name, proto) \ - OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL_IMPL( \ - OS_OBJECT_CLASS(name), OS_OBJECT_CLASS(proto)) -#define OS_OBJECT_DECL_IMPL(name, ...) \ - OS_OBJECT_DECL_PROTOCOL(name, __VA_ARGS__) \ - typedef NSObject \ - * OS_OBJC_INDEPENDENT_CLASS name##_t -#define OS_OBJECT_DECL_BASE(name, ...) \ - @interface OS_OBJECT_CLASS(name) : __VA_ARGS__ \ - - (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift"); \ - @end -#define OS_OBJECT_DECL_IMPL_CLASS(name, ...) \ - OS_OBJECT_DECL_BASE(name, ## __VA_ARGS__) \ - typedef OS_OBJECT_CLASS(name) \ - * OS_OBJC_INDEPENDENT_CLASS name##_t -#define OS_OBJECT_DECL(name, ...) \ - OS_OBJECT_DECL_IMPL(name, ) -#define OS_OBJECT_DECL_SUBCLASS(name, super) \ - OS_OBJECT_DECL_IMPL(name, ) -#if __has_attribute(ns_returns_retained) -#define OS_OBJECT_RETURNS_RETAINED __attribute__((__ns_returns_retained__)) -#else -#define OS_OBJECT_RETURNS_RETAINED -#endif -#if __has_attribute(ns_consumed) -#define OS_OBJECT_CONSUMED __attribute__((__ns_consumed__)) -#else -#define OS_OBJECT_CONSUMED -#endif -#if __has_feature(objc_arc) -#define OS_OBJECT_BRIDGE __bridge -#define OS_WARN_RESULT_NEEDS_RELEASE -#else -#define OS_OBJECT_BRIDGE -#define OS_WARN_RESULT_NEEDS_RELEASE OS_WARN_RESULT -#endif -#if __has_attribute(objc_runtime_visible) && \ - ((defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && \ - __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_12) || \ - (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && \ - !defined(__TV_OS_VERSION_MIN_REQUIRED) && \ - !defined(__WATCH_OS_VERSION_MIN_REQUIRED) && \ - __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0) || \ - (defined(__TV_OS_VERSION_MIN_REQUIRED) && \ - __TV_OS_VERSION_MIN_REQUIRED < __TVOS_10_0) || \ - (defined(__WATCH_OS_VERSION_MIN_REQUIRED) && \ - __WATCH_OS_VERSION_MIN_REQUIRED < __WATCHOS_3_0)) -/* - * To provide backward deployment of ObjC objects in Swift on pre-10.12 - * SDKs, OS_object classes can be marked as OS_OBJECT_OBJC_RUNTIME_VISIBLE. - * When compiling with a deployment target earlier than OS X 10.12 (iOS 10.0, - * tvOS 10.0, watchOS 3.0) the Swift compiler will only refer to this type at - * runtime (using the ObjC runtime). - */ -#define OS_OBJECT_OBJC_RUNTIME_VISIBLE __attribute__((objc_runtime_visible)) -#else -#define OS_OBJECT_OBJC_RUNTIME_VISIBLE -#endif -#ifndef OS_OBJECT_USE_OBJC_RETAIN_RELEASE -#if defined(__clang_analyzer__) -#define OS_OBJECT_USE_OBJC_RETAIN_RELEASE 1 -#elif __has_feature(objc_arc) && !OS_OBJECT_SWIFT3 -#define OS_OBJECT_USE_OBJC_RETAIN_RELEASE 1 -#else -#define OS_OBJECT_USE_OBJC_RETAIN_RELEASE 0 -#endif -#endif -#if OS_OBJECT_SWIFT3 -#define OS_OBJECT_DECL_SWIFT(name) \ - OS_EXPORT OS_OBJECT_OBJC_RUNTIME_VISIBLE \ - OS_OBJECT_DECL_IMPL_CLASS(name, NSObject) -#define OS_OBJECT_DECL_SUBCLASS_SWIFT(name, super) \ - OS_EXPORT OS_OBJECT_OBJC_RUNTIME_VISIBLE \ - OS_OBJECT_DECL_IMPL_CLASS(name, OS_OBJECT_CLASS(super)) -OS_EXPORT OS_OBJECT_OBJC_RUNTIME_VISIBLE -OS_OBJECT_DECL_BASE(object, NSObject); -#endif // OS_OBJECT_SWIFT3 -#else -/*! @parseOnly */ -#define OS_OBJECT_RETURNS_RETAINED -/*! @parseOnly */ -#define OS_OBJECT_CONSUMED -/*! @parseOnly */ -#define OS_OBJECT_BRIDGE -/*! @parseOnly */ -#define OS_WARN_RESULT_NEEDS_RELEASE OS_WARN_RESULT -/*! @parseOnly */ -#define OS_OBJECT_OBJC_RUNTIME_VISIBLE -#define OS_OBJECT_USE_OBJC_RETAIN_RELEASE 0 -#endif - -#if OS_OBJECT_SWIFT3 -#define OS_OBJECT_DECL_CLASS(name) \ - OS_OBJECT_DECL_SUBCLASS_SWIFT(name, object) -#elif OS_OBJECT_USE_OBJC -#define OS_OBJECT_DECL_CLASS(name) \ - OS_OBJECT_DECL(name) -#else -#define OS_OBJECT_DECL_CLASS(name) \ - typedef struct name##_s *name##_t -#endif - -#define OS_OBJECT_GLOBAL_OBJECT(type, object) ((OS_OBJECT_BRIDGE type)&(object)) - -__BEGIN_DECLS - -/*! - * @function os_retain - * - * @abstract - * Increment the reference count of an os_object. - * - * @discussion - * On a platform with the modern Objective-C runtime this is exactly equivalent - * to sending the object the -[retain] message. - * - * @param object - * The object to retain. - * - * @result - * The retained object. - */ -API_AVAILABLE(macos(10.10), ios(8.0)) -OS_EXPORT OS_SWIFT_UNAVAILABLE("Can't be used with ARC") -void* -os_retain(void *object); -#if OS_OBJECT_USE_OBJC -#undef os_retain -#define os_retain(object) [object retain] -#endif - -/*! - * @function os_release - * - * @abstract - * Decrement the reference count of a os_object. - * - * @discussion - * On a platform with the modern Objective-C runtime this is exactly equivalent - * to sending the object the -[release] message. - * - * @param object - * The object to release. - */ -API_AVAILABLE(macos(10.10), ios(8.0)) -OS_EXPORT -void OS_SWIFT_UNAVAILABLE("Can't be used with ARC") -os_release(void *object); -#if OS_OBJECT_USE_OBJC -#undef os_release -#define os_release(object) [object release] -#endif - -__END_DECLS - -#endif \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/os/workgroup.h b/lib/libc/include/x86_64-macos-gnu/os/workgroup.h deleted file mode 100644 index 96b870c10c..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/os/workgroup.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2020 Apple Inc. All rights reserved. - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -#ifndef __OS_WORKGROUP__ -#define __OS_WORKGROUP__ - -#ifndef __DISPATCH_BUILDING_DISPATCH__ -#ifndef __OS_WORKGROUP_INDIRECT__ -#define __OS_WORKGROUP_INDIRECT__ -#endif /* __OS_WORKGROUP_INDIRECT__ */ - -#include -#include -#include -#include - -#undef __OS_WORKGROUP_INDIRECT__ -#endif /* __DISPATCH_BUILDING_DISPATCH__ */ - -#endif /* __OS_WORKGROUP__ */ diff --git a/lib/libc/include/x86_64-macos-gnu/os/workgroup_base.h b/lib/libc/include/x86_64-macos-gnu/os/workgroup_base.h deleted file mode 100644 index 3983f002ae..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/os/workgroup_base.h +++ /dev/null @@ -1,78 +0,0 @@ -#ifndef __OS_WORKGROUP_BASE__ -#define __OS_WORKGROUP_BASE__ - -#ifndef __OS_WORKGROUP_INDIRECT__ -#error "Please #include instead of this file directly." -#endif - -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - -#if __has_feature(assume_nonnull) -#define OS_WORKGROUP_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin") -#define OS_WORKGROUP_ASSUME_NONNULL_END _Pragma("clang assume_nonnull end") -#else -#define OS_WORKGROUP_ASSUME_NONNULL_BEGIN -#define OS_WORKGROUP_ASSUME_NONNULL_END -#endif -#define OS_WORKGROUP_WARN_RESULT __attribute__((__warn_unused_result__)) -#define OS_WORKGROUP_EXPORT OS_EXPORT -#define OS_WORKGROUP_RETURNS_RETAINED OS_OBJECT_RETURNS_RETAINED - -#define OS_WORKGROUP_DECL(name, swift_name) \ - OS_SWIFT_NAME(swift_name) \ - OS_OBJECT_SHOW_CLASS(name, OS_OBJECT_CLASS(object)) - -#if OS_OBJECT_USE_OBJC -#define OS_WORKGROUP_SUBCLASS_DECL_PROTO(name, swift_name, ...) \ - OS_SWIFT_NAME(swift_name) \ - OS_OBJECT_DECL_PROTOCOL(name ## __VA_ARGS__ ) -#else -#define OS_WORKGROUP_SUBCLASS_DECL_PROTO(name, swift_name, ...) -#endif - -#define OS_WORKGROUP_SUBCLASS_DECL(name, super, swift_name, ...) \ - OS_SWIFT_NAME(swift_name) \ - OS_OBJECT_SHOW_SUBCLASS(name, super, name, ## __VA_ARGS__) - -#if defined(__LP64__) -#define __OS_WORKGROUP_ATTR_SIZE__ 60 -#define __OS_WORKGROUP_INTERVAL_DATA_SIZE__ 56 -#define __OS_WORKGROUP_JOIN_TOKEN_SIZE__ 36 -#else -#define __OS_WORKGROUP_ATTR_SIZE__ 60 -#define __OS_WORKGROUP_INTERVAL_DATA_SIZE__ 56 -#define __OS_WORKGROUP_JOIN_TOKEN_SIZE__ 28 -#endif - -#define _OS_WORKGROUP_ATTR_SIG_DEFAULT_INIT 0x2FA863B4 -#define _OS_WORKGROUP_ATTR_SIG_EMPTY_INIT 0x2FA863C4 - -struct OS_REFINED_FOR_SWIFT os_workgroup_attr_opaque_s { - uint32_t sig; - char opaque[__OS_WORKGROUP_ATTR_SIZE__]; -}; - -#define _OS_WORKGROUP_INTERVAL_DATA_SIG_INIT 0x52A74C4D -struct OS_REFINED_FOR_SWIFT os_workgroup_interval_data_opaque_s { - uint32_t sig; - char opaque[__OS_WORKGROUP_INTERVAL_DATA_SIZE__]; -}; - -struct OS_REFINED_FOR_SWIFT os_workgroup_join_token_opaque_s { - uint32_t sig; - char opaque[__OS_WORKGROUP_JOIN_TOKEN_SIZE__]; -}; - -#endif /* __OS_WORKGROUP_BASE__ */ diff --git a/lib/libc/include/x86_64-macos-gnu/os/workgroup_interval.h b/lib/libc/include/x86_64-macos-gnu/os/workgroup_interval.h deleted file mode 100644 index 8594aed529..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/os/workgroup_interval.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright (c) 2020 Apple Inc. All rights reserved. - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -#ifndef __OS_WORKGROUP_INTERVAL__ -#define __OS_WORKGROUP_INTERVAL__ - -#ifndef __OS_WORKGROUP_INDIRECT__ -#error "Please #include instead of this file directly." -#include // For header doc -#endif - -__BEGIN_DECLS - -OS_WORKGROUP_ASSUME_NONNULL_BEGIN - -/*! - * @typedef os_workgroup_interval_t - * - * @abstract - * A subclass of an os_workgroup_t for tracking work performed as part of - * a repeating interval-driven workload. - */ -OS_WORKGROUP_SUBCLASS_DECL_PROTO(os_workgroup_interval, Repeatable); -OS_WORKGROUP_SUBCLASS_DECL(os_workgroup_interval, os_workgroup, WorkGroupInterval); - -/* During the first instance of this API, the only supported interval - * workgroups are for audio workloads. Please refer to the AudioToolbox - * framework for more information. - */ - -/* - * @typedef os_workgroup_interval_data, os_workgroup_interval_data_t - * - * @abstract - * An opaque structure containing additional configuration for the workgroup - * interval. - */ -typedef struct os_workgroup_interval_data_opaque_s os_workgroup_interval_data_s; -typedef struct os_workgroup_interval_data_opaque_s *os_workgroup_interval_data_t; -#define OS_WORKGROUP_INTERVAL_DATA_INITIALIZER \ - { .sig = _OS_WORKGROUP_INTERVAL_DATA_SIG_INIT } - -/*! - * @function os_workgroup_interval_start - * - * @abstract - * Indicates to the system that the member threads of this - * os_workgroup_interval_t have begun working on an instance of the repeatable - * interval workload with the specified timestamps. This function is real time - * safe. - * - * This function will set and return an errno in the following cases: - * - * - The current thread is not a member of the os_workgroup_interval_t - * - The os_workgroup_interval_t has been cancelled - * - The timestamps passed in are malformed - * - os_workgroup_interval_start() was previously called on the - * os_workgroup_interval_t without an intervening os_workgroup_interval_finish() - * - A concurrent workgroup interval configuration operation is taking place. - * - * @param start - * Start timestamp specified in the os_clockid_t with which the - * os_workgroup_interval_t was created. This is generally a time in the past and - * indicates when the workgroup started working on an interval period - * - * @param deadline - * Deadline timestamp specified in the os_clockid_t with which the - * os_workgroup_interval_t was created. This specifies the deadline which the - * interval period would like to meet. - * - * @param data - * This field is currently unused and should be NULL - */ -API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0), watchos(7.0)) -OS_REFINED_FOR_SWIFT OS_WORKGROUP_EXPORT OS_WORKGROUP_WARN_RESULT -int -os_workgroup_interval_start(os_workgroup_interval_t wg, uint64_t start, uint64_t - deadline, os_workgroup_interval_data_t _Nullable data); - -/*! - * @function os_workgroup_interval_update - * - * @abstract - * Updates an already started interval workgroup to have the new - * deadline specified. This function is real time safe. - * - * This function will return an error in the following cases: - * - The current thread is not a member of the os_workgroup_interval_t - * - The os_workgroup_interval_t has been cancelled - * - The timestamp passed in is malformed - * - os_workgroup_interval_start() was not previously called on the - * os_workgroup_interval_t or was already matched with an - * os_workgroup_interval_finish() - * - A concurrent workgroup interval configuration operation is taking place - * - * @param deadline - * Timestamp specified in the os_clockid_t with - * which the os_workgroup_interval_t was created. - * - * @param data - * This field is currently unused and should be NULL - */ -API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0), watchos(7.0)) -OS_REFINED_FOR_SWIFT OS_WORKGROUP_EXPORT OS_WORKGROUP_WARN_RESULT -int -os_workgroup_interval_update(os_workgroup_interval_t wg, uint64_t deadline, - os_workgroup_interval_data_t _Nullable data); - -/*! - * @function os_workgroup_interval_finish - * - * @abstract - * Indicates to the system that the member threads of - * this os_workgroup_interval_t have finished working on the current instance - * of the interval workload. This function is real time safe. - * - * This function will return an error in the following cases: - * - The current thread is not a member of the os_workgroup_interval_t - * - os_workgroup_interval_start() was not previously called on the - * os_workgroup_interval_t or was already matched with an - * os_workgroup_interval_finish() - * - A concurrent workgroup interval configuration operation is taking place. - * - * @param data - * This field is currently unused and should be NULL - * - */ -API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0), watchos(7.0)) -OS_REFINED_FOR_SWIFT OS_WORKGROUP_EXPORT OS_WORKGROUP_WARN_RESULT -int -os_workgroup_interval_finish(os_workgroup_interval_t wg, - os_workgroup_interval_data_t _Nullable data); - -OS_WORKGROUP_ASSUME_NONNULL_END - -__END_DECLS - -#endif /* __OS_WORKGROUP_INTERVAL__ */ diff --git a/lib/libc/include/x86_64-macos-gnu/os/workgroup_object.h b/lib/libc/include/x86_64-macos-gnu/os/workgroup_object.h deleted file mode 100644 index 984d3e2e80..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/os/workgroup_object.h +++ /dev/null @@ -1,357 +0,0 @@ -/* - * Copyright (c) 2020 Apple Inc. All rights reserved. - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -#ifndef __OS_WORKGROUP_OBJECT__ -#define __OS_WORKGROUP_OBJECT__ - -#ifndef __OS_WORKGROUP_INDIRECT__ -#error "Please #include instead of this file directly." -#include // For header doc -#endif - -__BEGIN_DECLS - -OS_WORKGROUP_ASSUME_NONNULL_BEGIN - -/*! - * @typedef os_workgroup_t - * - * @abstract - * A reference counted os object representing a workload that needs to - * be distinctly recognized and tracked by the system. The workgroup - * tracks a collection of threads all working cooperatively. An os_workgroup - * object - when not an instance of a specific os_workgroup_t subclass - - * represents a generic workload and makes no assumptions about the kind of - * work done. - * - * @discussion - * Threads can explicitly join an os_workgroup_t to mark themselves as - * participants in the workload. - */ -OS_WORKGROUP_DECL(os_workgroup, WorkGroup); - - -/* Attribute creation and specification */ - -/*! - * @typedef os_workgroup_attr_t - * - * @abstract - * Pointer to an opaque structure for describing attributes that can be - * configured on a workgroup at creation. - */ -typedef struct os_workgroup_attr_opaque_s os_workgroup_attr_s; -typedef struct os_workgroup_attr_opaque_s *os_workgroup_attr_t; - -/* os_workgroup_t attributes need to be initialized before use. This initializer - * allows you to create a workgroup with the system default attributes. */ -#define OS_WORKGROUP_ATTR_INITIALIZER_DEFAULT \ - { .sig = _OS_WORKGROUP_ATTR_SIG_DEFAULT_INIT } - - - -/* The main use of the workgroup API is through instantiations of the concrete - * subclasses - please refer to os/workgroup_interval.h and - * os/workgroup_parallel.h for more information on creating workgroups. - * - * The functions below operate on all subclasses of os_workgroup_t. - */ - -/*! - * @function os_workgroup_copy_port - * - * @abstract - * Returns a reference to a send right representing this workgroup that is to be - * sent to other processes. This port is to be passed to - * os_workgroup_create_with_port() to create a workgroup object. - * - * It is the client's responsibility to release the send right reference. - * - * If an error is encountered, errno is set and returned. - */ -API_AVAILABLE(macos(11.0)) -API_UNAVAILABLE(ios, tvos, watchos) -OS_REFINED_FOR_SWIFT OS_WORKGROUP_EXPORT OS_WORKGROUP_WARN_RESULT -int -os_workgroup_copy_port(os_workgroup_t wg, mach_port_t *mach_port_out); - -/*! - * @function os_workgroup_create_with_port - * - * @abstract - * Create an os_workgroup_t object from a send right returned by a previous - * call to os_workgroup_copy_port, potentially in a different process. - * - * A newly created os_workgroup_t has no initial member threads - in particular - * the creating thread does not join the os_workgroup_t implicitly. - * - * @param name - * A client specified string for labelling the workgroup. This parameter is - * optional and can be NULL. - * - * @param mach_port - * The send right to create the workgroup from. No reference is consumed - * on the specified send right. - */ -API_AVAILABLE(macos(11.0)) -API_UNAVAILABLE(ios, tvos, watchos) -OS_SWIFT_NAME(WorkGroup.init(__name:port:)) OS_WORKGROUP_EXPORT OS_WORKGROUP_RETURNS_RETAINED -os_workgroup_t _Nullable -os_workgroup_create_with_port(const char *_Nullable name, mach_port_t mach_port); - -/*! - * @function os_workgroup_create_with_workgroup - * - * @abstract - * Create a new os_workgroup object from an existing os_workgroup. - * - * The newly created os_workgroup has no initial member threads - in particular - * the creating threaad does not join the os_workgroup_t implicitly. - * - * @param name - * A client specified string for labelling the workgroup. This parameter is - * optional and can be NULL. - * - * @param wg - * The existing workgroup to create a new workgroup object from. - */ -API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0), watchos(7.0)) -OS_REFINED_FOR_SWIFT OS_WORKGROUP_EXPORT OS_WORKGROUP_RETURNS_RETAINED -os_workgroup_t _Nullable -os_workgroup_create_with_workgroup(const char * _Nullable name, os_workgroup_t wg); - -/*! - * @typedef os_workgroup_join_token, os_workgroup_join_token_t - * - * @abstract - * An opaque join token which the client needs to pass to os_workgroup_join - * and os_workgroup_leave - */ -OS_REFINED_FOR_SWIFT -typedef struct os_workgroup_join_token_opaque_s os_workgroup_join_token_s; -OS_REFINED_FOR_SWIFT -typedef struct os_workgroup_join_token_opaque_s *os_workgroup_join_token_t; - - -/*! - * @function os_workgroup_join - * - * @abstract - * Joins the current thread to the specified workgroup and populates the join - * token that has been passed in. This API is real-time safe. - * - * @param wg - * The workgroup that the current thread would like to join - * - * @param token_out - * Pointer to a client allocated struct which the function will populate - * with the join token. This token must be passed in by the thread when it calls - * os_workgroup_leave(). - * - * Errors will be returned in the following cases: - * - * EALREADY The thread is already part of a workgroup that the specified - * workgroup does not nest with - * EINVAL The workgroup has been cancelled - */ -API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0), watchos(7.0)) -OS_REFINED_FOR_SWIFT OS_WORKGROUP_EXPORT OS_WORKGROUP_WARN_RESULT -int -os_workgroup_join(os_workgroup_t wg, os_workgroup_join_token_t token_out); - -/*! - * @function os_workgroup_leave - * - * @abstract - * This removes the current thread from a workgroup it has previously - * joined. Threads must leave all workgroups in the reverse order that they - * have joined them. Failing to do so before exiting will result in undefined - * behavior. - * - * If the join token is malformed, the process will be aborted. - * - * This API is real time safe. - * - * @param wg - * The workgroup that the current thread would like to leave. - * - * @param token - * This is the join token populated by the most recent call to - * os_workgroup_join(). - */ -API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0), watchos(7.0)) -OS_REFINED_FOR_SWIFT OS_WORKGROUP_EXPORT -void -os_workgroup_leave(os_workgroup_t wg, os_workgroup_join_token_t token); - -/* Working Arena index of a thread in a workgroup */ -typedef uint32_t os_workgroup_index; -/* Destructor for Working Arena */ -typedef void (*os_workgroup_working_arena_destructor_t)(void * _Nullable); - -/*! - * @function os_workgroup_set_working_arena - * - * @abstract - * Associates a client defined working arena with the workgroup. The arena - * is local to the workgroup object in the process. This is intended for - * distributing a manually managed memory allocation between member threads - * of the workgroup. - * - * This function can be called multiple times and the client specified - * destructor will be called on the previously assigned arena, if any. This - * function can only be called when no threads have currently joined the - * workgroup and all workloops associated with the workgroup are idle. - * - * @param wg - * The workgroup to associate the working arena with - * - * @param arena - * The client managed arena to associate with the workgroup. This value can - * be NULL. - * - * @param max_workers - * The maximum number of threads that will ever query the workgroup for the - * arena and request an index into it. If the arena is not used to partition - * work amongst member threads, then this field can be 0. - * - * @param destructor - * A destructor to call on the previously assigned working arena, if any - */ -API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0), watchos(7.0)) -OS_REFINED_FOR_SWIFT OS_WORKGROUP_EXPORT OS_WORKGROUP_WARN_RESULT -int -os_workgroup_set_working_arena(os_workgroup_t wg, void * _Nullable arena, - uint32_t max_workers, os_workgroup_working_arena_destructor_t destructor); - -/*! - * @function os_workgroup_get_working_arena - * - * @abstract - * Returns the working arena associated with the workgroup and the current - * thread's index in the workgroup. This function can only be called by a member - * of the workgroup. Multiple calls to this API by a member thread will return - * the same arena and index until the thread leaves the workgroup. - * - * For workloops with an associated workgroup, every work item on the workloop - * will receive the same index in the arena. - * - * This method returns NULL if no arena is set on the workgroup. The index - * returned by this function is zero-based and is namespaced per workgroup - * object in the process. The indices provided are strictly monotonic and never - * reused until a future call to os_workgroup_set_working_arena. - * - * @param wg - * The workgroup to get the working arena from. - * - * @param index_out - * A pointer to a os_workgroup_index which will be populated by the caller's - * index in the workgroup. - */ -API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0), watchos(7.0)) -OS_REFINED_FOR_SWIFT OS_WORKGROUP_EXPORT -void * _Nullable -os_workgroup_get_working_arena(os_workgroup_t wg, - os_workgroup_index * _Nullable index_out); - -/*! - * @function os_workgroup_cancel - * - * @abstract - * This API invalidates a workgroup and indicates to the system that the - * workload is no longer relevant to the caller. - * - * No new work should be initiated for a cancelled workgroup and - * work that is already underway should periodically check for - * cancellation with os_workgroup_testcancel and initiate cleanup if needed. - * - * Threads currently in the workgroup continue to be tracked together but no - * new threads may join this workgroup - the only possible operation allowed is - * to leave the workgroup. Other actions may have undefined behavior or - * otherwise fail. - * - * This API is idempotent. Cancellation is local to the workgroup object - * it is called on and does not affect other workgroups. - * - * @param wg - * The workgroup that that the thread would like to cancel - */ -API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0), watchos(7.0)) -OS_REFINED_FOR_SWIFT OS_WORKGROUP_EXPORT -void -os_workgroup_cancel(os_workgroup_t wg); - -/*! - * @function os_workgroup_testcancel - * - * @abstract - * Returns true if the workgroup object has been cancelled. See also - * os_workgroup_cancel - */ -API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0), watchos(7.0)) -OS_REFINED_FOR_SWIFT OS_WORKGROUP_EXPORT -bool -os_workgroup_testcancel(os_workgroup_t wg); - -/*! - * @typedef os_workgroup_max_parallel_threads_attr_t - * - * @abstract - * A pointer to a structure describing the set of properties of a workgroup to - * override with the explicitly specified values in the structure. - * - * See also os_workgroup_max_parallel_threads. - */ -OS_REFINED_FOR_SWIFT -typedef struct os_workgroup_max_parallel_threads_attr_s os_workgroup_mpt_attr_s; -OS_REFINED_FOR_SWIFT -typedef struct os_workgroup_max_parallel_threads_attr_s *os_workgroup_mpt_attr_t; - -/*! - * @function os_workgroup_max_parallel_threads - * - * @abstract - * Returns the system's recommendation for maximum number of threads the client - * should make for a multi-threaded workload in a given workgroup. - * - * This API takes into consideration the current hardware the code is running on - * and the attributes of the workgroup. It does not take into consideration the - * current load of the system and therefore always provides the most optimal - * recommendation for the workload. - * - * @param wg - * The workgroup in which the multi-threaded workload will be performed in. The - * threads performing the multi-threaded workload are expected to join this - * workgroup. - * - * @param attr - * This value is currently unused and should be NULL. - */ -API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0), watchos(7.0)) -OS_REFINED_FOR_SWIFT OS_WORKGROUP_EXPORT -int -os_workgroup_max_parallel_threads(os_workgroup_t wg, os_workgroup_mpt_attr_t - _Nullable attr); - -OS_WORKGROUP_ASSUME_NONNULL_END - -__END_DECLS - -#endif /* __OS_WORKGROUP_OBJECT__ */ diff --git a/lib/libc/include/x86_64-macos-gnu/os/workgroup_parallel.h b/lib/libc/include/x86_64-macos-gnu/os/workgroup_parallel.h deleted file mode 100644 index 48d232e47a..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/os/workgroup_parallel.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2020 Apple Inc. All rights reserved. - * - * @APPLE_APACHE_LICENSE_HEADER_START@ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @APPLE_APACHE_LICENSE_HEADER_END@ - */ - -#ifndef __OS_WORKGROUP_PARALLEL__ -#define __OS_WORKGROUP_PARALLEL__ - -#ifndef __OS_WORKGROUP_INDIRECT__ -#error "Please #include instead of this file directly." -#include // For header doc -#endif - -#include - -__BEGIN_DECLS - -OS_WORKGROUP_ASSUME_NONNULL_BEGIN - -/*! - * @typedef os_workgroup_parallel_t - * - * @abstract - * A subclass of an os_workgroup_t for tracking parallel work. - */ -OS_WORKGROUP_SUBCLASS_DECL_PROTO(os_workgroup_parallel, Parallelizable); -OS_WORKGROUP_SUBCLASS_DECL(os_workgroup_parallel, os_workgroup, WorkGroupParallel); - -/*! - * @function os_workgroup_parallel_create - * - * @abstract - * Creates an os_workgroup_t which tracks a parallel workload. - * A newly created os_workgroup_interval_t has no initial member threads - - * in particular the creating thread does not join the os_workgroup_parallel_t - * implicitly. - * - * See also os_workgroup_max_parallel_threads(). - * - * @param name - * A client specified string for labelling the workgroup. This parameter is - * optional and can be NULL. - * - * @param attr - * The requested set of workgroup attributes. NULL is to be specified for the - * default set of attributes. - */ -API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0), watchos(7.0)) -OS_WORKGROUP_EXPORT OS_WORKGROUP_RETURNS_RETAINED -OS_SWIFT_NAME(WorkGroupParallel.init(__name:attr:)) -os_workgroup_parallel_t _Nullable -os_workgroup_parallel_create(const char * _Nullable name, - os_workgroup_attr_t _Nullable attr); - -OS_WORKGROUP_ASSUME_NONNULL_END - -__END_DECLS - -#endif /* __OS_WORKGROUP_PARALLEL__ */ diff --git a/lib/libc/include/x86_64-macos-gnu/pthread.h b/lib/libc/include/x86_64-macos-gnu/pthread.h deleted file mode 100644 index 0826a7dc70..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/pthread.h +++ /dev/null @@ -1,568 +0,0 @@ -/* - * Copyright (c) 2000-2012 Apple Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ -/* - * Copyright 1996 1995 by Open Software Foundation, Inc. 1997 1996 1995 1994 1993 1992 1991 - * All Rights Reserved - * - * Permission to use, copy, modify, and distribute this software and - * its documentation for any purpose and without fee is hereby granted, - * provided that the above copyright notice appears in all copies and - * that both the copyright notice and this permission notice appear in - * supporting documentation. - * - * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE. - * - * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, - * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION - * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - */ -/* - * MkLinux - */ - -/* - * POSIX Threads - IEEE 1003.1c - */ - -#ifndef _PTHREAD_H -#define _PTHREAD_H - -#include <_types.h> -#ifndef __POSIX_LIB__ -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#if (!defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || defined(_DARWIN_C_SOURCE) || defined(__cplusplus) - -#include -#include - -#endif /* (!_POSIX_C_SOURCE && !_XOPEN_SOURCE) || _DARWIN_C_SOURCE || __cplusplus */ - -/* - * These symbols indicate which [optional] features are available - * They can be tested at compile time via '#ifdef XXX' - * The way to check for pthreads is like so: - - * #include - * #ifdef _POSIX_THREADS - * #include - * #endif - - */ - -/* These will be moved to unistd.h */ - -/* - * Note: These data structures are meant to be opaque. Only enough - * structure is exposed to support initializers. - * All of the typedefs will be moved to - */ - -#include -#include - -#if __has_feature(assume_nonnull) -_Pragma("clang assume_nonnull begin") -#endif -__BEGIN_DECLS -/* - * Threads - */ - - -/* - * Cancel cleanup handler management. Note, since these are implemented as macros, - * they *MUST* occur in matched pairs! - */ - -#define pthread_cleanup_push(func, val) \ - { \ - struct __darwin_pthread_handler_rec __handler; \ - pthread_t __self = pthread_self(); \ - __handler.__routine = func; \ - __handler.__arg = val; \ - __handler.__next = __self->__cleanup_stack; \ - __self->__cleanup_stack = &__handler; - -#define pthread_cleanup_pop(execute) \ - /* Note: 'handler' must be in this same lexical context! */ \ - __self->__cleanup_stack = __handler.__next; \ - if (execute) (__handler.__routine)(__handler.__arg); \ - } - -/* - * Thread attributes - */ - -#define PTHREAD_CREATE_JOINABLE 1 -#define PTHREAD_CREATE_DETACHED 2 - -#define PTHREAD_INHERIT_SCHED 1 -#define PTHREAD_EXPLICIT_SCHED 2 - -#define PTHREAD_CANCEL_ENABLE 0x01 /* Cancel takes place at next cancellation point */ -#define PTHREAD_CANCEL_DISABLE 0x00 /* Cancel postponed */ -#define PTHREAD_CANCEL_DEFERRED 0x02 /* Cancel waits until cancellation point */ -#define PTHREAD_CANCEL_ASYNCHRONOUS 0x00 /* Cancel occurs immediately */ - -/* Value returned from pthread_join() when a thread is canceled */ -#define PTHREAD_CANCELED ((void *) 1) - -/* We only support PTHREAD_SCOPE_SYSTEM */ -#define PTHREAD_SCOPE_SYSTEM 1 -#define PTHREAD_SCOPE_PROCESS 2 - -#define PTHREAD_PROCESS_SHARED 1 -#define PTHREAD_PROCESS_PRIVATE 2 - -/* - * Mutex protocol attributes - */ -#define PTHREAD_PRIO_NONE 0 -#define PTHREAD_PRIO_INHERIT 1 -#define PTHREAD_PRIO_PROTECT 2 - -/* - * Mutex type attributes - */ -#define PTHREAD_MUTEX_NORMAL 0 -#define PTHREAD_MUTEX_ERRORCHECK 1 -#define PTHREAD_MUTEX_RECURSIVE 2 -#define PTHREAD_MUTEX_DEFAULT PTHREAD_MUTEX_NORMAL - -/* - * Mutex policy attributes - */ -#define PTHREAD_MUTEX_POLICY_FAIRSHARE_NP 1 -#define PTHREAD_MUTEX_POLICY_FIRSTFIT_NP 3 - -/* - * RWLock variables - */ -#define PTHREAD_RWLOCK_INITIALIZER {_PTHREAD_RWLOCK_SIG_init, {0}} - -/* - * Mutex variables - */ -#define PTHREAD_MUTEX_INITIALIZER {_PTHREAD_MUTEX_SIG_init, {0}} - -/* */ -#if ((__MAC_OS_X_VERSION_MIN_REQUIRED && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070) || (__IPHONE_OS_VERSION_MIN_REQUIRED && __IPHONE_OS_VERSION_MIN_REQUIRED >= 50000)) || defined(__DRIVERKIT_VERSION_MIN_REQUIRED) -# if (!defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || defined(_DARWIN_C_SOURCE) -# define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER {_PTHREAD_ERRORCHECK_MUTEX_SIG_init, {0}} -# define PTHREAD_RECURSIVE_MUTEX_INITIALIZER {_PTHREAD_RECURSIVE_MUTEX_SIG_init, {0}} -# endif /* (!_POSIX_C_SOURCE && !_XOPEN_SOURCE) || _DARWIN_C_SOURCE */ -#endif - -/* */ -#define _PTHREAD_SWIFT_IMPORTER_NULLABILITY_COMPAT \ - defined(SWIFT_CLASS_EXTRA) && (!defined(SWIFT_SDK_OVERLAY_PTHREAD_EPOCH) || (SWIFT_SDK_OVERLAY_PTHREAD_EPOCH < 1)) - -/* - * Condition variable attributes - */ - -/* - * Condition variables - */ - -#define PTHREAD_COND_INITIALIZER {_PTHREAD_COND_SIG_init, {0}} - -/* - * Initialization control (once) variables - */ - -#define PTHREAD_ONCE_INIT {_PTHREAD_ONCE_SIG_init, {0}} - -/* - * Prototypes for all PTHREAD interfaces - */ -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_atfork(void (* _Nullable)(void), void (* _Nullable)(void), - void (* _Nullable)(void)); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_attr_destroy(pthread_attr_t *); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_attr_getdetachstate(const pthread_attr_t *, int *); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_attr_getguardsize(const pthread_attr_t * __restrict, size_t * __restrict); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_attr_getinheritsched(const pthread_attr_t * __restrict, int * __restrict); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_attr_getschedparam(const pthread_attr_t * __restrict, - struct sched_param * __restrict); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_attr_getschedpolicy(const pthread_attr_t * __restrict, int * __restrict); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_attr_getscope(const pthread_attr_t * __restrict, int * __restrict); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_attr_getstack(const pthread_attr_t * __restrict, - void * _Nullable * _Nonnull __restrict, size_t * __restrict); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_attr_getstackaddr(const pthread_attr_t * __restrict, - void * _Nullable * _Nonnull __restrict); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_attr_getstacksize(const pthread_attr_t * __restrict, size_t * __restrict); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_attr_init(pthread_attr_t *); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_attr_setdetachstate(pthread_attr_t *, int); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_attr_setguardsize(pthread_attr_t *, size_t); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_attr_setinheritsched(pthread_attr_t *, int); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_attr_setschedparam(pthread_attr_t * __restrict, - const struct sched_param * __restrict); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_attr_setschedpolicy(pthread_attr_t *, int); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_attr_setscope(pthread_attr_t *, int); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_attr_setstack(pthread_attr_t *, void *, size_t); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_attr_setstackaddr(pthread_attr_t *, void *); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_attr_setstacksize(pthread_attr_t *, size_t); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_cancel(pthread_t) __DARWIN_ALIAS(pthread_cancel); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_cond_broadcast(pthread_cond_t *); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_cond_destroy(pthread_cond_t *); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_cond_init( - pthread_cond_t * __restrict, - const pthread_condattr_t * _Nullable __restrict) - __DARWIN_ALIAS(pthread_cond_init); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_cond_signal(pthread_cond_t *); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_cond_timedwait( - pthread_cond_t * __restrict, pthread_mutex_t * __restrict, - const struct timespec * _Nullable __restrict) - __DARWIN_ALIAS_C(pthread_cond_timedwait); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_cond_wait(pthread_cond_t * __restrict, - pthread_mutex_t * __restrict) __DARWIN_ALIAS_C(pthread_cond_wait); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_condattr_destroy(pthread_condattr_t *); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_condattr_init(pthread_condattr_t *); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_condattr_getpshared(const pthread_condattr_t * __restrict, - int * __restrict); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_condattr_setpshared(pthread_condattr_t *, int); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -#if !_PTHREAD_SWIFT_IMPORTER_NULLABILITY_COMPAT -int pthread_create(pthread_t _Nullable * _Nonnull __restrict, - const pthread_attr_t * _Nullable __restrict, - void * _Nullable (* _Nonnull)(void * _Nullable), - void * _Nullable __restrict); -#else -int pthread_create(pthread_t * __restrict, - const pthread_attr_t * _Nullable __restrict, - void *(* _Nonnull)(void *), void * _Nullable __restrict); -#endif // _PTHREAD_SWIFT_IMPORTER_NULLABILITY_COMPAT - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_detach(pthread_t); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_equal(pthread_t _Nullable, pthread_t _Nullable); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -void pthread_exit(void * _Nullable) __dead2; - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_getconcurrency(void); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_getschedparam(pthread_t , int * _Nullable __restrict, - struct sched_param * _Nullable __restrict); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -void* _Nullable pthread_getspecific(pthread_key_t); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_join(pthread_t , void * _Nullable * _Nullable) - __DARWIN_ALIAS_C(pthread_join); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_key_create(pthread_key_t *, void (* _Nullable)(void *)); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_key_delete(pthread_key_t); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_mutex_destroy(pthread_mutex_t *); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_mutex_getprioceiling(const pthread_mutex_t * __restrict, - int * __restrict); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_mutex_init(pthread_mutex_t * __restrict, - const pthread_mutexattr_t * _Nullable __restrict); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_mutex_lock(pthread_mutex_t *); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_mutex_setprioceiling(pthread_mutex_t * __restrict, int, - int * __restrict); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_mutex_trylock(pthread_mutex_t *); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_mutex_unlock(pthread_mutex_t *); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_mutexattr_destroy(pthread_mutexattr_t *) __DARWIN_ALIAS(pthread_mutexattr_destroy); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_mutexattr_getprioceiling(const pthread_mutexattr_t * __restrict, - int * __restrict); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_mutexattr_getprotocol(const pthread_mutexattr_t * __restrict, - int * __restrict); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_mutexattr_getpshared(const pthread_mutexattr_t * __restrict, - int * __restrict); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_mutexattr_gettype(const pthread_mutexattr_t * __restrict, - int * __restrict); - -__API_AVAILABLE(macos(10.13.4), ios(11.3), watchos(4.3), tvos(11.3)) -int pthread_mutexattr_getpolicy_np(const pthread_mutexattr_t * __restrict, - int * __restrict); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_mutexattr_init(pthread_mutexattr_t *); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_mutexattr_setprioceiling(pthread_mutexattr_t *, int); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_mutexattr_setprotocol(pthread_mutexattr_t *, int); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_mutexattr_setpshared(pthread_mutexattr_t *, int); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_mutexattr_settype(pthread_mutexattr_t *, int); - -__API_AVAILABLE(macos(10.7), ios(5.0)) -int pthread_mutexattr_setpolicy_np(pthread_mutexattr_t *, int); - -__SWIFT_UNAVAILABLE_MSG("Use lazily initialized globals instead") -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_once(pthread_once_t *, void (* _Nonnull)(void)); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_rwlock_destroy(pthread_rwlock_t * ) __DARWIN_ALIAS(pthread_rwlock_destroy); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_rwlock_init(pthread_rwlock_t * __restrict, - const pthread_rwlockattr_t * _Nullable __restrict) - __DARWIN_ALIAS(pthread_rwlock_init); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_rwlock_rdlock(pthread_rwlock_t *) __DARWIN_ALIAS(pthread_rwlock_rdlock); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_rwlock_tryrdlock(pthread_rwlock_t *) __DARWIN_ALIAS(pthread_rwlock_tryrdlock); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_rwlock_trywrlock(pthread_rwlock_t *) __DARWIN_ALIAS(pthread_rwlock_trywrlock); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_rwlock_wrlock(pthread_rwlock_t *) __DARWIN_ALIAS(pthread_rwlock_wrlock); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_rwlock_unlock(pthread_rwlock_t *) __DARWIN_ALIAS(pthread_rwlock_unlock); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_rwlockattr_destroy(pthread_rwlockattr_t *); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t * __restrict, - int * __restrict); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_rwlockattr_init(pthread_rwlockattr_t *); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *, int); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -pthread_t pthread_self(void); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_setcancelstate(int , int * _Nullable) - __DARWIN_ALIAS(pthread_setcancelstate); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_setcanceltype(int , int * _Nullable) - __DARWIN_ALIAS(pthread_setcanceltype); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_setconcurrency(int); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_setschedparam(pthread_t, int, const struct sched_param *); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_setspecific(pthread_key_t , const void * _Nullable); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -void pthread_testcancel(void) __DARWIN_ALIAS(pthread_testcancel); - -#if (!defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || defined(_DARWIN_C_SOURCE) || defined(__cplusplus) - -/* returns non-zero if pthread_create or cthread_fork have been called */ -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_is_threaded_np(void); - -__API_AVAILABLE(macos(10.6), ios(3.2)) -int pthread_threadid_np(pthread_t _Nullable,__uint64_t* _Nullable); - -/*SPI to set and get pthread name*/ -__API_AVAILABLE(macos(10.6), ios(3.2)) -int pthread_getname_np(pthread_t,char*,size_t); - -__API_AVAILABLE(macos(10.6), ios(3.2)) -int pthread_setname_np(const char*); - -/* returns non-zero if the current thread is the main thread */ -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_main_np(void); - -/* return the mach thread bound to the pthread */ -__API_AVAILABLE(macos(10.4), ios(2.0)) -mach_port_t pthread_mach_thread_np(pthread_t); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -size_t pthread_get_stacksize_np(pthread_t); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -void* pthread_get_stackaddr_np(pthread_t); - -/* Like pthread_cond_signal(), but only wake up the specified pthread */ -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_cond_signal_thread_np(pthread_cond_t *, pthread_t _Nullable); - -/* Like pthread_cond_timedwait, but use a relative timeout */ -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_cond_timedwait_relative_np(pthread_cond_t *, pthread_mutex_t *, - const struct timespec * _Nullable); - -/* Like pthread_create(), but leaves the thread suspended */ -__API_AVAILABLE(macos(10.4), ios(2.0)) -#if !_PTHREAD_SWIFT_IMPORTER_NULLABILITY_COMPAT -int pthread_create_suspended_np( - pthread_t _Nullable * _Nonnull, const pthread_attr_t * _Nullable, - void * _Nullable (* _Nonnull)(void * _Nullable), void * _Nullable); -#else -int pthread_create_suspended_np(pthread_t *, const pthread_attr_t * _Nullable, - void *(* _Nonnull)(void *), void * _Nullable); -#endif - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_kill(pthread_t, int); - -__API_AVAILABLE(macos(10.5), ios(2.0)) -_Nullable pthread_t pthread_from_mach_thread_np(mach_port_t); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -int pthread_sigmask(int, const sigset_t * _Nullable, sigset_t * _Nullable) - __DARWIN_ALIAS(pthread_sigmask); - -__API_AVAILABLE(macos(10.4), ios(2.0)) -void pthread_yield_np(void); - -#endif /* (!_POSIX_C_SOURCE && !_XOPEN_SOURCE) || _DARWIN_C_SOURCE || __cplusplus */ -__END_DECLS -#if __has_feature(assume_nonnull) -_Pragma("clang assume_nonnull end") -#endif - -#endif /* _PTHREAD_H */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/pthread/sched.h b/lib/libc/include/x86_64-macos-gnu/pthread/sched.h deleted file mode 100644 index 3c49e7980d..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/pthread/sched.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2000-2003 Apple Computer, Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - -#ifndef _SCHED_H_ -#define _SCHED_H_ - -#include -#include - -__BEGIN_DECLS -/* - * Scheduling paramters - */ -#ifndef __POSIX_LIB__ -struct sched_param { int sched_priority; char __opaque[__SCHED_PARAM_SIZE__]; }; -#endif - -extern int sched_yield(void); -extern int sched_get_priority_min(int); -extern int sched_get_priority_max(int); -__END_DECLS - -#endif /* _SCHED_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/pthread_impl.h b/lib/libc/include/x86_64-macos-gnu/pthread_impl.h deleted file mode 100644 index aae74c2c03..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/pthread_impl.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2000-2003 Apple Computer, Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - -#ifndef _PTHREAD_IMPL_H_ -#define _PTHREAD_IMPL_H_ -/* - * Internal implementation details - */ - -/* This whole header file will disappear, so don't depend on it... */ - -#if __has_feature(assume_nonnull) -_Pragma("clang assume_nonnull begin") -#endif - -#ifndef __POSIX_LIB__ - -/* - * [Internal] data structure signatures - */ -#define _PTHREAD_MUTEX_SIG_init 0x32AAABA7 - -#define _PTHREAD_ERRORCHECK_MUTEX_SIG_init 0x32AAABA1 -#define _PTHREAD_RECURSIVE_MUTEX_SIG_init 0x32AAABA2 -#define _PTHREAD_FIRSTFIT_MUTEX_SIG_init 0x32AAABA3 - -#define _PTHREAD_COND_SIG_init 0x3CB0B1BB -#define _PTHREAD_ONCE_SIG_init 0x30B1BCBA -#define _PTHREAD_RWLOCK_SIG_init 0x2DA8B3B4 - -/* - * POSIX scheduling policies - */ -#define SCHED_OTHER 1 -#define SCHED_FIFO 4 -#define SCHED_RR 2 - -#define __SCHED_PARAM_SIZE__ 4 - -#endif /* __POSIX_LIB__ */ - -#if __has_feature(assume_nonnull) -_Pragma("clang assume_nonnull end") -#endif - -#endif /* _PTHREAD_IMPL_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sched.h b/lib/libc/include/x86_64-macos-gnu/sched.h deleted file mode 100644 index 3c49e7980d..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sched.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2000-2003 Apple Computer, Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - -#ifndef _SCHED_H_ -#define _SCHED_H_ - -#include -#include - -__BEGIN_DECLS -/* - * Scheduling paramters - */ -#ifndef __POSIX_LIB__ -struct sched_param { int sched_priority; char __opaque[__SCHED_PARAM_SIZE__]; }; -#endif - -extern int sched_yield(void); -extern int sched_get_priority_min(int); -extern int sched_get_priority_max(int); -__END_DECLS - -#endif /* _SCHED_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/signal.h b/lib/libc/include/x86_64-macos-gnu/signal.h deleted file mode 100644 index dbc5b35f2b..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/signal.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)signal.h 8.3 (Berkeley) 3/30/94 - */ - -#ifndef _USER_SIGNAL_H -#define _USER_SIGNAL_H - -#include -#include <_types.h> -#include - -#include -#include - -#if !defined(_ANSI_SOURCE) && (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)) -extern __const char *__const sys_signame[NSIG]; -extern __const char *__const sys_siglist[NSIG]; -#endif - -__BEGIN_DECLS -int raise(int); -__END_DECLS - -#ifndef _ANSI_SOURCE -__BEGIN_DECLS -void (* _Nullable bsd_signal(int, void (* _Nullable)(int)))(int); -int kill(pid_t, int) __DARWIN_ALIAS(kill); -int killpg(pid_t, int) __DARWIN_ALIAS(killpg); -int pthread_kill(pthread_t, int); -int pthread_sigmask(int, const sigset_t *, sigset_t *) __DARWIN_ALIAS(pthread_sigmask); -int sigaction(int, const struct sigaction * __restrict, - struct sigaction * __restrict); -int sigaddset(sigset_t *, int); -int sigaltstack(const stack_t * __restrict, stack_t * __restrict) __DARWIN_ALIAS(sigaltstack) __WATCHOS_PROHIBITED __TVOS_PROHIBITED; -int sigdelset(sigset_t *, int); -int sigemptyset(sigset_t *); -int sigfillset(sigset_t *); -int sighold(int); -int sigignore(int); -int siginterrupt(int, int); -int sigismember(const sigset_t *, int); -int sigpause(int) __DARWIN_ALIAS_C(sigpause); -int sigpending(sigset_t *); -int sigprocmask(int, const sigset_t * __restrict, sigset_t * __restrict); -int sigrelse(int); -void (* _Nullable sigset(int, void (* _Nullable)(int)))(int); -int sigsuspend(const sigset_t *) __DARWIN_ALIAS_C(sigsuspend); -int sigwait(const sigset_t * __restrict, int * __restrict) __DARWIN_ALIAS_C(sigwait); -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -void psignal(unsigned int, const char *); -int sigblock(int); -int sigsetmask(int); -int sigvec(int, struct sigvec *, struct sigvec *); -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ -__END_DECLS - -/* List definitions after function declarations, or Reiser cpp gets upset. */ -#if defined(__i386__) || defined(__x86_64__) -/* The left shift operator on intel is modulo 32 */ -__header_always_inline int -__sigbits(int __signo) -{ - return __signo > __DARWIN_NSIG ? 0 : (1 << (__signo - 1)); -} -#else /* !__i386__ && !__x86_64__ */ -#define __sigbits(signo) (1 << ((signo) - 1)) -#endif /* __i386__ || __x86_64__ */ - -#define sigaddset(set, signo) (*(set) |= __sigbits(signo), 0) -#define sigdelset(set, signo) (*(set) &= ~__sigbits(signo), 0) -#define sigismember(set, signo) ((*(set) & __sigbits(signo)) != 0) -#define sigemptyset(set) (*(set) = 0, 0) -#define sigfillset(set) (*(set) = ~(sigset_t)0, 0) -#endif /* !_ANSI_SOURCE */ - -#endif /* !_USER_SIGNAL_H */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/simd/common.h b/lib/libc/include/x86_64-macos-gnu/simd/common.h deleted file mode 100644 index 4c2f4d0760..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/simd/common.h +++ /dev/null @@ -1,4458 +0,0 @@ -/*! @header - * The interfaces declared in this header provide "common" elementwise - * operations that are neither math nor logic functions. These are available - * only for floating-point vectors and scalars, except for min, max, abs, - * clamp, and the reduce operations, which also support integer vectors. - * - * simd_abs(x) Absolute value of x. Also available as fabs - * for floating-point vectors. If x is the - * smallest signed integer, x is returned. - * - * simd_max(x,y) Returns the maximum of x and y. Also available - * as fmax for floating-point vectors. - * - * simd_min(x,y) Returns the minimum of x and y. Also available - * as fmin for floating-point vectors. - * - * simd_clamp(x,min,max) x clamped to the range [min, max]. - * - * simd_sign(x) -1 if x is less than zero, 0 if x is zero or - * NaN, and +1 if x is greater than zero. - * - * simd_mix(x,y,t) If t is not in the range [0,1], the result is - * undefined. Otherwise the result is x+(y-x)*t, - * which linearly interpolates between x and y. - * - * simd_recip(x) An approximation to 1/x. If x is very near the - * limits of representable values, or is infinity - * or NaN, the result is undefined. There are - * two variants of this function: - * - * simd_precise_recip(x) - * - * and - * - * simd_fast_recip(x). - * - * The "precise" variant is accurate to a few ULPs, - * whereas the "fast" variant may have as little - * as 11 bits of accuracy in float and about 22 - * bits in double. - * - * The function simd_recip(x) resolves to - * simd_precise_recip(x) ordinarily, but to - * simd_fast_recip(x) when used in a translation - * unit compiled with -ffast-math (when - * -ffast-math is in effect, you may still use the - * precise version of this function by calling it - * explicitly by name). - * - * simd_rsqrt(x) An approximation to 1/sqrt(x). If x is - * infinity or NaN, the result is undefined. - * There are two variants of this function: - * - * simd_precise_rsqrt(x) - * - * and - * - * simd_fast_rsqrt(x). - * - * The "precise" variant is accurate to a few ULPs, - * whereas the "fast" variant may have as little - * as 11 bits of accuracy in float and about 22 - * bits in double. - * - * The function simd_rsqrt(x) resolves to - * simd_precise_rsqrt(x) ordinarily, but to - * simd_fast_rsqrt(x) when used in a translation - * unit compiled with -ffast-math (when - * -ffast-math is in effect, you may still use the - * precise version of this function by calling it - * explicitly by name). - * - * simd_fract(x) The "fractional part" of x, which lies strictly - * in the range [0, 0x1.fffffep-1]. - * - * simd_step(edge,x) 0 if x < edge, and 1 otherwise. - * - * simd_smoothstep(edge0,edge1,x) 0 if x <= edge0, 1 if x >= edge1, and - * a Hermite interpolation between 0 and 1 if - * edge0 < x < edge1. - * - * simd_reduce_add(x) Sum of the elements of x. - * - * simd_reduce_min(x) Minimum of the elements of x. - * - * simd_reduce_max(x) Maximum of the elements of x. - * - * simd_equal(x,y) True if and only if every lane of x is equal - * to the corresponding lane of y. - * - * The following common functions are available in the simd:: namespace: - * - * C++ Function Equivalent C Function - * -------------------------------------------------------------------- - * simd::abs(x) simd_abs(x) - * simd::max(x,y) simd_max(x,y) - * simd::min(x,y) simd_min(x,y) - * simd::clamp(x,min,max) simd_clamp(x,min,max) - * simd::sign(x) simd_sign(x) - * simd::mix(x,y,t) simd_mix(x,y,t) - * simd::recip(x) simd_recip(x) - * simd::rsqrt(x) simd_rsqrt(x) - * simd::fract(x) simd_fract(x) - * simd::step(edge,x) simd_step(edge,x) - * simd::smoothstep(e0,e1,x) simd_smoothstep(e0,e1,x) - * simd::reduce_add(x) simd_reduce_add(x) - * simd::reduce_max(x) simd_reduce_max(x) - * simd::reduce_min(x) simd_reduce_min(x) - * simd::equal(x,y) simd_equal(x,y) - * - * simd::precise::recip(x) simd_precise_recip(x) - * simd::precise::rsqrt(x) simd_precise_rsqrt(x) - * - * simd::fast::recip(x) simd_fast_recip(x) - * simd::fast::rsqrt(x) simd_fast_rsqrt(x) - * - * @copyright 2014-2017 Apple, Inc. All rights reserved. - * @unsorted */ - -#ifndef SIMD_COMMON_HEADER -#define SIMD_COMMON_HEADER - -#include -#if SIMD_COMPILER_HAS_REQUIRED_FEATURES -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_char2 simd_abs(simd_char2 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_char3 simd_abs(simd_char3 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_char4 simd_abs(simd_char4 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_char8 simd_abs(simd_char8 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_char16 simd_abs(simd_char16 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_char32 simd_abs(simd_char32 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_char64 simd_abs(simd_char64 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_short2 simd_abs(simd_short2 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_short3 simd_abs(simd_short3 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_short4 simd_abs(simd_short4 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_short8 simd_abs(simd_short8 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_short16 simd_abs(simd_short16 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_short32 simd_abs(simd_short32 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_int2 simd_abs(simd_int2 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_int3 simd_abs(simd_int3 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_int4 simd_abs(simd_int4 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_int8 simd_abs(simd_int8 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_int16 simd_abs(simd_int16 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_float2 simd_abs(simd_float2 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_float3 simd_abs(simd_float3 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_float4 simd_abs(simd_float4 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_float8 simd_abs(simd_float8 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_float16 simd_abs(simd_float16 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_long2 simd_abs(simd_long2 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_long3 simd_abs(simd_long3 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_long4 simd_abs(simd_long4 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_long8 simd_abs(simd_long8 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_double2 simd_abs(simd_double2 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_double3 simd_abs(simd_double3 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_double4 simd_abs(simd_double4 x); -/*! @abstract The elementwise absolute value of x. */ -static inline SIMD_CFUNC simd_double8 simd_abs(simd_double8 x); -/*! @abstract The elementwise absolute value of x. - * @discussion Deprecated. Use simd_abs(x) instead. */ -#define vector_abs simd_abs - -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_char2 simd_max(simd_char2 x, simd_char2 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_char3 simd_max(simd_char3 x, simd_char3 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_char4 simd_max(simd_char4 x, simd_char4 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_char8 simd_max(simd_char8 x, simd_char8 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_char16 simd_max(simd_char16 x, simd_char16 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_char32 simd_max(simd_char32 x, simd_char32 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_char64 simd_max(simd_char64 x, simd_char64 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_uchar2 simd_max(simd_uchar2 x, simd_uchar2 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_uchar3 simd_max(simd_uchar3 x, simd_uchar3 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_uchar4 simd_max(simd_uchar4 x, simd_uchar4 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_uchar8 simd_max(simd_uchar8 x, simd_uchar8 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_uchar16 simd_max(simd_uchar16 x, simd_uchar16 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_uchar32 simd_max(simd_uchar32 x, simd_uchar32 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_uchar64 simd_max(simd_uchar64 x, simd_uchar64 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_short2 simd_max(simd_short2 x, simd_short2 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_short3 simd_max(simd_short3 x, simd_short3 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_short4 simd_max(simd_short4 x, simd_short4 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_short8 simd_max(simd_short8 x, simd_short8 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_short16 simd_max(simd_short16 x, simd_short16 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_short32 simd_max(simd_short32 x, simd_short32 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_ushort2 simd_max(simd_ushort2 x, simd_ushort2 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_ushort3 simd_max(simd_ushort3 x, simd_ushort3 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_ushort4 simd_max(simd_ushort4 x, simd_ushort4 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_ushort8 simd_max(simd_ushort8 x, simd_ushort8 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_ushort16 simd_max(simd_ushort16 x, simd_ushort16 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_ushort32 simd_max(simd_ushort32 x, simd_ushort32 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_int2 simd_max(simd_int2 x, simd_int2 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_int3 simd_max(simd_int3 x, simd_int3 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_int4 simd_max(simd_int4 x, simd_int4 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_int8 simd_max(simd_int8 x, simd_int8 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_int16 simd_max(simd_int16 x, simd_int16 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_uint2 simd_max(simd_uint2 x, simd_uint2 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_uint3 simd_max(simd_uint3 x, simd_uint3 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_uint4 simd_max(simd_uint4 x, simd_uint4 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_uint8 simd_max(simd_uint8 x, simd_uint8 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_uint16 simd_max(simd_uint16 x, simd_uint16 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC float simd_max(float x, float y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_float2 simd_max(simd_float2 x, simd_float2 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_float3 simd_max(simd_float3 x, simd_float3 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_float4 simd_max(simd_float4 x, simd_float4 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_float8 simd_max(simd_float8 x, simd_float8 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_float16 simd_max(simd_float16 x, simd_float16 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_long2 simd_max(simd_long2 x, simd_long2 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_long3 simd_max(simd_long3 x, simd_long3 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_long4 simd_max(simd_long4 x, simd_long4 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_long8 simd_max(simd_long8 x, simd_long8 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_ulong2 simd_max(simd_ulong2 x, simd_ulong2 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_ulong3 simd_max(simd_ulong3 x, simd_ulong3 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_ulong4 simd_max(simd_ulong4 x, simd_ulong4 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_ulong8 simd_max(simd_ulong8 x, simd_ulong8 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC double simd_max(double x, double y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_double2 simd_max(simd_double2 x, simd_double2 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_double3 simd_max(simd_double3 x, simd_double3 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_double4 simd_max(simd_double4 x, simd_double4 y); -/*! @abstract The elementwise maximum of x and y. */ -static inline SIMD_CFUNC simd_double8 simd_max(simd_double8 x, simd_double8 y); -/*! @abstract The elementwise maximum of x and y. - * @discussion Deprecated. Use simd_max(x,y) instead. */ -#define vector_max simd_max - -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_char2 simd_min(simd_char2 x, simd_char2 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_char3 simd_min(simd_char3 x, simd_char3 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_char4 simd_min(simd_char4 x, simd_char4 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_char8 simd_min(simd_char8 x, simd_char8 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_char16 simd_min(simd_char16 x, simd_char16 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_char32 simd_min(simd_char32 x, simd_char32 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_char64 simd_min(simd_char64 x, simd_char64 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_uchar2 simd_min(simd_uchar2 x, simd_uchar2 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_uchar3 simd_min(simd_uchar3 x, simd_uchar3 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_uchar4 simd_min(simd_uchar4 x, simd_uchar4 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_uchar8 simd_min(simd_uchar8 x, simd_uchar8 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_uchar16 simd_min(simd_uchar16 x, simd_uchar16 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_uchar32 simd_min(simd_uchar32 x, simd_uchar32 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_uchar64 simd_min(simd_uchar64 x, simd_uchar64 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_short2 simd_min(simd_short2 x, simd_short2 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_short3 simd_min(simd_short3 x, simd_short3 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_short4 simd_min(simd_short4 x, simd_short4 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_short8 simd_min(simd_short8 x, simd_short8 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_short16 simd_min(simd_short16 x, simd_short16 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_short32 simd_min(simd_short32 x, simd_short32 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_ushort2 simd_min(simd_ushort2 x, simd_ushort2 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_ushort3 simd_min(simd_ushort3 x, simd_ushort3 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_ushort4 simd_min(simd_ushort4 x, simd_ushort4 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_ushort8 simd_min(simd_ushort8 x, simd_ushort8 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_ushort16 simd_min(simd_ushort16 x, simd_ushort16 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_ushort32 simd_min(simd_ushort32 x, simd_ushort32 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_int2 simd_min(simd_int2 x, simd_int2 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_int3 simd_min(simd_int3 x, simd_int3 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_int4 simd_min(simd_int4 x, simd_int4 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_int8 simd_min(simd_int8 x, simd_int8 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_int16 simd_min(simd_int16 x, simd_int16 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_uint2 simd_min(simd_uint2 x, simd_uint2 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_uint3 simd_min(simd_uint3 x, simd_uint3 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_uint4 simd_min(simd_uint4 x, simd_uint4 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_uint8 simd_min(simd_uint8 x, simd_uint8 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_uint16 simd_min(simd_uint16 x, simd_uint16 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC float simd_min(float x, float y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_float2 simd_min(simd_float2 x, simd_float2 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_float3 simd_min(simd_float3 x, simd_float3 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_float4 simd_min(simd_float4 x, simd_float4 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_float8 simd_min(simd_float8 x, simd_float8 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_float16 simd_min(simd_float16 x, simd_float16 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_long2 simd_min(simd_long2 x, simd_long2 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_long3 simd_min(simd_long3 x, simd_long3 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_long4 simd_min(simd_long4 x, simd_long4 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_long8 simd_min(simd_long8 x, simd_long8 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_ulong2 simd_min(simd_ulong2 x, simd_ulong2 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_ulong3 simd_min(simd_ulong3 x, simd_ulong3 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_ulong4 simd_min(simd_ulong4 x, simd_ulong4 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_ulong8 simd_min(simd_ulong8 x, simd_ulong8 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC double simd_min(double x, double y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_double2 simd_min(simd_double2 x, simd_double2 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_double3 simd_min(simd_double3 x, simd_double3 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_double4 simd_min(simd_double4 x, simd_double4 y); -/*! @abstract The elementwise minimum of x and y. */ -static inline SIMD_CFUNC simd_double8 simd_min(simd_double8 x, simd_double8 y); -/*! @abstract The elementwise minimum of x and y. - * @discussion Deprecated. Use simd_min(x,y) instead. */ -#define vector_min simd_min - - -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_char2 simd_clamp(simd_char2 x, simd_char2 min, simd_char2 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_char3 simd_clamp(simd_char3 x, simd_char3 min, simd_char3 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_char4 simd_clamp(simd_char4 x, simd_char4 min, simd_char4 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_char8 simd_clamp(simd_char8 x, simd_char8 min, simd_char8 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_char16 simd_clamp(simd_char16 x, simd_char16 min, simd_char16 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_char32 simd_clamp(simd_char32 x, simd_char32 min, simd_char32 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_char64 simd_clamp(simd_char64 x, simd_char64 min, simd_char64 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_uchar2 simd_clamp(simd_uchar2 x, simd_uchar2 min, simd_uchar2 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_uchar3 simd_clamp(simd_uchar3 x, simd_uchar3 min, simd_uchar3 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_uchar4 simd_clamp(simd_uchar4 x, simd_uchar4 min, simd_uchar4 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_uchar8 simd_clamp(simd_uchar8 x, simd_uchar8 min, simd_uchar8 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_uchar16 simd_clamp(simd_uchar16 x, simd_uchar16 min, simd_uchar16 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_uchar32 simd_clamp(simd_uchar32 x, simd_uchar32 min, simd_uchar32 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_uchar64 simd_clamp(simd_uchar64 x, simd_uchar64 min, simd_uchar64 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_short2 simd_clamp(simd_short2 x, simd_short2 min, simd_short2 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_short3 simd_clamp(simd_short3 x, simd_short3 min, simd_short3 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_short4 simd_clamp(simd_short4 x, simd_short4 min, simd_short4 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_short8 simd_clamp(simd_short8 x, simd_short8 min, simd_short8 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_short16 simd_clamp(simd_short16 x, simd_short16 min, simd_short16 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_short32 simd_clamp(simd_short32 x, simd_short32 min, simd_short32 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_ushort2 simd_clamp(simd_ushort2 x, simd_ushort2 min, simd_ushort2 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_ushort3 simd_clamp(simd_ushort3 x, simd_ushort3 min, simd_ushort3 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_ushort4 simd_clamp(simd_ushort4 x, simd_ushort4 min, simd_ushort4 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_ushort8 simd_clamp(simd_ushort8 x, simd_ushort8 min, simd_ushort8 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_ushort16 simd_clamp(simd_ushort16 x, simd_ushort16 min, simd_ushort16 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_ushort32 simd_clamp(simd_ushort32 x, simd_ushort32 min, simd_ushort32 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_int2 simd_clamp(simd_int2 x, simd_int2 min, simd_int2 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_int3 simd_clamp(simd_int3 x, simd_int3 min, simd_int3 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_int4 simd_clamp(simd_int4 x, simd_int4 min, simd_int4 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_int8 simd_clamp(simd_int8 x, simd_int8 min, simd_int8 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_int16 simd_clamp(simd_int16 x, simd_int16 min, simd_int16 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_uint2 simd_clamp(simd_uint2 x, simd_uint2 min, simd_uint2 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_uint3 simd_clamp(simd_uint3 x, simd_uint3 min, simd_uint3 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_uint4 simd_clamp(simd_uint4 x, simd_uint4 min, simd_uint4 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_uint8 simd_clamp(simd_uint8 x, simd_uint8 min, simd_uint8 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_uint16 simd_clamp(simd_uint16 x, simd_uint16 min, simd_uint16 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC float simd_clamp(float x, float min, float max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_float2 simd_clamp(simd_float2 x, simd_float2 min, simd_float2 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_float3 simd_clamp(simd_float3 x, simd_float3 min, simd_float3 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_float4 simd_clamp(simd_float4 x, simd_float4 min, simd_float4 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_float8 simd_clamp(simd_float8 x, simd_float8 min, simd_float8 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_float16 simd_clamp(simd_float16 x, simd_float16 min, simd_float16 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_long2 simd_clamp(simd_long2 x, simd_long2 min, simd_long2 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_long3 simd_clamp(simd_long3 x, simd_long3 min, simd_long3 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_long4 simd_clamp(simd_long4 x, simd_long4 min, simd_long4 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_long8 simd_clamp(simd_long8 x, simd_long8 min, simd_long8 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_ulong2 simd_clamp(simd_ulong2 x, simd_ulong2 min, simd_ulong2 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_ulong3 simd_clamp(simd_ulong3 x, simd_ulong3 min, simd_ulong3 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_ulong4 simd_clamp(simd_ulong4 x, simd_ulong4 min, simd_ulong4 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_ulong8 simd_clamp(simd_ulong8 x, simd_ulong8 min, simd_ulong8 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC double simd_clamp(double x, double min, double max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_double2 simd_clamp(simd_double2 x, simd_double2 min, simd_double2 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_double3 simd_clamp(simd_double3 x, simd_double3 min, simd_double3 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_double4 simd_clamp(simd_double4 x, simd_double4 min, simd_double4 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Note that if you want to clamp all lanes to the same range, - * you can use a scalar value for min and max. */ -static inline SIMD_CFUNC simd_double8 simd_clamp(simd_double8 x, simd_double8 min, simd_double8 max); -/*! @abstract x clamped to the range [min, max]. - * @discussion Deprecated. Use simd_clamp(x,min,max) instead. */ -#define vector_clamp simd_clamp - -/*! @abstract -1 if x is negative, +1 if x is positive, and 0 otherwise. */ -static inline SIMD_CFUNC float simd_sign(float x); -/*! @abstract -1 if x is negative, +1 if x is positive, and 0 otherwise. */ -static inline SIMD_CFUNC simd_float2 simd_sign(simd_float2 x); -/*! @abstract -1 if x is negative, +1 if x is positive, and 0 otherwise. */ -static inline SIMD_CFUNC simd_float3 simd_sign(simd_float3 x); -/*! @abstract -1 if x is negative, +1 if x is positive, and 0 otherwise. */ -static inline SIMD_CFUNC simd_float4 simd_sign(simd_float4 x); -/*! @abstract -1 if x is negative, +1 if x is positive, and 0 otherwise. */ -static inline SIMD_CFUNC simd_float8 simd_sign(simd_float8 x); -/*! @abstract -1 if x is negative, +1 if x is positive, and 0 otherwise. */ -static inline SIMD_CFUNC simd_float16 simd_sign(simd_float16 x); -/*! @abstract -1 if x is negative, +1 if x is positive, and 0 otherwise. */ -static inline SIMD_CFUNC double simd_sign(double x); -/*! @abstract -1 if x is negative, +1 if x is positive, and 0 otherwise. */ -static inline SIMD_CFUNC simd_double2 simd_sign(simd_double2 x); -/*! @abstract -1 if x is negative, +1 if x is positive, and 0 otherwise. */ -static inline SIMD_CFUNC simd_double3 simd_sign(simd_double3 x); -/*! @abstract -1 if x is negative, +1 if x is positive, and 0 otherwise. */ -static inline SIMD_CFUNC simd_double4 simd_sign(simd_double4 x); -/*! @abstract -1 if x is negative, +1 if x is positive, and 0 otherwise. */ -static inline SIMD_CFUNC simd_double8 simd_sign(simd_double8 x); -/*! @abstract -1 if x is negative, +1 if x is positive, and 0 otherwise. - * @discussion Deprecated. Use simd_sign(x) instead. */ -#define vector_sign simd_sign - -/*! @abstract Linearly interpolates between x and y, taking the value x when - * t=0 and y when t=1 */ -static inline SIMD_CFUNC float simd_mix(float x, float y, float t); -/*! @abstract Linearly interpolates between x and y, taking the value x when - * t=0 and y when t=1 */ -static inline SIMD_CFUNC simd_float2 simd_mix(simd_float2 x, simd_float2 y, simd_float2 t); -/*! @abstract Linearly interpolates between x and y, taking the value x when - * t=0 and y when t=1 */ -static inline SIMD_CFUNC simd_float3 simd_mix(simd_float3 x, simd_float3 y, simd_float3 t); -/*! @abstract Linearly interpolates between x and y, taking the value x when - * t=0 and y when t=1 */ -static inline SIMD_CFUNC simd_float4 simd_mix(simd_float4 x, simd_float4 y, simd_float4 t); -/*! @abstract Linearly interpolates between x and y, taking the value x when - * t=0 and y when t=1 */ -static inline SIMD_CFUNC simd_float8 simd_mix(simd_float8 x, simd_float8 y, simd_float8 t); -/*! @abstract Linearly interpolates between x and y, taking the value x when - * t=0 and y when t=1 */ -static inline SIMD_CFUNC simd_float16 simd_mix(simd_float16 x, simd_float16 y, simd_float16 t); -/*! @abstract Linearly interpolates between x and y, taking the value x when - * t=0 and y when t=1 */ -static inline SIMD_CFUNC double simd_mix(double x, double y, double t); -/*! @abstract Linearly interpolates between x and y, taking the value x when - * t=0 and y when t=1 */ -static inline SIMD_CFUNC simd_double2 simd_mix(simd_double2 x, simd_double2 y, simd_double2 t); -/*! @abstract Linearly interpolates between x and y, taking the value x when - * t=0 and y when t=1 */ -static inline SIMD_CFUNC simd_double3 simd_mix(simd_double3 x, simd_double3 y, simd_double3 t); -/*! @abstract Linearly interpolates between x and y, taking the value x when - * t=0 and y when t=1 */ -static inline SIMD_CFUNC simd_double4 simd_mix(simd_double4 x, simd_double4 y, simd_double4 t); -/*! @abstract Linearly interpolates between x and y, taking the value x when - * t=0 and y when t=1 */ -static inline SIMD_CFUNC simd_double8 simd_mix(simd_double8 x, simd_double8 y, simd_double8 t); -/*! @abstract Linearly interpolates between x and y, taking the value x when - * t=0 and y when t=1 - * @discussion Deprecated. Use simd_mix(x, y, t) instead. */ -#define vector_mix simd_mix - -/*! @abstract A good approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow; otherwise this function is accurate to - * a few units in the last place (ULPs). */ -static inline SIMD_CFUNC float simd_precise_recip(float x); -/*! @abstract A good approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow; otherwise this function is accurate to - * a few units in the last place (ULPs). */ -static inline SIMD_CFUNC simd_float2 simd_precise_recip(simd_float2 x); -/*! @abstract A good approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow; otherwise this function is accurate to - * a few units in the last place (ULPs). */ -static inline SIMD_CFUNC simd_float3 simd_precise_recip(simd_float3 x); -/*! @abstract A good approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow; otherwise this function is accurate to - * a few units in the last place (ULPs). */ -static inline SIMD_CFUNC simd_float4 simd_precise_recip(simd_float4 x); -/*! @abstract A good approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow; otherwise this function is accurate to - * a few units in the last place (ULPs). */ -static inline SIMD_CFUNC simd_float8 simd_precise_recip(simd_float8 x); -/*! @abstract A good approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow; otherwise this function is accurate to - * a few units in the last place (ULPs). */ -static inline SIMD_CFUNC simd_float16 simd_precise_recip(simd_float16 x); -/*! @abstract A good approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow; otherwise this function is accurate to - * a few units in the last place (ULPs). */ -static inline SIMD_CFUNC double simd_precise_recip(double x); -/*! @abstract A good approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow; otherwise this function is accurate to - * a few units in the last place (ULPs). */ -static inline SIMD_CFUNC simd_double2 simd_precise_recip(simd_double2 x); -/*! @abstract A good approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow; otherwise this function is accurate to - * a few units in the last place (ULPs). */ -static inline SIMD_CFUNC simd_double3 simd_precise_recip(simd_double3 x); -/*! @abstract A good approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow; otherwise this function is accurate to - * a few units in the last place (ULPs). */ -static inline SIMD_CFUNC simd_double4 simd_precise_recip(simd_double4 x); -/*! @abstract A good approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow; otherwise this function is accurate to - * a few units in the last place (ULPs). */ -static inline SIMD_CFUNC simd_double8 simd_precise_recip(simd_double8 x); -/*! @abstract A good approximation to 1/x. - * @discussion Deprecated. Use simd_precise_recip(x) instead. */ -#define vector_precise_recip simd_precise_recip - -/*! @abstract A fast approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow; otherwise this function is accurate to - * at least 11 bits for float and 22 bits for double. */ -static inline SIMD_CFUNC float simd_fast_recip(float x); -/*! @abstract A fast approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow; otherwise this function is accurate to - * at least 11 bits for float and 22 bits for double. */ -static inline SIMD_CFUNC simd_float2 simd_fast_recip(simd_float2 x); -/*! @abstract A fast approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow; otherwise this function is accurate to - * at least 11 bits for float and 22 bits for double. */ -static inline SIMD_CFUNC simd_float3 simd_fast_recip(simd_float3 x); -/*! @abstract A fast approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow; otherwise this function is accurate to - * at least 11 bits for float and 22 bits for double. */ -static inline SIMD_CFUNC simd_float4 simd_fast_recip(simd_float4 x); -/*! @abstract A fast approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow; otherwise this function is accurate to - * at least 11 bits for float and 22 bits for double. */ -static inline SIMD_CFUNC simd_float8 simd_fast_recip(simd_float8 x); -/*! @abstract A fast approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow; otherwise this function is accurate to - * at least 11 bits for float and 22 bits for double. */ -static inline SIMD_CFUNC simd_float16 simd_fast_recip(simd_float16 x); -/*! @abstract A fast approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow; otherwise this function is accurate to - * at least 11 bits for float and 22 bits for double. */ -static inline SIMD_CFUNC double simd_fast_recip(double x); -/*! @abstract A fast approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow; otherwise this function is accurate to - * at least 11 bits for float and 22 bits for double. */ -static inline SIMD_CFUNC simd_double2 simd_fast_recip(simd_double2 x); -/*! @abstract A fast approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow; otherwise this function is accurate to - * at least 11 bits for float and 22 bits for double. */ -static inline SIMD_CFUNC simd_double3 simd_fast_recip(simd_double3 x); -/*! @abstract A fast approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow; otherwise this function is accurate to - * at least 11 bits for float and 22 bits for double. */ -static inline SIMD_CFUNC simd_double4 simd_fast_recip(simd_double4 x); -/*! @abstract A fast approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow; otherwise this function is accurate to - * at least 11 bits for float and 22 bits for double. */ -static inline SIMD_CFUNC simd_double8 simd_fast_recip(simd_double8 x); -/*! @abstract A fast approximation to 1/x. - * @discussion Deprecated. Use simd_fast_recip(x) instead. */ -#define vector_fast_recip simd_fast_recip - -/*! @abstract An approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow. This function maps to - * simd_fast_recip(x) if -ffast-math is specified, and to - * simd_precise_recip(x) otherwise. */ -static inline SIMD_CFUNC float simd_recip(float x); -/*! @abstract An approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow. This function maps to - * simd_fast_recip(x) if -ffast-math is specified, and to - * simd_precise_recip(x) otherwise. */ -static inline SIMD_CFUNC simd_float2 simd_recip(simd_float2 x); -/*! @abstract An approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow. This function maps to - * simd_fast_recip(x) if -ffast-math is specified, and to - * simd_precise_recip(x) otherwise. */ -static inline SIMD_CFUNC simd_float3 simd_recip(simd_float3 x); -/*! @abstract An approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow. This function maps to - * simd_fast_recip(x) if -ffast-math is specified, and to - * simd_precise_recip(x) otherwise. */ -static inline SIMD_CFUNC simd_float4 simd_recip(simd_float4 x); -/*! @abstract An approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow. This function maps to - * simd_fast_recip(x) if -ffast-math is specified, and to - * simd_precise_recip(x) otherwise. */ -static inline SIMD_CFUNC simd_float8 simd_recip(simd_float8 x); -/*! @abstract An approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow. This function maps to - * simd_fast_recip(x) if -ffast-math is specified, and to - * simd_precise_recip(x) otherwise. */ -static inline SIMD_CFUNC simd_float16 simd_recip(simd_float16 x); -/*! @abstract An approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow. This function maps to - * simd_fast_recip(x) if -ffast-math is specified, and to - * simd_precise_recip(x) otherwise. */ -static inline SIMD_CFUNC double simd_recip(double x); -/*! @abstract An approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow. This function maps to - * simd_fast_recip(x) if -ffast-math is specified, and to - * simd_precise_recip(x) otherwise. */ -static inline SIMD_CFUNC simd_double2 simd_recip(simd_double2 x); -/*! @abstract An approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow. This function maps to - * simd_fast_recip(x) if -ffast-math is specified, and to - * simd_precise_recip(x) otherwise. */ -static inline SIMD_CFUNC simd_double3 simd_recip(simd_double3 x); -/*! @abstract An approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow. This function maps to - * simd_fast_recip(x) if -ffast-math is specified, and to - * simd_precise_recip(x) otherwise. */ -static inline SIMD_CFUNC simd_double4 simd_recip(simd_double4 x); -/*! @abstract An approximation to 1/x. - * @discussion If x is very close to the limits of representation, the - * result may overflow or underflow. This function maps to - * simd_fast_recip(x) if -ffast-math is specified, and to - * simd_precise_recip(x) otherwise. */ -static inline SIMD_CFUNC simd_double8 simd_recip(simd_double8 x); -/*! @abstract An approximation to 1/x. - * @discussion Deprecated. Use simd_recip(x) instead. */ -#define vector_recip simd_recip - -/*! @abstract A good approximation to 1/sqrt(x). - * @discussion This function is accurate to a few units in the last place - * (ULPs). */ -static inline SIMD_CFUNC float simd_precise_rsqrt(float x); -/*! @abstract A good approximation to 1/sqrt(x). - * @discussion This function is accurate to a few units in the last place - * (ULPs). */ -static inline SIMD_CFUNC simd_float2 simd_precise_rsqrt(simd_float2 x); -/*! @abstract A good approximation to 1/sqrt(x). - * @discussion This function is accurate to a few units in the last place - * (ULPs). */ -static inline SIMD_CFUNC simd_float3 simd_precise_rsqrt(simd_float3 x); -/*! @abstract A good approximation to 1/sqrt(x). - * @discussion This function is accurate to a few units in the last place - * (ULPs). */ -static inline SIMD_CFUNC simd_float4 simd_precise_rsqrt(simd_float4 x); -/*! @abstract A good approximation to 1/sqrt(x). - * @discussion This function is accurate to a few units in the last place - * (ULPs). */ -static inline SIMD_CFUNC simd_float8 simd_precise_rsqrt(simd_float8 x); -/*! @abstract A good approximation to 1/sqrt(x). - * @discussion This function is accurate to a few units in the last place - * (ULPs). */ -static inline SIMD_CFUNC simd_float16 simd_precise_rsqrt(simd_float16 x); -/*! @abstract A good approximation to 1/sqrt(x). - * @discussion This function is accurate to a few units in the last place - * (ULPs). */ -static inline SIMD_CFUNC double simd_precise_rsqrt(double x); -/*! @abstract A good approximation to 1/sqrt(x). - * @discussion This function is accurate to a few units in the last place - * (ULPs). */ -static inline SIMD_CFUNC simd_double2 simd_precise_rsqrt(simd_double2 x); -/*! @abstract A good approximation to 1/sqrt(x). - * @discussion This function is accurate to a few units in the last place - * (ULPs). */ -static inline SIMD_CFUNC simd_double3 simd_precise_rsqrt(simd_double3 x); -/*! @abstract A good approximation to 1/sqrt(x). - * @discussion This function is accurate to a few units in the last place - * (ULPs). */ -static inline SIMD_CFUNC simd_double4 simd_precise_rsqrt(simd_double4 x); -/*! @abstract A good approximation to 1/sqrt(x). - * @discussion This function is accurate to a few units in the last place - * (ULPs). */ -static inline SIMD_CFUNC simd_double8 simd_precise_rsqrt(simd_double8 x); -/*! @abstract A good approximation to 1/sqrt(x). - * @discussion Deprecated. Use simd_precise_rsqrt(x) instead. */ -#define vector_precise_rsqrt simd_precise_rsqrt - -/*! @abstract A fast approximation to 1/sqrt(x). - * @discussion This function is accurate to at least 11 bits for float and - * 22 bits for double. */ -static inline SIMD_CFUNC float simd_fast_rsqrt(float x); -/*! @abstract A fast approximation to 1/sqrt(x). - * @discussion This function is accurate to at least 11 bits for float and - * 22 bits for double. */ -static inline SIMD_CFUNC simd_float2 simd_fast_rsqrt(simd_float2 x); -/*! @abstract A fast approximation to 1/sqrt(x). - * @discussion This function is accurate to at least 11 bits for float and - * 22 bits for double. */ -static inline SIMD_CFUNC simd_float3 simd_fast_rsqrt(simd_float3 x); -/*! @abstract A fast approximation to 1/sqrt(x). - * @discussion This function is accurate to at least 11 bits for float and - * 22 bits for double. */ -static inline SIMD_CFUNC simd_float4 simd_fast_rsqrt(simd_float4 x); -/*! @abstract A fast approximation to 1/sqrt(x). - * @discussion This function is accurate to at least 11 bits for float and - * 22 bits for double. */ -static inline SIMD_CFUNC simd_float8 simd_fast_rsqrt(simd_float8 x); -/*! @abstract A fast approximation to 1/sqrt(x). - * @discussion This function is accurate to at least 11 bits for float and - * 22 bits for double. */ -static inline SIMD_CFUNC simd_float16 simd_fast_rsqrt(simd_float16 x); -/*! @abstract A fast approximation to 1/sqrt(x). - * @discussion This function is accurate to at least 11 bits for float and - * 22 bits for double. */ -static inline SIMD_CFUNC double simd_fast_rsqrt(double x); -/*! @abstract A fast approximation to 1/sqrt(x). - * @discussion This function is accurate to at least 11 bits for float and - * 22 bits for double. */ -static inline SIMD_CFUNC simd_double2 simd_fast_rsqrt(simd_double2 x); -/*! @abstract A fast approximation to 1/sqrt(x). - * @discussion This function is accurate to at least 11 bits for float and - * 22 bits for double. */ -static inline SIMD_CFUNC simd_double3 simd_fast_rsqrt(simd_double3 x); -/*! @abstract A fast approximation to 1/sqrt(x). - * @discussion This function is accurate to at least 11 bits for float and - * 22 bits for double. */ -static inline SIMD_CFUNC simd_double4 simd_fast_rsqrt(simd_double4 x); -/*! @abstract A fast approximation to 1/sqrt(x). - * @discussion This function is accurate to at least 11 bits for float and - * 22 bits for double. */ -static inline SIMD_CFUNC simd_double8 simd_fast_rsqrt(simd_double8 x); -/*! @abstract A fast approximation to 1/sqrt(x). - * @discussion Deprecated. Use simd_fast_rsqrt(x) instead. */ -#define vector_fast_rsqrt simd_fast_rsqrt - -/*! @abstract An approximation to 1/sqrt(x). - * @discussion This function maps to simd_fast_recip(x) if -ffast-math is - * specified, and to simd_precise_recip(x) otherwise. */ -static inline SIMD_CFUNC float simd_rsqrt(float x); -/*! @abstract An approximation to 1/sqrt(x). - * @discussion This function maps to simd_fast_recip(x) if -ffast-math is - * specified, and to simd_precise_recip(x) otherwise. */ -static inline SIMD_CFUNC simd_float2 simd_rsqrt(simd_float2 x); -/*! @abstract An approximation to 1/sqrt(x). - * @discussion This function maps to simd_fast_recip(x) if -ffast-math is - * specified, and to simd_precise_recip(x) otherwise. */ -static inline SIMD_CFUNC simd_float3 simd_rsqrt(simd_float3 x); -/*! @abstract An approximation to 1/sqrt(x). - * @discussion This function maps to simd_fast_recip(x) if -ffast-math is - * specified, and to simd_precise_recip(x) otherwise. */ -static inline SIMD_CFUNC simd_float4 simd_rsqrt(simd_float4 x); -/*! @abstract An approximation to 1/sqrt(x). - * @discussion This function maps to simd_fast_recip(x) if -ffast-math is - * specified, and to simd_precise_recip(x) otherwise. */ -static inline SIMD_CFUNC simd_float8 simd_rsqrt(simd_float8 x); -/*! @abstract An approximation to 1/sqrt(x). - * @discussion This function maps to simd_fast_recip(x) if -ffast-math is - * specified, and to simd_precise_recip(x) otherwise. */ -static inline SIMD_CFUNC simd_float16 simd_rsqrt(simd_float16 x); -/*! @abstract An approximation to 1/sqrt(x). - * @discussion This function maps to simd_fast_recip(x) if -ffast-math is - * specified, and to simd_precise_recip(x) otherwise. */ -static inline SIMD_CFUNC double simd_rsqrt(double x); -/*! @abstract An approximation to 1/sqrt(x). - * @discussion This function maps to simd_fast_recip(x) if -ffast-math is - * specified, and to simd_precise_recip(x) otherwise. */ -static inline SIMD_CFUNC simd_double2 simd_rsqrt(simd_double2 x); -/*! @abstract An approximation to 1/sqrt(x). - * @discussion This function maps to simd_fast_recip(x) if -ffast-math is - * specified, and to simd_precise_recip(x) otherwise. */ -static inline SIMD_CFUNC simd_double3 simd_rsqrt(simd_double3 x); -/*! @abstract An approximation to 1/sqrt(x). - * @discussion This function maps to simd_fast_recip(x) if -ffast-math is - * specified, and to simd_precise_recip(x) otherwise. */ -static inline SIMD_CFUNC simd_double4 simd_rsqrt(simd_double4 x); -/*! @abstract An approximation to 1/sqrt(x). - * @discussion This function maps to simd_fast_recip(x) if -ffast-math is - * specified, and to simd_precise_recip(x) otherwise. */ -static inline SIMD_CFUNC simd_double8 simd_rsqrt(simd_double8 x); -/*! @abstract An approximation to 1/sqrt(x). - * @discussion Deprecated. Use simd_rsqrt(x) instead. */ -#define vector_rsqrt simd_rsqrt - -/*! @abstract The "fractional part" of x, lying in the range [0, 1). - * @discussion floor(x) + fract(x) is *approximately* equal to x. If x is - * positive and finite, then the two values are exactly equal. */ -static inline SIMD_CFUNC float simd_fract(float x); -/*! @abstract The "fractional part" of x, lying in the range [0, 1). - * @discussion floor(x) + fract(x) is *approximately* equal to x. If x is - * positive and finite, then the two values are exactly equal. */ -static inline SIMD_CFUNC simd_float2 simd_fract(simd_float2 x); -/*! @abstract The "fractional part" of x, lying in the range [0, 1). - * @discussion floor(x) + fract(x) is *approximately* equal to x. If x is - * positive and finite, then the two values are exactly equal. */ -static inline SIMD_CFUNC simd_float3 simd_fract(simd_float3 x); -/*! @abstract The "fractional part" of x, lying in the range [0, 1). - * @discussion floor(x) + fract(x) is *approximately* equal to x. If x is - * positive and finite, then the two values are exactly equal. */ -static inline SIMD_CFUNC simd_float4 simd_fract(simd_float4 x); -/*! @abstract The "fractional part" of x, lying in the range [0, 1). - * @discussion floor(x) + fract(x) is *approximately* equal to x. If x is - * positive and finite, then the two values are exactly equal. */ -static inline SIMD_CFUNC simd_float8 simd_fract(simd_float8 x); -/*! @abstract The "fractional part" of x, lying in the range [0, 1). - * @discussion floor(x) + fract(x) is *approximately* equal to x. If x is - * positive and finite, then the two values are exactly equal. */ -static inline SIMD_CFUNC simd_float16 simd_fract(simd_float16 x); -/*! @abstract The "fractional part" of x, lying in the range [0, 1). - * @discussion floor(x) + fract(x) is *approximately* equal to x. If x is - * positive and finite, then the two values are exactly equal. */ -static inline SIMD_CFUNC double simd_fract(double x); -/*! @abstract The "fractional part" of x, lying in the range [0, 1). - * @discussion floor(x) + fract(x) is *approximately* equal to x. If x is - * positive and finite, then the two values are exactly equal. */ -static inline SIMD_CFUNC simd_double2 simd_fract(simd_double2 x); -/*! @abstract The "fractional part" of x, lying in the range [0, 1). - * @discussion floor(x) + fract(x) is *approximately* equal to x. If x is - * positive and finite, then the two values are exactly equal. */ -static inline SIMD_CFUNC simd_double3 simd_fract(simd_double3 x); -/*! @abstract The "fractional part" of x, lying in the range [0, 1). - * @discussion floor(x) + fract(x) is *approximately* equal to x. If x is - * positive and finite, then the two values are exactly equal. */ -static inline SIMD_CFUNC simd_double4 simd_fract(simd_double4 x); -/*! @abstract The "fractional part" of x, lying in the range [0, 1). - * @discussion floor(x) + fract(x) is *approximately* equal to x. If x is - * positive and finite, then the two values are exactly equal. */ -static inline SIMD_CFUNC simd_double8 simd_fract(simd_double8 x); -/*! @abstract The "fractional part" of x, lying in the range [0, 1). - * @discussion Deprecated. Use simd_fract(x) instead. */ -#define vector_fract simd_fract - -/*! @abstract 0 if x < edge, and 1 otherwise. - * @discussion Use a scalar value for edge if you want to apply the same - * threshold to all lanes. */ -static inline SIMD_CFUNC float simd_step(float edge, float x); -/*! @abstract 0 if x < edge, and 1 otherwise. - * @discussion Use a scalar value for edge if you want to apply the same - * threshold to all lanes. */ -static inline SIMD_CFUNC simd_float2 simd_step(simd_float2 edge, simd_float2 x); -/*! @abstract 0 if x < edge, and 1 otherwise. - * @discussion Use a scalar value for edge if you want to apply the same - * threshold to all lanes. */ -static inline SIMD_CFUNC simd_float3 simd_step(simd_float3 edge, simd_float3 x); -/*! @abstract 0 if x < edge, and 1 otherwise. - * @discussion Use a scalar value for edge if you want to apply the same - * threshold to all lanes. */ -static inline SIMD_CFUNC simd_float4 simd_step(simd_float4 edge, simd_float4 x); -/*! @abstract 0 if x < edge, and 1 otherwise. - * @discussion Use a scalar value for edge if you want to apply the same - * threshold to all lanes. */ -static inline SIMD_CFUNC simd_float8 simd_step(simd_float8 edge, simd_float8 x); -/*! @abstract 0 if x < edge, and 1 otherwise. - * @discussion Use a scalar value for edge if you want to apply the same - * threshold to all lanes. */ -static inline SIMD_CFUNC simd_float16 simd_step(simd_float16 edge, simd_float16 x); -/*! @abstract 0 if x < edge, and 1 otherwise. - * @discussion Use a scalar value for edge if you want to apply the same - * threshold to all lanes. */ -static inline SIMD_CFUNC double simd_step(double edge, double x); -/*! @abstract 0 if x < edge, and 1 otherwise. - * @discussion Use a scalar value for edge if you want to apply the same - * threshold to all lanes. */ -static inline SIMD_CFUNC simd_double2 simd_step(simd_double2 edge, simd_double2 x); -/*! @abstract 0 if x < edge, and 1 otherwise. - * @discussion Use a scalar value for edge if you want to apply the same - * threshold to all lanes. */ -static inline SIMD_CFUNC simd_double3 simd_step(simd_double3 edge, simd_double3 x); -/*! @abstract 0 if x < edge, and 1 otherwise. - * @discussion Use a scalar value for edge if you want to apply the same - * threshold to all lanes. */ -static inline SIMD_CFUNC simd_double4 simd_step(simd_double4 edge, simd_double4 x); -/*! @abstract 0 if x < edge, and 1 otherwise. - * @discussion Use a scalar value for edge if you want to apply the same - * threshold to all lanes. */ -static inline SIMD_CFUNC simd_double8 simd_step(simd_double8 edge, simd_double8 x); -/*! @abstract 0 if x < edge, and 1 otherwise. - * @discussion Deprecated. Use simd_step(edge, x) instead. */ -#define vector_step simd_step - -/*! @abstract Interpolates smoothly between 0 at edge0 and 1 at edge1 - * @discussion You can use a scalar value for edge0 and edge1 if you want - * to clamp all lanes at the same points. */ -static inline SIMD_CFUNC float simd_smoothstep(float edge0, float edge1, float x); -/*! @abstract Interpolates smoothly between 0 at edge0 and 1 at edge1 - * @discussion You can use a scalar value for edge0 and edge1 if you want - * to clamp all lanes at the same points. */ -static inline SIMD_CFUNC simd_float2 simd_smoothstep(simd_float2 edge0, simd_float2 edge1, simd_float2 x); -/*! @abstract Interpolates smoothly between 0 at edge0 and 1 at edge1 - * @discussion You can use a scalar value for edge0 and edge1 if you want - * to clamp all lanes at the same points. */ -static inline SIMD_CFUNC simd_float3 simd_smoothstep(simd_float3 edge0, simd_float3 edge1, simd_float3 x); -/*! @abstract Interpolates smoothly between 0 at edge0 and 1 at edge1 - * @discussion You can use a scalar value for edge0 and edge1 if you want - * to clamp all lanes at the same points. */ -static inline SIMD_CFUNC simd_float4 simd_smoothstep(simd_float4 edge0, simd_float4 edge1, simd_float4 x); -/*! @abstract Interpolates smoothly between 0 at edge0 and 1 at edge1 - * @discussion You can use a scalar value for edge0 and edge1 if you want - * to clamp all lanes at the same points. */ -static inline SIMD_CFUNC simd_float8 simd_smoothstep(simd_float8 edge0, simd_float8 edge1, simd_float8 x); -/*! @abstract Interpolates smoothly between 0 at edge0 and 1 at edge1 - * @discussion You can use a scalar value for edge0 and edge1 if you want - * to clamp all lanes at the same points. */ -static inline SIMD_CFUNC simd_float16 simd_smoothstep(simd_float16 edge0, simd_float16 edge1, simd_float16 x); -/*! @abstract Interpolates smoothly between 0 at edge0 and 1 at edge1 - * @discussion You can use a scalar value for edge0 and edge1 if you want - * to clamp all lanes at the same points. */ -static inline SIMD_CFUNC double simd_smoothstep(double edge0, double edge1, double x); -/*! @abstract Interpolates smoothly between 0 at edge0 and 1 at edge1 - * @discussion You can use a scalar value for edge0 and edge1 if you want - * to clamp all lanes at the same points. */ -static inline SIMD_CFUNC simd_double2 simd_smoothstep(simd_double2 edge0, simd_double2 edge1, simd_double2 x); -/*! @abstract Interpolates smoothly between 0 at edge0 and 1 at edge1 - * @discussion You can use a scalar value for edge0 and edge1 if you want - * to clamp all lanes at the same points. */ -static inline SIMD_CFUNC simd_double3 simd_smoothstep(simd_double3 edge0, simd_double3 edge1, simd_double3 x); -/*! @abstract Interpolates smoothly between 0 at edge0 and 1 at edge1 - * @discussion You can use a scalar value for edge0 and edge1 if you want - * to clamp all lanes at the same points. */ -static inline SIMD_CFUNC simd_double4 simd_smoothstep(simd_double4 edge0, simd_double4 edge1, simd_double4 x); -/*! @abstract Interpolates smoothly between 0 at edge0 and 1 at edge1 - * @discussion You can use a scalar value for edge0 and edge1 if you want - * to clamp all lanes at the same points. */ -static inline SIMD_CFUNC simd_double8 simd_smoothstep(simd_double8 edge0, simd_double8 edge1, simd_double8 x); -/*! @abstract Interpolates smoothly between 0 at edge0 and 1 at edge1 - * @discussion Deprecated. Use simd_smoothstep(edge0, edge1, x) instead. */ -#define vector_smoothstep simd_smoothstep - -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC char simd_reduce_add(simd_char2 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC char simd_reduce_add(simd_char3 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC char simd_reduce_add(simd_char4 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC char simd_reduce_add(simd_char8 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC char simd_reduce_add(simd_char16 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC char simd_reduce_add(simd_char32 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC char simd_reduce_add(simd_char64 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC unsigned char simd_reduce_add(simd_uchar2 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC unsigned char simd_reduce_add(simd_uchar3 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC unsigned char simd_reduce_add(simd_uchar4 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC unsigned char simd_reduce_add(simd_uchar8 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC unsigned char simd_reduce_add(simd_uchar16 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC unsigned char simd_reduce_add(simd_uchar32 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC unsigned char simd_reduce_add(simd_uchar64 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC short simd_reduce_add(simd_short2 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC short simd_reduce_add(simd_short3 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC short simd_reduce_add(simd_short4 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC short simd_reduce_add(simd_short8 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC short simd_reduce_add(simd_short16 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC short simd_reduce_add(simd_short32 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC unsigned short simd_reduce_add(simd_ushort2 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC unsigned short simd_reduce_add(simd_ushort3 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC unsigned short simd_reduce_add(simd_ushort4 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC unsigned short simd_reduce_add(simd_ushort8 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC unsigned short simd_reduce_add(simd_ushort16 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC unsigned short simd_reduce_add(simd_ushort32 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC int simd_reduce_add(simd_int2 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC int simd_reduce_add(simd_int3 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC int simd_reduce_add(simd_int4 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC int simd_reduce_add(simd_int8 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC int simd_reduce_add(simd_int16 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC unsigned int simd_reduce_add(simd_uint2 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC unsigned int simd_reduce_add(simd_uint3 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC unsigned int simd_reduce_add(simd_uint4 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC unsigned int simd_reduce_add(simd_uint8 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC unsigned int simd_reduce_add(simd_uint16 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC float simd_reduce_add(simd_float2 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC float simd_reduce_add(simd_float3 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC float simd_reduce_add(simd_float4 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC float simd_reduce_add(simd_float8 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC float simd_reduce_add(simd_float16 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC simd_long1 simd_reduce_add(simd_long2 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC simd_long1 simd_reduce_add(simd_long3 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC simd_long1 simd_reduce_add(simd_long4 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC simd_long1 simd_reduce_add(simd_long8 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC simd_ulong1 simd_reduce_add(simd_ulong2 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC simd_ulong1 simd_reduce_add(simd_ulong3 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC simd_ulong1 simd_reduce_add(simd_ulong4 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC simd_ulong1 simd_reduce_add(simd_ulong8 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC double simd_reduce_add(simd_double2 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC double simd_reduce_add(simd_double3 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC double simd_reduce_add(simd_double4 x); -/*! @abstract Sum of elements in x. - * @discussion This computation may overflow; especial for 8-bit types you - * may need to convert to a wider type before reducing. */ -static inline SIMD_CFUNC double simd_reduce_add(simd_double8 x); -/*! @abstract Sum of elements in x. - * @discussion Deprecated. Use simd_add(x) instead. */ -#define vector_reduce_add simd_reduce_add - -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC char simd_reduce_min(simd_char2 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC char simd_reduce_min(simd_char3 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC char simd_reduce_min(simd_char4 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC char simd_reduce_min(simd_char8 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC char simd_reduce_min(simd_char16 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC char simd_reduce_min(simd_char32 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC char simd_reduce_min(simd_char64 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC unsigned char simd_reduce_min(simd_uchar2 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC unsigned char simd_reduce_min(simd_uchar3 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC unsigned char simd_reduce_min(simd_uchar4 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC unsigned char simd_reduce_min(simd_uchar8 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC unsigned char simd_reduce_min(simd_uchar16 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC unsigned char simd_reduce_min(simd_uchar32 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC unsigned char simd_reduce_min(simd_uchar64 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC short simd_reduce_min(simd_short2 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC short simd_reduce_min(simd_short3 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC short simd_reduce_min(simd_short4 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC short simd_reduce_min(simd_short8 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC short simd_reduce_min(simd_short16 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC short simd_reduce_min(simd_short32 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC unsigned short simd_reduce_min(simd_ushort2 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC unsigned short simd_reduce_min(simd_ushort3 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC unsigned short simd_reduce_min(simd_ushort4 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC unsigned short simd_reduce_min(simd_ushort8 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC unsigned short simd_reduce_min(simd_ushort16 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC unsigned short simd_reduce_min(simd_ushort32 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC int simd_reduce_min(simd_int2 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC int simd_reduce_min(simd_int3 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC int simd_reduce_min(simd_int4 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC int simd_reduce_min(simd_int8 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC int simd_reduce_min(simd_int16 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC unsigned int simd_reduce_min(simd_uint2 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC unsigned int simd_reduce_min(simd_uint3 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC unsigned int simd_reduce_min(simd_uint4 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC unsigned int simd_reduce_min(simd_uint8 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC unsigned int simd_reduce_min(simd_uint16 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC float simd_reduce_min(simd_float2 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC float simd_reduce_min(simd_float3 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC float simd_reduce_min(simd_float4 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC float simd_reduce_min(simd_float8 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC float simd_reduce_min(simd_float16 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC simd_long1 simd_reduce_min(simd_long2 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC simd_long1 simd_reduce_min(simd_long3 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC simd_long1 simd_reduce_min(simd_long4 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC simd_long1 simd_reduce_min(simd_long8 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC simd_ulong1 simd_reduce_min(simd_ulong2 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC simd_ulong1 simd_reduce_min(simd_ulong3 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC simd_ulong1 simd_reduce_min(simd_ulong4 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC simd_ulong1 simd_reduce_min(simd_ulong8 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC double simd_reduce_min(simd_double2 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC double simd_reduce_min(simd_double3 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC double simd_reduce_min(simd_double4 x); -/*! @abstract Minimum of elements in x. */ -static inline SIMD_CFUNC double simd_reduce_min(simd_double8 x); -/*! @abstract Minimum of elements in x. - * @discussion Deprecated. Use simd_min(x) instead. */ -#define vector_reduce_min simd_reduce_min - -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC char simd_reduce_max(simd_char2 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC char simd_reduce_max(simd_char3 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC char simd_reduce_max(simd_char4 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC char simd_reduce_max(simd_char8 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC char simd_reduce_max(simd_char16 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC char simd_reduce_max(simd_char32 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC char simd_reduce_max(simd_char64 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC unsigned char simd_reduce_max(simd_uchar2 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC unsigned char simd_reduce_max(simd_uchar3 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC unsigned char simd_reduce_max(simd_uchar4 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC unsigned char simd_reduce_max(simd_uchar8 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC unsigned char simd_reduce_max(simd_uchar16 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC unsigned char simd_reduce_max(simd_uchar32 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC unsigned char simd_reduce_max(simd_uchar64 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC short simd_reduce_max(simd_short2 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC short simd_reduce_max(simd_short3 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC short simd_reduce_max(simd_short4 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC short simd_reduce_max(simd_short8 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC short simd_reduce_max(simd_short16 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC short simd_reduce_max(simd_short32 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC unsigned short simd_reduce_max(simd_ushort2 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC unsigned short simd_reduce_max(simd_ushort3 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC unsigned short simd_reduce_max(simd_ushort4 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC unsigned short simd_reduce_max(simd_ushort8 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC unsigned short simd_reduce_max(simd_ushort16 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC unsigned short simd_reduce_max(simd_ushort32 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC int simd_reduce_max(simd_int2 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC int simd_reduce_max(simd_int3 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC int simd_reduce_max(simd_int4 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC int simd_reduce_max(simd_int8 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC int simd_reduce_max(simd_int16 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC unsigned int simd_reduce_max(simd_uint2 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC unsigned int simd_reduce_max(simd_uint3 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC unsigned int simd_reduce_max(simd_uint4 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC unsigned int simd_reduce_max(simd_uint8 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC unsigned int simd_reduce_max(simd_uint16 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC float simd_reduce_max(simd_float2 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC float simd_reduce_max(simd_float3 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC float simd_reduce_max(simd_float4 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC float simd_reduce_max(simd_float8 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC float simd_reduce_max(simd_float16 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC simd_long1 simd_reduce_max(simd_long2 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC simd_long1 simd_reduce_max(simd_long3 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC simd_long1 simd_reduce_max(simd_long4 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC simd_long1 simd_reduce_max(simd_long8 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC simd_ulong1 simd_reduce_max(simd_ulong2 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC simd_ulong1 simd_reduce_max(simd_ulong3 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC simd_ulong1 simd_reduce_max(simd_ulong4 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC simd_ulong1 simd_reduce_max(simd_ulong8 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC double simd_reduce_max(simd_double2 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC double simd_reduce_max(simd_double3 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC double simd_reduce_max(simd_double4 x); -/*! @abstract Maximum of elements in x. */ -static inline SIMD_CFUNC double simd_reduce_max(simd_double8 x); -/*! @abstract Maximum of elements in x. - * @discussion Deprecated. Use simd_max(x) instead. */ -#define vector_reduce_max simd_reduce_max - -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_char2 x, simd_char2 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_char3 x, simd_char3 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_char4 x, simd_char4 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_char8 x, simd_char8 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_char16 x, simd_char16 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_char32 x, simd_char32 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_char64 x, simd_char64 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_uchar2 x, simd_uchar2 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_uchar3 x, simd_uchar3 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_uchar4 x, simd_uchar4 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_uchar8 x, simd_uchar8 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_uchar16 x, simd_uchar16 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_uchar32 x, simd_uchar32 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_uchar64 x, simd_uchar64 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_short2 x, simd_short2 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_short3 x, simd_short3 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_short4 x, simd_short4 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_short8 x, simd_short8 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_short16 x, simd_short16 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_short32 x, simd_short32 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_ushort2 x, simd_ushort2 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_ushort3 x, simd_ushort3 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_ushort4 x, simd_ushort4 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_ushort8 x, simd_ushort8 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_ushort16 x, simd_ushort16 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_ushort32 x, simd_ushort32 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_int2 x, simd_int2 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_int3 x, simd_int3 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_int4 x, simd_int4 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_int8 x, simd_int8 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_int16 x, simd_int16 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_uint2 x, simd_uint2 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_uint3 x, simd_uint3 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_uint4 x, simd_uint4 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_uint8 x, simd_uint8 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_uint16 x, simd_uint16 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_float2 x, simd_float2 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_float3 x, simd_float3 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_float4 x, simd_float4 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_float8 x, simd_float8 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_float16 x, simd_float16 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_long2 x, simd_long2 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_long3 x, simd_long3 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_long4 x, simd_long4 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_long8 x, simd_long8 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_ulong2 x, simd_ulong2 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_ulong3 x, simd_ulong3 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_ulong4 x, simd_ulong4 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_ulong8 x, simd_ulong8 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_double2 x, simd_double2 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_double3 x, simd_double3 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_double4 x, simd_double4 y) { - return simd_all(x == y); -} -/*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. */ -static inline SIMD_CFUNC simd_bool simd_equal(simd_double8 x, simd_double8 y) { - return simd_all(x == y); -} - -#ifdef __cplusplus -} /* extern "C" */ - -namespace simd { - /*! @abstract The lanewise absolute value of x. */ - template static SIMD_CPPFUNC typeN abs(const typeN x) { return ::simd_abs(x); } - /*! @abstract The lanewise maximum of x and y. */ - template static SIMD_CPPFUNC typeN max(const typeN x, const typeN y) { return ::simd_max(x,y); } - /*! @abstract The lanewise minimum of x and y. */ - template static SIMD_CPPFUNC typeN min(const typeN x, const typeN y) { return ::simd_min(x,y); } - /*! @abstract x clamped to the interval [min, max]. */ - template static SIMD_CPPFUNC typeN clamp(const typeN x, const typeN min, const typeN max) { return ::simd_clamp(x,min,max); } - /*! @abstract -1 if x < 0, +1 if x > 0, and 0 otherwise. */ - template static SIMD_CPPFUNC fptypeN sign(const fptypeN x) { return ::simd_sign(x); } - /*! @abstract Linearly interpolates between x and y, taking the value x when t=0 and y when t=1 */ - template static SIMD_CPPFUNC fptypeN mix(const fptypeN x, const fptypeN y, const fptypeN t) { return ::simd_mix(x,y,t); } - /*! @abstract An approximation to 1/x. */ - template static SIMD_CPPFUNC fptypeN recip(const fptypeN x) { return simd_recip(x); } - /*! @abstract An approximation to 1/sqrt(x). */ - template static SIMD_CPPFUNC fptypeN rsqrt(const fptypeN x) { return simd_rsqrt(x); } - /*! @abstract The "fracional part" of x, in the range [0,1). */ - template static SIMD_CPPFUNC fptypeN fract(const fptypeN x) { return ::simd_fract(x); } - /*! @abstract 0 if x < edge, 1 otherwise. */ - template static SIMD_CPPFUNC fptypeN step(const fptypeN edge, const fptypeN x) { return ::simd_step(edge,x); } - /*! @abstract smoothly interpolates from 0 at edge0 to 1 at edge1. */ - template static SIMD_CPPFUNC fptypeN smoothstep(const fptypeN edge0, const fptypeN edge1, const fptypeN x) { return ::simd_smoothstep(edge0,edge1,x); } - /*! @abstract True if and only if each lane of x is equal to the - * corresponding lane of y. - * - * @discussion This isn't operator== because that's already defined by - * the compiler to return a lane mask. */ - template static SIMD_CPPFUNC simd_bool equal(const fptypeN x, const fptypeN y) { return ::simd_equal(x, y); } -#if __cpp_decltype_auto - /* If you are targeting an earlier version of the C++ standard that lacks - decltype_auto support, you may use the C-style simd_reduce_* functions - instead. */ - /*! @abstract The sum of the elements in x. May overflow. */ - template static SIMD_CPPFUNC auto reduce_add(typeN x) { return ::simd_reduce_add(x); } - /*! @abstract The least element in x. */ - template static SIMD_CPPFUNC auto reduce_min(typeN x) { return ::simd_reduce_min(x); } - /*! @abstract The greatest element in x. */ - template static SIMD_CPPFUNC auto reduce_max(typeN x) { return ::simd_reduce_max(x); } -#endif - namespace precise { - /*! @abstract An approximation to 1/x. */ - template static SIMD_CPPFUNC fptypeN recip(const fptypeN x) { return ::simd_precise_recip(x); } - /*! @abstract An approximation to 1/sqrt(x). */ - template static SIMD_CPPFUNC fptypeN rsqrt(const fptypeN x) { return ::simd_precise_rsqrt(x); } - } - namespace fast { - /*! @abstract An approximation to 1/x. */ - template static SIMD_CPPFUNC fptypeN recip(const fptypeN x) { return ::simd_fast_recip(x); } - /*! @abstract An approximation to 1/sqrt(x). */ - template static SIMD_CPPFUNC fptypeN rsqrt(const fptypeN x) { return ::simd_fast_rsqrt(x); } - } -} - -extern "C" { -#endif /* __cplusplus */ - -#pragma mark - Implementation - -static inline SIMD_CFUNC simd_char2 simd_abs(simd_char2 x) { - return simd_make_char2(simd_abs(simd_make_char8_undef(x))); -} - -static inline SIMD_CFUNC simd_char3 simd_abs(simd_char3 x) { - return simd_make_char3(simd_abs(simd_make_char8_undef(x))); -} - -static inline SIMD_CFUNC simd_char4 simd_abs(simd_char4 x) { - return simd_make_char4(simd_abs(simd_make_char8_undef(x))); -} - -static inline SIMD_CFUNC simd_char8 simd_abs(simd_char8 x) { -#if defined __arm__ || defined __arm64__ - return vabs_s8(x); -#else - return simd_make_char8(simd_abs(simd_make_char16_undef(x))); -#endif -} - -static inline SIMD_CFUNC simd_char16 simd_abs(simd_char16 x) { -#if defined __arm__ || defined __arm64__ - return vabsq_s8(x); -#elif defined __SSE4_1__ - return _mm_abs_epi8(x); -#else - simd_char16 mask = x >> 7; return (x ^ mask) - mask; -#endif -} - -static inline SIMD_CFUNC simd_char32 simd_abs(simd_char32 x) { -#if defined __AVX2__ - return _mm256_abs_epi8(x); -#else - return simd_make_char32(simd_abs(x.lo), simd_abs(x.hi)); -#endif -} - -static inline SIMD_CFUNC simd_char64 simd_abs(simd_char64 x) { -#if defined __AVX512BW__ - return _mm512_abs_epi8(x); -#else - return simd_make_char64(simd_abs(x.lo), simd_abs(x.hi)); -#endif -} - -static inline SIMD_CFUNC simd_short2 simd_abs(simd_short2 x) { - return simd_make_short2(simd_abs(simd_make_short4_undef(x))); -} - -static inline SIMD_CFUNC simd_short3 simd_abs(simd_short3 x) { - return simd_make_short3(simd_abs(simd_make_short4_undef(x))); -} - -static inline SIMD_CFUNC simd_short4 simd_abs(simd_short4 x) { -#if defined __arm__ || defined __arm64__ - return vabs_s16(x); -#else - return simd_make_short4(simd_abs(simd_make_short8_undef(x))); -#endif -} - -static inline SIMD_CFUNC simd_short8 simd_abs(simd_short8 x) { -#if defined __arm__ || defined __arm64__ - return vabsq_s16(x); -#elif defined __SSE4_1__ - return _mm_abs_epi16(x); -#else - simd_short8 mask = x >> 15; return (x ^ mask) - mask; -#endif -} - -static inline SIMD_CFUNC simd_short16 simd_abs(simd_short16 x) { -#if defined __AVX2__ - return _mm256_abs_epi16(x); -#else - return simd_make_short16(simd_abs(x.lo), simd_abs(x.hi)); -#endif -} - -static inline SIMD_CFUNC simd_short32 simd_abs(simd_short32 x) { -#if defined __AVX512BW__ - return _mm512_abs_epi16(x); -#else - return simd_make_short32(simd_abs(x.lo), simd_abs(x.hi)); -#endif -} - -static inline SIMD_CFUNC simd_int2 simd_abs(simd_int2 x) { -#if defined __arm__ || defined __arm64__ - return vabs_s32(x); -#else - return simd_make_int2(simd_abs(simd_make_int4_undef(x))); -#endif -} - -static inline SIMD_CFUNC simd_int3 simd_abs(simd_int3 x) { - return simd_make_int3(simd_abs(simd_make_int4_undef(x))); -} - -static inline SIMD_CFUNC simd_int4 simd_abs(simd_int4 x) { -#if defined __arm__ || defined __arm64__ - return vabsq_s32(x); -#elif defined __SSE4_1__ - return _mm_abs_epi32(x); -#else - simd_int4 mask = x >> 31; return (x ^ mask) - mask; -#endif -} - -static inline SIMD_CFUNC simd_int8 simd_abs(simd_int8 x) { -#if defined __AVX2__ - return _mm256_abs_epi32(x); -#else - return simd_make_int8(simd_abs(x.lo), simd_abs(x.hi)); -#endif -} - -static inline SIMD_CFUNC simd_int16 simd_abs(simd_int16 x) { -#if defined __AVX512F__ - return _mm512_abs_epi32(x); -#else - return simd_make_int16(simd_abs(x.lo), simd_abs(x.hi)); -#endif -} - -static inline SIMD_CFUNC simd_float2 simd_abs(simd_float2 x) { - return __tg_fabs(x); -} - -static inline SIMD_CFUNC simd_float3 simd_abs(simd_float3 x) { - return __tg_fabs(x); -} - -static inline SIMD_CFUNC simd_float4 simd_abs(simd_float4 x) { - return __tg_fabs(x); -} - -static inline SIMD_CFUNC simd_float8 simd_abs(simd_float8 x) { - return __tg_fabs(x); -} - -static inline SIMD_CFUNC simd_float16 simd_abs(simd_float16 x) { - return __tg_fabs(x); -} - -static inline SIMD_CFUNC simd_long2 simd_abs(simd_long2 x) { -#if defined __arm64__ - return vabsq_s64(x); -#elif defined __SSE4_1__ - return _mm_abs_epi64(x); -#else - simd_long2 mask = x >> 63; return (x ^ mask) - mask; -#endif -} - -static inline SIMD_CFUNC simd_long3 simd_abs(simd_long3 x) { - return simd_make_long3(simd_abs(simd_make_long4_undef(x))); -} - -static inline SIMD_CFUNC simd_long4 simd_abs(simd_long4 x) { -#if defined __AVX2__ - return _mm256_abs_epi64(x); -#else - return simd_make_long4(simd_abs(x.lo), simd_abs(x.hi)); -#endif -} - -static inline SIMD_CFUNC simd_long8 simd_abs(simd_long8 x) { -#if defined __AVX512F__ - return _mm512_abs_epi64(x); -#else - return simd_make_long8(simd_abs(x.lo), simd_abs(x.hi)); -#endif -} - -static inline SIMD_CFUNC simd_double2 simd_abs(simd_double2 x) { - return __tg_fabs(x); -} - -static inline SIMD_CFUNC simd_double3 simd_abs(simd_double3 x) { - return __tg_fabs(x); -} - -static inline SIMD_CFUNC simd_double4 simd_abs(simd_double4 x) { - return __tg_fabs(x); -} - -static inline SIMD_CFUNC simd_double8 simd_abs(simd_double8 x) { - return __tg_fabs(x); -} - -static inline SIMD_CFUNC simd_char2 simd_min(simd_char2 x, simd_char2 y) { - return simd_make_char2(simd_min(simd_make_char8_undef(x), simd_make_char8_undef(y))); -} - -static inline SIMD_CFUNC simd_char3 simd_min(simd_char3 x, simd_char3 y) { - return simd_make_char3(simd_min(simd_make_char8_undef(x), simd_make_char8_undef(y))); -} - -static inline SIMD_CFUNC simd_char4 simd_min(simd_char4 x, simd_char4 y) { - return simd_make_char4(simd_min(simd_make_char8_undef(x), simd_make_char8_undef(y))); -} - -static inline SIMD_CFUNC simd_char8 simd_min(simd_char8 x, simd_char8 y) { -#if defined __arm__ || defined __arm64__ - return vmin_s8(x, y); -#else - return simd_make_char8(simd_min(simd_make_char16_undef(x), simd_make_char16_undef(y))); -#endif - -} - -static inline SIMD_CFUNC simd_char16 simd_min(simd_char16 x, simd_char16 y) { -#if defined __arm__ || defined __arm64__ - return vminq_s8(x, y); -#elif defined __SSE4_1__ - return _mm_min_epi8(x, y); -#else - return simd_bitselect(x, y, y < x); -#endif -} - -static inline SIMD_CFUNC simd_char32 simd_min(simd_char32 x, simd_char32 y) { -#if defined __AVX2__ - return _mm256_min_epi8(x, y); -#else - return simd_bitselect(x, y, y < x); -#endif -} - -static inline SIMD_CFUNC simd_char64 simd_min(simd_char64 x, simd_char64 y) { -#if defined __AVX512BW__ - return _mm512_min_epi8(x, y); -#else - return simd_bitselect(x, y, y < x); -#endif -} - -static inline SIMD_CFUNC simd_uchar2 simd_min(simd_uchar2 x, simd_uchar2 y) { - return simd_make_uchar2(simd_min(simd_make_uchar8_undef(x), simd_make_uchar8_undef(y))); -} - -static inline SIMD_CFUNC simd_uchar3 simd_min(simd_uchar3 x, simd_uchar3 y) { - return simd_make_uchar3(simd_min(simd_make_uchar8_undef(x), simd_make_uchar8_undef(y))); -} - -static inline SIMD_CFUNC simd_uchar4 simd_min(simd_uchar4 x, simd_uchar4 y) { - return simd_make_uchar4(simd_min(simd_make_uchar8_undef(x), simd_make_uchar8_undef(y))); -} - -static inline SIMD_CFUNC simd_uchar8 simd_min(simd_uchar8 x, simd_uchar8 y) { -#if defined __arm__ || defined __arm64__ - return vmin_u8(x, y); -#else - return simd_make_uchar8(simd_min(simd_make_uchar16_undef(x), simd_make_uchar16_undef(y))); -#endif - -} - -static inline SIMD_CFUNC simd_uchar16 simd_min(simd_uchar16 x, simd_uchar16 y) { -#if defined __arm__ || defined __arm64__ - return vminq_u8(x, y); -#elif defined __SSE4_1__ - return _mm_min_epu8(x, y); -#else - return simd_bitselect(x, y, y < x); -#endif -} - -static inline SIMD_CFUNC simd_uchar32 simd_min(simd_uchar32 x, simd_uchar32 y) { -#if defined __AVX2__ - return _mm256_min_epu8(x, y); -#else - return simd_bitselect(x, y, y < x); -#endif -} - -static inline SIMD_CFUNC simd_uchar64 simd_min(simd_uchar64 x, simd_uchar64 y) { -#if defined __AVX512BW__ - return _mm512_min_epu8(x, y); -#else - return simd_bitselect(x, y, y < x); -#endif -} - -static inline SIMD_CFUNC simd_short2 simd_min(simd_short2 x, simd_short2 y) { - return simd_make_short2(simd_min(simd_make_short4_undef(x), simd_make_short4_undef(y))); -} - -static inline SIMD_CFUNC simd_short3 simd_min(simd_short3 x, simd_short3 y) { - return simd_make_short3(simd_min(simd_make_short4_undef(x), simd_make_short4_undef(y))); -} - -static inline SIMD_CFUNC simd_short4 simd_min(simd_short4 x, simd_short4 y) { -#if defined __arm__ || defined __arm64__ - return vmin_s16(x, y); -#else - return simd_make_short4(simd_min(simd_make_short8_undef(x), simd_make_short8_undef(y))); -#endif - -} - -static inline SIMD_CFUNC simd_short8 simd_min(simd_short8 x, simd_short8 y) { -#if defined __arm__ || defined __arm64__ - return vminq_s16(x, y); -#elif defined __SSE4_1__ - return _mm_min_epi16(x, y); -#else - return simd_bitselect(x, y, y < x); -#endif -} - -static inline SIMD_CFUNC simd_short16 simd_min(simd_short16 x, simd_short16 y) { -#if defined __AVX2__ - return _mm256_min_epi16(x, y); -#else - return simd_bitselect(x, y, y < x); -#endif -} - -static inline SIMD_CFUNC simd_short32 simd_min(simd_short32 x, simd_short32 y) { -#if defined __AVX512BW__ - return _mm512_min_epi16(x, y); -#else - return simd_bitselect(x, y, y < x); -#endif -} - -static inline SIMD_CFUNC simd_ushort2 simd_min(simd_ushort2 x, simd_ushort2 y) { - return simd_make_ushort2(simd_min(simd_make_ushort4_undef(x), simd_make_ushort4_undef(y))); -} - -static inline SIMD_CFUNC simd_ushort3 simd_min(simd_ushort3 x, simd_ushort3 y) { - return simd_make_ushort3(simd_min(simd_make_ushort4_undef(x), simd_make_ushort4_undef(y))); -} - -static inline SIMD_CFUNC simd_ushort4 simd_min(simd_ushort4 x, simd_ushort4 y) { -#if defined __arm__ || defined __arm64__ - return vmin_u16(x, y); -#else - return simd_make_ushort4(simd_min(simd_make_ushort8_undef(x), simd_make_ushort8_undef(y))); -#endif - -} - -static inline SIMD_CFUNC simd_ushort8 simd_min(simd_ushort8 x, simd_ushort8 y) { -#if defined __arm__ || defined __arm64__ - return vminq_u16(x, y); -#elif defined __SSE4_1__ - return _mm_min_epu16(x, y); -#else - return simd_bitselect(x, y, y < x); -#endif -} - -static inline SIMD_CFUNC simd_ushort16 simd_min(simd_ushort16 x, simd_ushort16 y) { -#if defined __AVX2__ - return _mm256_min_epu16(x, y); -#else - return simd_bitselect(x, y, y < x); -#endif -} - -static inline SIMD_CFUNC simd_ushort32 simd_min(simd_ushort32 x, simd_ushort32 y) { -#if defined __AVX512BW__ - return _mm512_min_epu16(x, y); -#else - return simd_bitselect(x, y, y < x); -#endif -} - -static inline SIMD_CFUNC simd_int2 simd_min(simd_int2 x, simd_int2 y) { -#if defined __arm__ || defined __arm64__ - return vmin_s32(x, y); -#else - return simd_make_int2(simd_min(simd_make_int4_undef(x), simd_make_int4_undef(y))); -#endif - -} - -static inline SIMD_CFUNC simd_int3 simd_min(simd_int3 x, simd_int3 y) { - return simd_make_int3(simd_min(simd_make_int4_undef(x), simd_make_int4_undef(y))); -} - -static inline SIMD_CFUNC simd_int4 simd_min(simd_int4 x, simd_int4 y) { -#if defined __arm__ || defined __arm64__ - return vminq_s32(x, y); -#elif defined __SSE4_1__ - return _mm_min_epi32(x, y); -#else - return simd_bitselect(x, y, y < x); -#endif -} - -static inline SIMD_CFUNC simd_int8 simd_min(simd_int8 x, simd_int8 y) { -#if defined __AVX2__ - return _mm256_min_epi32(x, y); -#else - return simd_bitselect(x, y, y < x); -#endif -} - -static inline SIMD_CFUNC simd_int16 simd_min(simd_int16 x, simd_int16 y) { -#if defined __AVX512F__ - return _mm512_min_epi32(x, y); -#else - return simd_bitselect(x, y, y < x); -#endif -} - -static inline SIMD_CFUNC simd_uint2 simd_min(simd_uint2 x, simd_uint2 y) { -#if defined __arm__ || defined __arm64__ - return vmin_u32(x, y); -#else - return simd_make_uint2(simd_min(simd_make_uint4_undef(x), simd_make_uint4_undef(y))); -#endif - -} - -static inline SIMD_CFUNC simd_uint3 simd_min(simd_uint3 x, simd_uint3 y) { - return simd_make_uint3(simd_min(simd_make_uint4_undef(x), simd_make_uint4_undef(y))); -} - -static inline SIMD_CFUNC simd_uint4 simd_min(simd_uint4 x, simd_uint4 y) { -#if defined __arm__ || defined __arm64__ - return vminq_u32(x, y); -#elif defined __SSE4_1__ - return _mm_min_epu32(x, y); -#else - return simd_bitselect(x, y, y < x); -#endif -} - -static inline SIMD_CFUNC simd_uint8 simd_min(simd_uint8 x, simd_uint8 y) { -#if defined __AVX2__ - return _mm256_min_epu32(x, y); -#else - return simd_bitselect(x, y, y < x); -#endif -} - -static inline SIMD_CFUNC simd_uint16 simd_min(simd_uint16 x, simd_uint16 y) { -#if defined __AVX512F__ - return _mm512_min_epu32(x, y); -#else - return simd_bitselect(x, y, y < x); -#endif -} - -static inline SIMD_CFUNC float simd_min(float x, float y) { - return __tg_fmin(x,y); -} - -static inline SIMD_CFUNC simd_float2 simd_min(simd_float2 x, simd_float2 y) { - return __tg_fmin(x,y); -} - -static inline SIMD_CFUNC simd_float3 simd_min(simd_float3 x, simd_float3 y) { - return __tg_fmin(x,y); -} - -static inline SIMD_CFUNC simd_float4 simd_min(simd_float4 x, simd_float4 y) { - return __tg_fmin(x,y); -} - -static inline SIMD_CFUNC simd_float8 simd_min(simd_float8 x, simd_float8 y) { - return __tg_fmin(x,y); -} - -static inline SIMD_CFUNC simd_float16 simd_min(simd_float16 x, simd_float16 y) { - return __tg_fmin(x,y); -} - -static inline SIMD_CFUNC simd_long2 simd_min(simd_long2 x, simd_long2 y) { -#if defined __AVX512VL__ - return _mm_min_epi64(x, y); -#else - return simd_bitselect(x, y, y < x); -#endif -} - -static inline SIMD_CFUNC simd_long3 simd_min(simd_long3 x, simd_long3 y) { - return simd_make_long3(simd_min(simd_make_long4_undef(x), simd_make_long4_undef(y))); -} - -static inline SIMD_CFUNC simd_long4 simd_min(simd_long4 x, simd_long4 y) { -#if defined __AVX512VL__ - return _mm256_min_epi64(x, y); -#else - return simd_bitselect(x, y, y < x); -#endif -} - -static inline SIMD_CFUNC simd_long8 simd_min(simd_long8 x, simd_long8 y) { -#if defined __AVX512F__ - return _mm512_min_epi64(x, y); -#else - return simd_bitselect(x, y, y < x); -#endif -} - -static inline SIMD_CFUNC simd_ulong2 simd_min(simd_ulong2 x, simd_ulong2 y) { -#if defined __AVX512VL__ - return _mm_min_epu64(x, y); -#else - return simd_bitselect(x, y, y < x); -#endif -} - -static inline SIMD_CFUNC simd_ulong3 simd_min(simd_ulong3 x, simd_ulong3 y) { - return simd_make_ulong3(simd_min(simd_make_ulong4_undef(x), simd_make_ulong4_undef(y))); -} - -static inline SIMD_CFUNC simd_ulong4 simd_min(simd_ulong4 x, simd_ulong4 y) { -#if defined __AVX512VL__ - return _mm256_min_epu64(x, y); -#else - return simd_bitselect(x, y, y < x); -#endif -} - -static inline SIMD_CFUNC simd_ulong8 simd_min(simd_ulong8 x, simd_ulong8 y) { -#if defined __AVX512F__ - return _mm512_min_epu64(x, y); -#else - return simd_bitselect(x, y, y < x); -#endif -} - -static inline SIMD_CFUNC double simd_min(double x, double y) { - return __tg_fmin(x,y); -} - -static inline SIMD_CFUNC simd_double2 simd_min(simd_double2 x, simd_double2 y) { - return __tg_fmin(x,y); -} - -static inline SIMD_CFUNC simd_double3 simd_min(simd_double3 x, simd_double3 y) { - return __tg_fmin(x,y); -} - -static inline SIMD_CFUNC simd_double4 simd_min(simd_double4 x, simd_double4 y) { - return __tg_fmin(x,y); -} - -static inline SIMD_CFUNC simd_double8 simd_min(simd_double8 x, simd_double8 y) { - return __tg_fmin(x,y); -} - -static inline SIMD_CFUNC simd_char2 simd_max(simd_char2 x, simd_char2 y) { - return simd_make_char2(simd_max(simd_make_char8_undef(x), simd_make_char8_undef(y))); -} - -static inline SIMD_CFUNC simd_char3 simd_max(simd_char3 x, simd_char3 y) { - return simd_make_char3(simd_max(simd_make_char8_undef(x), simd_make_char8_undef(y))); -} - -static inline SIMD_CFUNC simd_char4 simd_max(simd_char4 x, simd_char4 y) { - return simd_make_char4(simd_max(simd_make_char8_undef(x), simd_make_char8_undef(y))); -} - -static inline SIMD_CFUNC simd_char8 simd_max(simd_char8 x, simd_char8 y) { -#if defined __arm__ || defined __arm64__ - return vmax_s8(x, y); -#else - return simd_make_char8(simd_max(simd_make_char16_undef(x), simd_make_char16_undef(y))); -#endif - -} - -static inline SIMD_CFUNC simd_char16 simd_max(simd_char16 x, simd_char16 y) { -#if defined __arm__ || defined __arm64__ - return vmaxq_s8(x, y); -#elif defined __SSE4_1__ - return _mm_max_epi8(x, y); -#else - return simd_bitselect(x, y, x < y); -#endif -} - -static inline SIMD_CFUNC simd_char32 simd_max(simd_char32 x, simd_char32 y) { -#if defined __AVX2__ - return _mm256_max_epi8(x, y); -#else - return simd_bitselect(x, y, x < y); -#endif -} - -static inline SIMD_CFUNC simd_char64 simd_max(simd_char64 x, simd_char64 y) { -#if defined __AVX512BW__ - return _mm512_max_epi8(x, y); -#else - return simd_bitselect(x, y, x < y); -#endif -} - -static inline SIMD_CFUNC simd_uchar2 simd_max(simd_uchar2 x, simd_uchar2 y) { - return simd_make_uchar2(simd_max(simd_make_uchar8_undef(x), simd_make_uchar8_undef(y))); -} - -static inline SIMD_CFUNC simd_uchar3 simd_max(simd_uchar3 x, simd_uchar3 y) { - return simd_make_uchar3(simd_max(simd_make_uchar8_undef(x), simd_make_uchar8_undef(y))); -} - -static inline SIMD_CFUNC simd_uchar4 simd_max(simd_uchar4 x, simd_uchar4 y) { - return simd_make_uchar4(simd_max(simd_make_uchar8_undef(x), simd_make_uchar8_undef(y))); -} - -static inline SIMD_CFUNC simd_uchar8 simd_max(simd_uchar8 x, simd_uchar8 y) { -#if defined __arm__ || defined __arm64__ - return vmax_u8(x, y); -#else - return simd_make_uchar8(simd_max(simd_make_uchar16_undef(x), simd_make_uchar16_undef(y))); -#endif - -} - -static inline SIMD_CFUNC simd_uchar16 simd_max(simd_uchar16 x, simd_uchar16 y) { -#if defined __arm__ || defined __arm64__ - return vmaxq_u8(x, y); -#elif defined __SSE4_1__ - return _mm_max_epu8(x, y); -#else - return simd_bitselect(x, y, x < y); -#endif -} - -static inline SIMD_CFUNC simd_uchar32 simd_max(simd_uchar32 x, simd_uchar32 y) { -#if defined __AVX2__ - return _mm256_max_epu8(x, y); -#else - return simd_bitselect(x, y, x < y); -#endif -} - -static inline SIMD_CFUNC simd_uchar64 simd_max(simd_uchar64 x, simd_uchar64 y) { -#if defined __AVX512BW__ - return _mm512_max_epu8(x, y); -#else - return simd_bitselect(x, y, x < y); -#endif -} - -static inline SIMD_CFUNC simd_short2 simd_max(simd_short2 x, simd_short2 y) { - return simd_make_short2(simd_max(simd_make_short4_undef(x), simd_make_short4_undef(y))); -} - -static inline SIMD_CFUNC simd_short3 simd_max(simd_short3 x, simd_short3 y) { - return simd_make_short3(simd_max(simd_make_short4_undef(x), simd_make_short4_undef(y))); -} - -static inline SIMD_CFUNC simd_short4 simd_max(simd_short4 x, simd_short4 y) { -#if defined __arm__ || defined __arm64__ - return vmax_s16(x, y); -#else - return simd_make_short4(simd_max(simd_make_short8_undef(x), simd_make_short8_undef(y))); -#endif - -} - -static inline SIMD_CFUNC simd_short8 simd_max(simd_short8 x, simd_short8 y) { -#if defined __arm__ || defined __arm64__ - return vmaxq_s16(x, y); -#elif defined __SSE4_1__ - return _mm_max_epi16(x, y); -#else - return simd_bitselect(x, y, x < y); -#endif -} - -static inline SIMD_CFUNC simd_short16 simd_max(simd_short16 x, simd_short16 y) { -#if defined __AVX2__ - return _mm256_max_epi16(x, y); -#else - return simd_bitselect(x, y, x < y); -#endif -} - -static inline SIMD_CFUNC simd_short32 simd_max(simd_short32 x, simd_short32 y) { -#if defined __AVX512BW__ - return _mm512_max_epi16(x, y); -#else - return simd_bitselect(x, y, x < y); -#endif -} - -static inline SIMD_CFUNC simd_ushort2 simd_max(simd_ushort2 x, simd_ushort2 y) { - return simd_make_ushort2(simd_max(simd_make_ushort4_undef(x), simd_make_ushort4_undef(y))); -} - -static inline SIMD_CFUNC simd_ushort3 simd_max(simd_ushort3 x, simd_ushort3 y) { - return simd_make_ushort3(simd_max(simd_make_ushort4_undef(x), simd_make_ushort4_undef(y))); -} - -static inline SIMD_CFUNC simd_ushort4 simd_max(simd_ushort4 x, simd_ushort4 y) { -#if defined __arm__ || defined __arm64__ - return vmax_u16(x, y); -#else - return simd_make_ushort4(simd_max(simd_make_ushort8_undef(x), simd_make_ushort8_undef(y))); -#endif - -} - -static inline SIMD_CFUNC simd_ushort8 simd_max(simd_ushort8 x, simd_ushort8 y) { -#if defined __arm__ || defined __arm64__ - return vmaxq_u16(x, y); -#elif defined __SSE4_1__ - return _mm_max_epu16(x, y); -#else - return simd_bitselect(x, y, x < y); -#endif -} - -static inline SIMD_CFUNC simd_ushort16 simd_max(simd_ushort16 x, simd_ushort16 y) { -#if defined __AVX2__ - return _mm256_max_epu16(x, y); -#else - return simd_bitselect(x, y, x < y); -#endif -} - -static inline SIMD_CFUNC simd_ushort32 simd_max(simd_ushort32 x, simd_ushort32 y) { -#if defined __AVX512BW__ - return _mm512_max_epu16(x, y); -#else - return simd_bitselect(x, y, x < y); -#endif -} - -static inline SIMD_CFUNC simd_int2 simd_max(simd_int2 x, simd_int2 y) { -#if defined __arm__ || defined __arm64__ - return vmax_s32(x, y); -#else - return simd_make_int2(simd_max(simd_make_int4_undef(x), simd_make_int4_undef(y))); -#endif - -} - -static inline SIMD_CFUNC simd_int3 simd_max(simd_int3 x, simd_int3 y) { - return simd_make_int3(simd_max(simd_make_int4_undef(x), simd_make_int4_undef(y))); -} - -static inline SIMD_CFUNC simd_int4 simd_max(simd_int4 x, simd_int4 y) { -#if defined __arm__ || defined __arm64__ - return vmaxq_s32(x, y); -#elif defined __SSE4_1__ - return _mm_max_epi32(x, y); -#else - return simd_bitselect(x, y, x < y); -#endif -} - -static inline SIMD_CFUNC simd_int8 simd_max(simd_int8 x, simd_int8 y) { -#if defined __AVX2__ - return _mm256_max_epi32(x, y); -#else - return simd_bitselect(x, y, x < y); -#endif -} - -static inline SIMD_CFUNC simd_int16 simd_max(simd_int16 x, simd_int16 y) { -#if defined __AVX512F__ - return _mm512_max_epi32(x, y); -#else - return simd_bitselect(x, y, x < y); -#endif -} - -static inline SIMD_CFUNC simd_uint2 simd_max(simd_uint2 x, simd_uint2 y) { -#if defined __arm__ || defined __arm64__ - return vmax_u32(x, y); -#else - return simd_make_uint2(simd_max(simd_make_uint4_undef(x), simd_make_uint4_undef(y))); -#endif - -} - -static inline SIMD_CFUNC simd_uint3 simd_max(simd_uint3 x, simd_uint3 y) { - return simd_make_uint3(simd_max(simd_make_uint4_undef(x), simd_make_uint4_undef(y))); -} - -static inline SIMD_CFUNC simd_uint4 simd_max(simd_uint4 x, simd_uint4 y) { -#if defined __arm__ || defined __arm64__ - return vmaxq_u32(x, y); -#elif defined __SSE4_1__ - return _mm_max_epu32(x, y); -#else - return simd_bitselect(x, y, x < y); -#endif -} - -static inline SIMD_CFUNC simd_uint8 simd_max(simd_uint8 x, simd_uint8 y) { -#if defined __AVX2__ - return _mm256_max_epu32(x, y); -#else - return simd_bitselect(x, y, x < y); -#endif -} - -static inline SIMD_CFUNC simd_uint16 simd_max(simd_uint16 x, simd_uint16 y) { -#if defined __AVX512F__ - return _mm512_max_epu32(x, y); -#else - return simd_bitselect(x, y, x < y); -#endif -} - -static inline SIMD_CFUNC float simd_max(float x, float y) { - return __tg_fmax(x,y); -} - -static inline SIMD_CFUNC simd_float2 simd_max(simd_float2 x, simd_float2 y) { - return __tg_fmax(x,y); -} - -static inline SIMD_CFUNC simd_float3 simd_max(simd_float3 x, simd_float3 y) { - return __tg_fmax(x,y); -} - -static inline SIMD_CFUNC simd_float4 simd_max(simd_float4 x, simd_float4 y) { - return __tg_fmax(x,y); -} - -static inline SIMD_CFUNC simd_float8 simd_max(simd_float8 x, simd_float8 y) { - return __tg_fmax(x,y); -} - -static inline SIMD_CFUNC simd_float16 simd_max(simd_float16 x, simd_float16 y) { - return __tg_fmax(x,y); -} - -static inline SIMD_CFUNC simd_long2 simd_max(simd_long2 x, simd_long2 y) { -#if defined __AVX512VL__ - return _mm_max_epi64(x, y); -#else - return simd_bitselect(x, y, x < y); -#endif -} - -static inline SIMD_CFUNC simd_long3 simd_max(simd_long3 x, simd_long3 y) { - return simd_make_long3(simd_max(simd_make_long4_undef(x), simd_make_long4_undef(y))); -} - -static inline SIMD_CFUNC simd_long4 simd_max(simd_long4 x, simd_long4 y) { -#if defined __AVX512VL__ - return _mm256_max_epi64(x, y); -#else - return simd_bitselect(x, y, x < y); -#endif -} - -static inline SIMD_CFUNC simd_long8 simd_max(simd_long8 x, simd_long8 y) { -#if defined __AVX512F__ - return _mm512_max_epi64(x, y); -#else - return simd_bitselect(x, y, x < y); -#endif -} - -static inline SIMD_CFUNC simd_ulong2 simd_max(simd_ulong2 x, simd_ulong2 y) { -#if defined __AVX512VL__ - return _mm_max_epu64(x, y); -#else - return simd_bitselect(x, y, x < y); -#endif -} - -static inline SIMD_CFUNC simd_ulong3 simd_max(simd_ulong3 x, simd_ulong3 y) { - return simd_make_ulong3(simd_max(simd_make_ulong4_undef(x), simd_make_ulong4_undef(y))); -} - -static inline SIMD_CFUNC simd_ulong4 simd_max(simd_ulong4 x, simd_ulong4 y) { -#if defined __AVX512VL__ - return _mm256_max_epu64(x, y); -#else - return simd_bitselect(x, y, x < y); -#endif -} - -static inline SIMD_CFUNC simd_ulong8 simd_max(simd_ulong8 x, simd_ulong8 y) { -#if defined __AVX512F__ - return _mm512_max_epu64(x, y); -#else - return simd_bitselect(x, y, x < y); -#endif -} - -static inline SIMD_CFUNC double simd_max(double x, double y) { - return __tg_fmax(x,y); -} - -static inline SIMD_CFUNC simd_double2 simd_max(simd_double2 x, simd_double2 y) { - return __tg_fmax(x,y); -} - -static inline SIMD_CFUNC simd_double3 simd_max(simd_double3 x, simd_double3 y) { - return __tg_fmax(x,y); -} - -static inline SIMD_CFUNC simd_double4 simd_max(simd_double4 x, simd_double4 y) { - return __tg_fmax(x,y); -} - -static inline SIMD_CFUNC simd_double8 simd_max(simd_double8 x, simd_double8 y) { - return __tg_fmax(x,y); -} - -static inline SIMD_CFUNC simd_char2 simd_clamp(simd_char2 x, simd_char2 min, simd_char2 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_char3 simd_clamp(simd_char3 x, simd_char3 min, simd_char3 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_char4 simd_clamp(simd_char4 x, simd_char4 min, simd_char4 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_char8 simd_clamp(simd_char8 x, simd_char8 min, simd_char8 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_char16 simd_clamp(simd_char16 x, simd_char16 min, simd_char16 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_char32 simd_clamp(simd_char32 x, simd_char32 min, simd_char32 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_char64 simd_clamp(simd_char64 x, simd_char64 min, simd_char64 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_uchar2 simd_clamp(simd_uchar2 x, simd_uchar2 min, simd_uchar2 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_uchar3 simd_clamp(simd_uchar3 x, simd_uchar3 min, simd_uchar3 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_uchar4 simd_clamp(simd_uchar4 x, simd_uchar4 min, simd_uchar4 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_uchar8 simd_clamp(simd_uchar8 x, simd_uchar8 min, simd_uchar8 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_uchar16 simd_clamp(simd_uchar16 x, simd_uchar16 min, simd_uchar16 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_uchar32 simd_clamp(simd_uchar32 x, simd_uchar32 min, simd_uchar32 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_uchar64 simd_clamp(simd_uchar64 x, simd_uchar64 min, simd_uchar64 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_short2 simd_clamp(simd_short2 x, simd_short2 min, simd_short2 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_short3 simd_clamp(simd_short3 x, simd_short3 min, simd_short3 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_short4 simd_clamp(simd_short4 x, simd_short4 min, simd_short4 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_short8 simd_clamp(simd_short8 x, simd_short8 min, simd_short8 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_short16 simd_clamp(simd_short16 x, simd_short16 min, simd_short16 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_short32 simd_clamp(simd_short32 x, simd_short32 min, simd_short32 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_ushort2 simd_clamp(simd_ushort2 x, simd_ushort2 min, simd_ushort2 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_ushort3 simd_clamp(simd_ushort3 x, simd_ushort3 min, simd_ushort3 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_ushort4 simd_clamp(simd_ushort4 x, simd_ushort4 min, simd_ushort4 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_ushort8 simd_clamp(simd_ushort8 x, simd_ushort8 min, simd_ushort8 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_ushort16 simd_clamp(simd_ushort16 x, simd_ushort16 min, simd_ushort16 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_ushort32 simd_clamp(simd_ushort32 x, simd_ushort32 min, simd_ushort32 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_int2 simd_clamp(simd_int2 x, simd_int2 min, simd_int2 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_int3 simd_clamp(simd_int3 x, simd_int3 min, simd_int3 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_int4 simd_clamp(simd_int4 x, simd_int4 min, simd_int4 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_int8 simd_clamp(simd_int8 x, simd_int8 min, simd_int8 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_int16 simd_clamp(simd_int16 x, simd_int16 min, simd_int16 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_uint2 simd_clamp(simd_uint2 x, simd_uint2 min, simd_uint2 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_uint3 simd_clamp(simd_uint3 x, simd_uint3 min, simd_uint3 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_uint4 simd_clamp(simd_uint4 x, simd_uint4 min, simd_uint4 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_uint8 simd_clamp(simd_uint8 x, simd_uint8 min, simd_uint8 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_uint16 simd_clamp(simd_uint16 x, simd_uint16 min, simd_uint16 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC float simd_clamp(float x, float min, float max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_float2 simd_clamp(simd_float2 x, simd_float2 min, simd_float2 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_float3 simd_clamp(simd_float3 x, simd_float3 min, simd_float3 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_float4 simd_clamp(simd_float4 x, simd_float4 min, simd_float4 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_float8 simd_clamp(simd_float8 x, simd_float8 min, simd_float8 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_float16 simd_clamp(simd_float16 x, simd_float16 min, simd_float16 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_long2 simd_clamp(simd_long2 x, simd_long2 min, simd_long2 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_long3 simd_clamp(simd_long3 x, simd_long3 min, simd_long3 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_long4 simd_clamp(simd_long4 x, simd_long4 min, simd_long4 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_long8 simd_clamp(simd_long8 x, simd_long8 min, simd_long8 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_ulong2 simd_clamp(simd_ulong2 x, simd_ulong2 min, simd_ulong2 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_ulong3 simd_clamp(simd_ulong3 x, simd_ulong3 min, simd_ulong3 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_ulong4 simd_clamp(simd_ulong4 x, simd_ulong4 min, simd_ulong4 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_ulong8 simd_clamp(simd_ulong8 x, simd_ulong8 min, simd_ulong8 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC double simd_clamp(double x, double min, double max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_double2 simd_clamp(simd_double2 x, simd_double2 min, simd_double2 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_double3 simd_clamp(simd_double3 x, simd_double3 min, simd_double3 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_double4 simd_clamp(simd_double4 x, simd_double4 min, simd_double4 max) { - return simd_min(simd_max(x, min), max); -} - -static inline SIMD_CFUNC simd_double8 simd_clamp(simd_double8 x, simd_double8 min, simd_double8 max) { - return simd_min(simd_max(x, min), max); -} - - -static inline SIMD_CFUNC float simd_sign(float x) { - return x == 0 | x != x ? 0 : copysign(1,x); -} - -static inline SIMD_CFUNC simd_float2 simd_sign(simd_float2 x) { - return simd_bitselect(__tg_copysign(1,x), 0, x == 0 | x != x); -} - -static inline SIMD_CFUNC simd_float3 simd_sign(simd_float3 x) { - return simd_bitselect(__tg_copysign(1,x), 0, x == 0 | x != x); -} - -static inline SIMD_CFUNC simd_float4 simd_sign(simd_float4 x) { - return simd_bitselect(__tg_copysign(1,x), 0, x == 0 | x != x); -} - -static inline SIMD_CFUNC simd_float8 simd_sign(simd_float8 x) { - return simd_bitselect(__tg_copysign(1,x), 0, x == 0 | x != x); -} - -static inline SIMD_CFUNC simd_float16 simd_sign(simd_float16 x) { - return simd_bitselect(__tg_copysign(1,x), 0, x == 0 | x != x); -} - -static inline SIMD_CFUNC double simd_sign(double x) { - return x == 0 | x != x ? 0 : copysign(1,x); -} - -static inline SIMD_CFUNC simd_double2 simd_sign(simd_double2 x) { - return simd_bitselect(__tg_copysign(1,x), 0, x == 0 | x != x); -} - -static inline SIMD_CFUNC simd_double3 simd_sign(simd_double3 x) { - return simd_bitselect(__tg_copysign(1,x), 0, x == 0 | x != x); -} - -static inline SIMD_CFUNC simd_double4 simd_sign(simd_double4 x) { - return simd_bitselect(__tg_copysign(1,x), 0, x == 0 | x != x); -} - -static inline SIMD_CFUNC simd_double8 simd_sign(simd_double8 x) { - return simd_bitselect(__tg_copysign(1,x), 0, x == 0 | x != x); -} - -static inline SIMD_CFUNC float simd_mix(float x, float y, float t) { - return x + t*(y - x); -} - -static inline SIMD_CFUNC simd_float2 simd_mix(simd_float2 x, simd_float2 y, simd_float2 t) { - return x + t*(y - x); -} - -static inline SIMD_CFUNC simd_float3 simd_mix(simd_float3 x, simd_float3 y, simd_float3 t) { - return x + t*(y - x); -} - -static inline SIMD_CFUNC simd_float4 simd_mix(simd_float4 x, simd_float4 y, simd_float4 t) { - return x + t*(y - x); -} - -static inline SIMD_CFUNC simd_float8 simd_mix(simd_float8 x, simd_float8 y, simd_float8 t) { - return x + t*(y - x); -} - -static inline SIMD_CFUNC simd_float16 simd_mix(simd_float16 x, simd_float16 y, simd_float16 t) { - return x + t*(y - x); -} - -static inline SIMD_CFUNC double simd_mix(double x, double y, double t) { - return x + t*(y - x); -} - -static inline SIMD_CFUNC simd_double2 simd_mix(simd_double2 x, simd_double2 y, simd_double2 t) { - return x + t*(y - x); -} - -static inline SIMD_CFUNC simd_double3 simd_mix(simd_double3 x, simd_double3 y, simd_double3 t) { - return x + t*(y - x); -} - -static inline SIMD_CFUNC simd_double4 simd_mix(simd_double4 x, simd_double4 y, simd_double4 t) { - return x + t*(y - x); -} - -static inline SIMD_CFUNC simd_double8 simd_mix(simd_double8 x, simd_double8 y, simd_double8 t) { - return x + t*(y - x); -} - -static inline SIMD_CFUNC float simd_recip(float x) { -#if __FAST_MATH__ - return simd_fast_recip(x); -#else - return simd_precise_recip(x); -#endif -} - -static inline SIMD_CFUNC simd_float2 simd_recip(simd_float2 x) { -#if __FAST_MATH__ - return simd_fast_recip(x); -#else - return simd_precise_recip(x); -#endif -} - -static inline SIMD_CFUNC simd_float3 simd_recip(simd_float3 x) { -#if __FAST_MATH__ - return simd_fast_recip(x); -#else - return simd_precise_recip(x); -#endif -} - -static inline SIMD_CFUNC simd_float4 simd_recip(simd_float4 x) { -#if __FAST_MATH__ - return simd_fast_recip(x); -#else - return simd_precise_recip(x); -#endif -} - -static inline SIMD_CFUNC simd_float8 simd_recip(simd_float8 x) { -#if __FAST_MATH__ - return simd_fast_recip(x); -#else - return simd_precise_recip(x); -#endif -} - -static inline SIMD_CFUNC simd_float16 simd_recip(simd_float16 x) { -#if __FAST_MATH__ - return simd_fast_recip(x); -#else - return simd_precise_recip(x); -#endif -} - -static inline SIMD_CFUNC double simd_recip(double x) { -#if __FAST_MATH__ - return simd_fast_recip(x); -#else - return simd_precise_recip(x); -#endif -} - -static inline SIMD_CFUNC simd_double2 simd_recip(simd_double2 x) { -#if __FAST_MATH__ - return simd_fast_recip(x); -#else - return simd_precise_recip(x); -#endif -} - -static inline SIMD_CFUNC simd_double3 simd_recip(simd_double3 x) { -#if __FAST_MATH__ - return simd_fast_recip(x); -#else - return simd_precise_recip(x); -#endif -} - -static inline SIMD_CFUNC simd_double4 simd_recip(simd_double4 x) { -#if __FAST_MATH__ - return simd_fast_recip(x); -#else - return simd_precise_recip(x); -#endif -} - -static inline SIMD_CFUNC simd_double8 simd_recip(simd_double8 x) { -#if __FAST_MATH__ - return simd_fast_recip(x); -#else - return simd_precise_recip(x); -#endif -} - -static inline SIMD_CFUNC float simd_fast_recip(float x) { -#if defined __AVX512VL__ - simd_float4 x4 = simd_make_float4(x); - return ((simd_float4)_mm_rcp14_ss(x4, x4)).x; -#elif defined __SSE__ - return ((simd_float4)_mm_rcp_ss(simd_make_float4(x))).x; -#elif defined __ARM_NEON__ - return simd_fast_recip(simd_make_float2_undef(x)).x; -#else - return simd_precise_recip(x); -#endif -} - -static inline SIMD_CFUNC simd_float2 simd_fast_recip(simd_float2 x) { -#if defined __SSE__ - return simd_make_float2(simd_fast_recip(simd_make_float4_undef(x))); -#elif defined __ARM_NEON__ - simd_float2 r = vrecpe_f32(x); - return r * vrecps_f32(x, r); -#else - return simd_precise_recip(x); -#endif -} - -static inline SIMD_CFUNC simd_float3 simd_fast_recip(simd_float3 x) { - return simd_make_float3(simd_fast_recip(simd_make_float4_undef(x))); -} - -static inline SIMD_CFUNC simd_float4 simd_fast_recip(simd_float4 x) { -#if defined __AVX512VL__ - return _mm_rcp14_ps(x); -#elif defined __SSE__ - return _mm_rcp_ps(x); -#elif defined __ARM_NEON__ - simd_float4 r = vrecpeq_f32(x); - return r * vrecpsq_f32(x, r); -#else - return simd_precise_recip(x); -#endif -} - -static inline SIMD_CFUNC simd_float8 simd_fast_recip(simd_float8 x) { -#if defined __AVX512VL__ - return _mm256_rcp14_ps(x); -#elif defined __AVX__ - return _mm256_rcp_ps(x); -#else - return simd_make_float8(simd_fast_recip(x.lo), simd_fast_recip(x.hi)); -#endif -} - -static inline SIMD_CFUNC simd_float16 simd_fast_recip(simd_float16 x) { -#if defined __AVX512F__ - return _mm512_rcp14_ps(x); -#else - return simd_make_float16(simd_fast_recip(x.lo), simd_fast_recip(x.hi)); -#endif -} - -static inline SIMD_CFUNC double simd_fast_recip(double x) { - return simd_precise_recip(x); -} - -static inline SIMD_CFUNC simd_double2 simd_fast_recip(simd_double2 x) { - return simd_precise_recip(x); -} - -static inline SIMD_CFUNC simd_double3 simd_fast_recip(simd_double3 x) { - return simd_precise_recip(x); -} - -static inline SIMD_CFUNC simd_double4 simd_fast_recip(simd_double4 x) { - return simd_precise_recip(x); -} - -static inline SIMD_CFUNC simd_double8 simd_fast_recip(simd_double8 x) { - return simd_precise_recip(x); -} - -static inline SIMD_CFUNC float simd_precise_recip(float x) { -#if defined __SSE__ - float r = simd_fast_recip(x); - return r*(2 - (x == 0 ? -INFINITY : x)*r); -#elif defined __ARM_NEON__ - return simd_precise_recip(simd_make_float2_undef(x)).x; -#else - return 1/x; -#endif -} - -static inline SIMD_CFUNC simd_float2 simd_precise_recip(simd_float2 x) { -#if defined __SSE__ - return simd_make_float2(simd_precise_recip(simd_make_float4_undef(x))); -#elif defined __ARM_NEON__ - simd_float2 r = simd_fast_recip(x); - return r*vrecps_f32(x, r); -#else - return 1/x; -#endif -} - -static inline SIMD_CFUNC simd_float3 simd_precise_recip(simd_float3 x) { - return simd_make_float3(simd_precise_recip(simd_make_float4_undef(x))); -} - -static inline SIMD_CFUNC simd_float4 simd_precise_recip(simd_float4 x) { -#if defined __SSE__ - simd_float4 r = simd_fast_recip(x); - return r*(2 - simd_bitselect(x, -INFINITY, x == 0)*r); -#elif defined __ARM_NEON__ - simd_float4 r = simd_fast_recip(x); - return r*vrecpsq_f32(x, r); -#else - return 1/x; -#endif -} - -static inline SIMD_CFUNC simd_float8 simd_precise_recip(simd_float8 x) { -#if defined __AVX__ - simd_float8 r = simd_fast_recip(x); - return r*(2 - simd_bitselect(x, -INFINITY, x == 0)*r); -#else - return simd_make_float8(simd_precise_recip(x.lo), simd_precise_recip(x.hi)); -#endif -} - -static inline SIMD_CFUNC simd_float16 simd_precise_recip(simd_float16 x) { -#if defined __AVX512F__ - simd_float16 r = simd_fast_recip(x); - return r*(2 - simd_bitselect(x, -INFINITY, x == 0)*r); -#else - return simd_make_float16(simd_precise_recip(x.lo), simd_precise_recip(x.hi)); -#endif -} - -static inline SIMD_CFUNC double simd_precise_recip(double x) { - return 1/x; -} - -static inline SIMD_CFUNC simd_double2 simd_precise_recip(simd_double2 x) { - return 1/x; -} - -static inline SIMD_CFUNC simd_double3 simd_precise_recip(simd_double3 x) { - return 1/x; -} - -static inline SIMD_CFUNC simd_double4 simd_precise_recip(simd_double4 x) { - return 1/x; -} - -static inline SIMD_CFUNC simd_double8 simd_precise_recip(simd_double8 x) { - return 1/x; -} - -static inline SIMD_CFUNC float simd_rsqrt(float x) { -#if __FAST_MATH__ - return simd_fast_rsqrt(x); -#else - return simd_precise_rsqrt(x); -#endif -} - -static inline SIMD_CFUNC simd_float2 simd_rsqrt(simd_float2 x) { -#if __FAST_MATH__ - return simd_fast_rsqrt(x); -#else - return simd_precise_rsqrt(x); -#endif -} - -static inline SIMD_CFUNC simd_float3 simd_rsqrt(simd_float3 x) { -#if __FAST_MATH__ - return simd_fast_rsqrt(x); -#else - return simd_precise_rsqrt(x); -#endif -} - -static inline SIMD_CFUNC simd_float4 simd_rsqrt(simd_float4 x) { -#if __FAST_MATH__ - return simd_fast_rsqrt(x); -#else - return simd_precise_rsqrt(x); -#endif -} - -static inline SIMD_CFUNC simd_float8 simd_rsqrt(simd_float8 x) { -#if __FAST_MATH__ - return simd_fast_rsqrt(x); -#else - return simd_precise_rsqrt(x); -#endif -} - -static inline SIMD_CFUNC simd_float16 simd_rsqrt(simd_float16 x) { -#if __FAST_MATH__ - return simd_fast_rsqrt(x); -#else - return simd_precise_rsqrt(x); -#endif -} - -static inline SIMD_CFUNC double simd_rsqrt(double x) { -#if __FAST_MATH__ - return simd_fast_rsqrt(x); -#else - return simd_precise_rsqrt(x); -#endif -} - -static inline SIMD_CFUNC simd_double2 simd_rsqrt(simd_double2 x) { -#if __FAST_MATH__ - return simd_fast_rsqrt(x); -#else - return simd_precise_rsqrt(x); -#endif -} - -static inline SIMD_CFUNC simd_double3 simd_rsqrt(simd_double3 x) { -#if __FAST_MATH__ - return simd_fast_rsqrt(x); -#else - return simd_precise_rsqrt(x); -#endif -} - -static inline SIMD_CFUNC simd_double4 simd_rsqrt(simd_double4 x) { -#if __FAST_MATH__ - return simd_fast_rsqrt(x); -#else - return simd_precise_rsqrt(x); -#endif -} - -static inline SIMD_CFUNC simd_double8 simd_rsqrt(simd_double8 x) { -#if __FAST_MATH__ - return simd_fast_rsqrt(x); -#else - return simd_precise_rsqrt(x); -#endif -} - -static inline SIMD_CFUNC float simd_fast_rsqrt(float x) { -#if defined __AVX512VL__ - simd_float4 x4 = simd_make_float4(x); - return ((simd_float4)_mm_rsqrt14_ss(x4, x4)).x; -#elif defined __SSE__ - return ((simd_float4)_mm_rsqrt_ss(simd_make_float4(x))).x; -#elif defined __ARM_NEON__ - return simd_fast_rsqrt(simd_make_float2_undef(x)).x; -#else - return simd_precise_rsqrt(x); -#endif -} - -static inline SIMD_CFUNC simd_float2 simd_fast_rsqrt(simd_float2 x) { -#if defined __SSE__ - return simd_make_float2(simd_fast_rsqrt(simd_make_float4_undef(x))); -#elif defined __ARM_NEON__ - simd_float2 r = vrsqrte_f32(x); - return r * vrsqrts_f32(x, r*r); -#else - return simd_precise_rsqrt(x); -#endif -} - -static inline SIMD_CFUNC simd_float3 simd_fast_rsqrt(simd_float3 x) { - return simd_make_float3(simd_fast_rsqrt(simd_make_float4_undef(x))); -} - -static inline SIMD_CFUNC simd_float4 simd_fast_rsqrt(simd_float4 x) { -#if defined __AVX512VL__ - return _mm_rsqrt14_ps(x); -#elif defined __SSE__ - return _mm_rsqrt_ps(x); -#elif defined __ARM_NEON__ - simd_float4 r = vrsqrteq_f32(x); - return r * vrsqrtsq_f32(x, r*r); -#else - return simd_precise_rsqrt(x); -#endif -} - -static inline SIMD_CFUNC simd_float8 simd_fast_rsqrt(simd_float8 x) { -#if defined __AVX512VL__ - return _mm256_rsqrt14_ps(x); -#elif defined __AVX__ - return _mm256_rsqrt_ps(x); -#else - return simd_make_float8(simd_fast_rsqrt(x.lo), simd_fast_rsqrt(x.hi)); -#endif -} - -static inline SIMD_CFUNC simd_float16 simd_fast_rsqrt(simd_float16 x) { -#if defined __AVX512F__ - return _mm512_rsqrt14_ps(x); -#else - return simd_make_float16(simd_fast_rsqrt(x.lo), simd_fast_rsqrt(x.hi)); -#endif -} - -static inline SIMD_CFUNC double simd_fast_rsqrt(double x) { - return simd_precise_rsqrt(x); -} - -static inline SIMD_CFUNC simd_double2 simd_fast_rsqrt(simd_double2 x) { - return simd_precise_rsqrt(x); -} - -static inline SIMD_CFUNC simd_double3 simd_fast_rsqrt(simd_double3 x) { - return simd_precise_rsqrt(x); -} - -static inline SIMD_CFUNC simd_double4 simd_fast_rsqrt(simd_double4 x) { - return simd_precise_rsqrt(x); -} - -static inline SIMD_CFUNC simd_double8 simd_fast_rsqrt(simd_double8 x) { - return simd_precise_rsqrt(x); -} - -static inline SIMD_CFUNC float simd_precise_rsqrt(float x) { -#if defined __SSE__ - float r = simd_fast_rsqrt(x); - return r*(1.5f - 0.5f*(r == INFINITY ? -INFINITY : x)*r*r); -#elif defined __ARM_NEON__ - return simd_precise_rsqrt(simd_make_float2_undef(x)).x; -#else - return 1/sqrt(x); -#endif -} - -static inline SIMD_CFUNC simd_float2 simd_precise_rsqrt(simd_float2 x) { -#if defined __SSE__ - return simd_make_float2(simd_precise_rsqrt(simd_make_float4_undef(x))); -#elif defined __ARM_NEON__ - simd_float2 r = simd_fast_rsqrt(x); - return r*vrsqrts_f32(x, r*r); -#else - return 1/__tg_sqrt(x); -#endif -} - -static inline SIMD_CFUNC simd_float3 simd_precise_rsqrt(simd_float3 x) { - return simd_make_float3(simd_precise_rsqrt(simd_make_float4_undef(x))); -} - -static inline SIMD_CFUNC simd_float4 simd_precise_rsqrt(simd_float4 x) { -#if defined __SSE__ - simd_float4 r = simd_fast_rsqrt(x); - return r*(1.5 - 0.5*simd_bitselect(x, -INFINITY, r == INFINITY)*r*r); -#elif defined __ARM_NEON__ - simd_float4 r = simd_fast_rsqrt(x); - return r*vrsqrtsq_f32(x, r*r); -#else - return 1/__tg_sqrt(x); -#endif -} - -static inline SIMD_CFUNC simd_float8 simd_precise_rsqrt(simd_float8 x) { -#if defined __AVX__ - simd_float8 r = simd_fast_rsqrt(x); - return r*(1.5 - 0.5*simd_bitselect(x, -INFINITY, r == INFINITY)*r*r); -#else - return simd_make_float8(simd_precise_rsqrt(x.lo), simd_precise_rsqrt(x.hi)); -#endif -} - -static inline SIMD_CFUNC simd_float16 simd_precise_rsqrt(simd_float16 x) { -#if defined __AVX512F__ - simd_float16 r = simd_fast_rsqrt(x); - return r*(1.5 - 0.5*simd_bitselect(x, -INFINITY, r == INFINITY)*r*r); -#else - return simd_make_float16(simd_precise_rsqrt(x.lo), simd_precise_rsqrt(x.hi)); -#endif -} - -static inline SIMD_CFUNC double simd_precise_rsqrt(double x) { - return 1/sqrt(x); -} - -static inline SIMD_CFUNC simd_double2 simd_precise_rsqrt(simd_double2 x) { - return 1/__tg_sqrt(x); -} - -static inline SIMD_CFUNC simd_double3 simd_precise_rsqrt(simd_double3 x) { - return 1/__tg_sqrt(x); -} - -static inline SIMD_CFUNC simd_double4 simd_precise_rsqrt(simd_double4 x) { - return 1/__tg_sqrt(x); -} - -static inline SIMD_CFUNC simd_double8 simd_precise_rsqrt(simd_double8 x) { - return 1/__tg_sqrt(x); -} - -static inline SIMD_CFUNC float simd_fract(float x) { - return fmin(x - floor(x), 0x1.fffffep-1f); -} - -static inline SIMD_CFUNC simd_float2 simd_fract(simd_float2 x) { - return __tg_fmin(x - __tg_floor(x), 0x1.fffffep-1f); -} - -static inline SIMD_CFUNC simd_float3 simd_fract(simd_float3 x) { - return __tg_fmin(x - __tg_floor(x), 0x1.fffffep-1f); -} - -static inline SIMD_CFUNC simd_float4 simd_fract(simd_float4 x) { - return __tg_fmin(x - __tg_floor(x), 0x1.fffffep-1f); -} - -static inline SIMD_CFUNC simd_float8 simd_fract(simd_float8 x) { - return __tg_fmin(x - __tg_floor(x), 0x1.fffffep-1f); -} - -static inline SIMD_CFUNC simd_float16 simd_fract(simd_float16 x) { - return __tg_fmin(x - __tg_floor(x), 0x1.fffffep-1f); -} - -static inline SIMD_CFUNC double simd_fract(double x) { - return fmin(x - floor(x), 0x1.fffffffffffffp-1); -} - -static inline SIMD_CFUNC simd_double2 simd_fract(simd_double2 x) { - return __tg_fmin(x - __tg_floor(x), 0x1.fffffffffffffp-1); -} - -static inline SIMD_CFUNC simd_double3 simd_fract(simd_double3 x) { - return __tg_fmin(x - __tg_floor(x), 0x1.fffffffffffffp-1); -} - -static inline SIMD_CFUNC simd_double4 simd_fract(simd_double4 x) { - return __tg_fmin(x - __tg_floor(x), 0x1.fffffffffffffp-1); -} - -static inline SIMD_CFUNC simd_double8 simd_fract(simd_double8 x) { - return __tg_fmin(x - __tg_floor(x), 0x1.fffffffffffffp-1); -} - -static inline SIMD_CFUNC float simd_step(float edge, float x) { - return !(x < edge); -} - -static inline SIMD_CFUNC simd_float2 simd_step(simd_float2 edge, simd_float2 x) { - return simd_bitselect((simd_float2)1, 0, x < edge); -} - -static inline SIMD_CFUNC simd_float3 simd_step(simd_float3 edge, simd_float3 x) { - return simd_bitselect((simd_float3)1, 0, x < edge); -} - -static inline SIMD_CFUNC simd_float4 simd_step(simd_float4 edge, simd_float4 x) { - return simd_bitselect((simd_float4)1, 0, x < edge); -} - -static inline SIMD_CFUNC simd_float8 simd_step(simd_float8 edge, simd_float8 x) { - return simd_bitselect((simd_float8)1, 0, x < edge); -} - -static inline SIMD_CFUNC simd_float16 simd_step(simd_float16 edge, simd_float16 x) { - return simd_bitselect((simd_float16)1, 0, x < edge); -} - -static inline SIMD_CFUNC double simd_step(double edge, double x) { - return !(x < edge); -} - -static inline SIMD_CFUNC simd_double2 simd_step(simd_double2 edge, simd_double2 x) { - return simd_bitselect((simd_double2)1, 0, x < edge); -} - -static inline SIMD_CFUNC simd_double3 simd_step(simd_double3 edge, simd_double3 x) { - return simd_bitselect((simd_double3)1, 0, x < edge); -} - -static inline SIMD_CFUNC simd_double4 simd_step(simd_double4 edge, simd_double4 x) { - return simd_bitselect((simd_double4)1, 0, x < edge); -} - -static inline SIMD_CFUNC simd_double8 simd_step(simd_double8 edge, simd_double8 x) { - return simd_bitselect((simd_double8)1, 0, x < edge); -} - -static inline SIMD_CFUNC float simd_smoothstep(float edge0, float edge1, float x) { - float t = simd_clamp((x - edge0)/(edge1 - edge0), 0, 1); - return t*t*(3 - 2*t); -} - -static inline SIMD_CFUNC simd_float2 simd_smoothstep(simd_float2 edge0, simd_float2 edge1, simd_float2 x) { - simd_float2 t = simd_clamp((x - edge0)/(edge1 - edge0), 0, 1); - return t*t*(3 - 2*t); -} - -static inline SIMD_CFUNC simd_float3 simd_smoothstep(simd_float3 edge0, simd_float3 edge1, simd_float3 x) { - simd_float3 t = simd_clamp((x - edge0)/(edge1 - edge0), 0, 1); - return t*t*(3 - 2*t); -} - -static inline SIMD_CFUNC simd_float4 simd_smoothstep(simd_float4 edge0, simd_float4 edge1, simd_float4 x) { - simd_float4 t = simd_clamp((x - edge0)/(edge1 - edge0), 0, 1); - return t*t*(3 - 2*t); -} - -static inline SIMD_CFUNC simd_float8 simd_smoothstep(simd_float8 edge0, simd_float8 edge1, simd_float8 x) { - simd_float8 t = simd_clamp((x - edge0)/(edge1 - edge0), 0, 1); - return t*t*(3 - 2*t); -} - -static inline SIMD_CFUNC simd_float16 simd_smoothstep(simd_float16 edge0, simd_float16 edge1, simd_float16 x) { - simd_float16 t = simd_clamp((x - edge0)/(edge1 - edge0), 0, 1); - return t*t*(3 - 2*t); -} - -static inline SIMD_CFUNC double simd_smoothstep(double edge0, double edge1, double x) { - double t = simd_clamp((x - edge0)/(edge1 - edge0), 0, 1); - return t*t*(3 - 2*t); -} - -static inline SIMD_CFUNC simd_double2 simd_smoothstep(simd_double2 edge0, simd_double2 edge1, simd_double2 x) { - simd_double2 t = simd_clamp((x - edge0)/(edge1 - edge0), 0, 1); - return t*t*(3 - 2*t); -} - -static inline SIMD_CFUNC simd_double3 simd_smoothstep(simd_double3 edge0, simd_double3 edge1, simd_double3 x) { - simd_double3 t = simd_clamp((x - edge0)/(edge1 - edge0), 0, 1); - return t*t*(3 - 2*t); -} - -static inline SIMD_CFUNC simd_double4 simd_smoothstep(simd_double4 edge0, simd_double4 edge1, simd_double4 x) { - simd_double4 t = simd_clamp((x - edge0)/(edge1 - edge0), 0, 1); - return t*t*(3 - 2*t); -} - -static inline SIMD_CFUNC simd_double8 simd_smoothstep(simd_double8 edge0, simd_double8 edge1, simd_double8 x) { - simd_double8 t = simd_clamp((x - edge0)/(edge1 - edge0), 0, 1); - return t*t*(3 - 2*t); -} - -static inline SIMD_CFUNC char simd_reduce_add(simd_char2 x) { - return x.x + x.y; -} - -static inline SIMD_CFUNC char simd_reduce_add(simd_char3 x) { - return x.x + x.y + x.z; -} - -static inline SIMD_CFUNC char simd_reduce_add(simd_char4 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC char simd_reduce_add(simd_char8 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC char simd_reduce_add(simd_char16 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC char simd_reduce_add(simd_char32 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC char simd_reduce_add(simd_char64 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC unsigned char simd_reduce_add(simd_uchar2 x) { - return x.x + x.y; -} - -static inline SIMD_CFUNC unsigned char simd_reduce_add(simd_uchar3 x) { - return x.x + x.y + x.z; -} - -static inline SIMD_CFUNC unsigned char simd_reduce_add(simd_uchar4 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC unsigned char simd_reduce_add(simd_uchar8 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC unsigned char simd_reduce_add(simd_uchar16 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC unsigned char simd_reduce_add(simd_uchar32 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC unsigned char simd_reduce_add(simd_uchar64 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC short simd_reduce_add(simd_short2 x) { - return x.x + x.y; -} - -static inline SIMD_CFUNC short simd_reduce_add(simd_short3 x) { - return x.x + x.y + x.z; -} - -static inline SIMD_CFUNC short simd_reduce_add(simd_short4 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC short simd_reduce_add(simd_short8 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC short simd_reduce_add(simd_short16 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC short simd_reduce_add(simd_short32 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC unsigned short simd_reduce_add(simd_ushort2 x) { - return x.x + x.y; -} - -static inline SIMD_CFUNC unsigned short simd_reduce_add(simd_ushort3 x) { - return x.x + x.y + x.z; -} - -static inline SIMD_CFUNC unsigned short simd_reduce_add(simd_ushort4 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC unsigned short simd_reduce_add(simd_ushort8 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC unsigned short simd_reduce_add(simd_ushort16 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC unsigned short simd_reduce_add(simd_ushort32 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC int simd_reduce_add(simd_int2 x) { - return x.x + x.y; -} - -static inline SIMD_CFUNC int simd_reduce_add(simd_int3 x) { - return x.x + x.y + x.z; -} - -static inline SIMD_CFUNC int simd_reduce_add(simd_int4 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC int simd_reduce_add(simd_int8 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC int simd_reduce_add(simd_int16 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC unsigned int simd_reduce_add(simd_uint2 x) { - return x.x + x.y; -} - -static inline SIMD_CFUNC unsigned int simd_reduce_add(simd_uint3 x) { - return x.x + x.y + x.z; -} - -static inline SIMD_CFUNC unsigned int simd_reduce_add(simd_uint4 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC unsigned int simd_reduce_add(simd_uint8 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC unsigned int simd_reduce_add(simd_uint16 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC float simd_reduce_add(simd_float2 x) { - return x.x + x.y; -} - -static inline SIMD_CFUNC float simd_reduce_add(simd_float3 x) { - return x.x + x.y + x.z; -} - -static inline SIMD_CFUNC float simd_reduce_add(simd_float4 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC float simd_reduce_add(simd_float8 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC float simd_reduce_add(simd_float16 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC simd_long1 simd_reduce_add(simd_long2 x) { - return x.x + x.y; -} - -static inline SIMD_CFUNC simd_long1 simd_reduce_add(simd_long3 x) { - return x.x + x.y + x.z; -} - -static inline SIMD_CFUNC simd_long1 simd_reduce_add(simd_long4 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC simd_long1 simd_reduce_add(simd_long8 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC simd_ulong1 simd_reduce_add(simd_ulong2 x) { - return x.x + x.y; -} - -static inline SIMD_CFUNC simd_ulong1 simd_reduce_add(simd_ulong3 x) { - return x.x + x.y + x.z; -} - -static inline SIMD_CFUNC simd_ulong1 simd_reduce_add(simd_ulong4 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC simd_ulong1 simd_reduce_add(simd_ulong8 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC double simd_reduce_add(simd_double2 x) { - return x.x + x.y; -} - -static inline SIMD_CFUNC double simd_reduce_add(simd_double3 x) { - return x.x + x.y + x.z; -} - -static inline SIMD_CFUNC double simd_reduce_add(simd_double4 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC double simd_reduce_add(simd_double8 x) { - return simd_reduce_add(x.lo + x.hi); -} - -static inline SIMD_CFUNC char simd_reduce_min(simd_char2 x) { - return x.y < x.x ? x.y : x.x; -} - -static inline SIMD_CFUNC char simd_reduce_min(simd_char3 x) { - char t = x.z < x.x ? x.z : x.x; - return x.y < t ? x.y : t; -} - -static inline SIMD_CFUNC char simd_reduce_min(simd_char4 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC char simd_reduce_min(simd_char8 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC char simd_reduce_min(simd_char16 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC char simd_reduce_min(simd_char32 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC char simd_reduce_min(simd_char64 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC unsigned char simd_reduce_min(simd_uchar2 x) { - return x.y < x.x ? x.y : x.x; -} - -static inline SIMD_CFUNC unsigned char simd_reduce_min(simd_uchar3 x) { - unsigned char t = x.z < x.x ? x.z : x.x; - return x.y < t ? x.y : t; -} - -static inline SIMD_CFUNC unsigned char simd_reduce_min(simd_uchar4 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC unsigned char simd_reduce_min(simd_uchar8 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC unsigned char simd_reduce_min(simd_uchar16 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC unsigned char simd_reduce_min(simd_uchar32 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC unsigned char simd_reduce_min(simd_uchar64 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC short simd_reduce_min(simd_short2 x) { - return x.y < x.x ? x.y : x.x; -} - -static inline SIMD_CFUNC short simd_reduce_min(simd_short3 x) { - short t = x.z < x.x ? x.z : x.x; - return x.y < t ? x.y : t; -} - -static inline SIMD_CFUNC short simd_reduce_min(simd_short4 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC short simd_reduce_min(simd_short8 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC short simd_reduce_min(simd_short16 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC short simd_reduce_min(simd_short32 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC unsigned short simd_reduce_min(simd_ushort2 x) { - return x.y < x.x ? x.y : x.x; -} - -static inline SIMD_CFUNC unsigned short simd_reduce_min(simd_ushort3 x) { - unsigned short t = x.z < x.x ? x.z : x.x; - return x.y < t ? x.y : t; -} - -static inline SIMD_CFUNC unsigned short simd_reduce_min(simd_ushort4 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC unsigned short simd_reduce_min(simd_ushort8 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC unsigned short simd_reduce_min(simd_ushort16 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC unsigned short simd_reduce_min(simd_ushort32 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC int simd_reduce_min(simd_int2 x) { - return x.y < x.x ? x.y : x.x; -} - -static inline SIMD_CFUNC int simd_reduce_min(simd_int3 x) { - int t = x.z < x.x ? x.z : x.x; - return x.y < t ? x.y : t; -} - -static inline SIMD_CFUNC int simd_reduce_min(simd_int4 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC int simd_reduce_min(simd_int8 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC int simd_reduce_min(simd_int16 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC unsigned int simd_reduce_min(simd_uint2 x) { - return x.y < x.x ? x.y : x.x; -} - -static inline SIMD_CFUNC unsigned int simd_reduce_min(simd_uint3 x) { - unsigned int t = x.z < x.x ? x.z : x.x; - return x.y < t ? x.y : t; -} - -static inline SIMD_CFUNC unsigned int simd_reduce_min(simd_uint4 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC unsigned int simd_reduce_min(simd_uint8 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC unsigned int simd_reduce_min(simd_uint16 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC float simd_reduce_min(simd_float2 x) { - return fmin(x.x, x.y); -} - -static inline SIMD_CFUNC float simd_reduce_min(simd_float3 x) { - return fmin(fmin(x.x, x.z), x.y); -} - -static inline SIMD_CFUNC float simd_reduce_min(simd_float4 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC float simd_reduce_min(simd_float8 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC float simd_reduce_min(simd_float16 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC simd_long1 simd_reduce_min(simd_long2 x) { - return x.y < x.x ? x.y : x.x; -} - -static inline SIMD_CFUNC simd_long1 simd_reduce_min(simd_long3 x) { - simd_long1 t = x.z < x.x ? x.z : x.x; - return x.y < t ? x.y : t; -} - -static inline SIMD_CFUNC simd_long1 simd_reduce_min(simd_long4 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC simd_long1 simd_reduce_min(simd_long8 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC simd_ulong1 simd_reduce_min(simd_ulong2 x) { - return x.y < x.x ? x.y : x.x; -} - -static inline SIMD_CFUNC simd_ulong1 simd_reduce_min(simd_ulong3 x) { - simd_ulong1 t = x.z < x.x ? x.z : x.x; - return x.y < t ? x.y : t; -} - -static inline SIMD_CFUNC simd_ulong1 simd_reduce_min(simd_ulong4 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC simd_ulong1 simd_reduce_min(simd_ulong8 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC double simd_reduce_min(simd_double2 x) { - return fmin(x.x, x.y); -} - -static inline SIMD_CFUNC double simd_reduce_min(simd_double3 x) { - return fmin(fmin(x.x, x.z), x.y); -} - -static inline SIMD_CFUNC double simd_reduce_min(simd_double4 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC double simd_reduce_min(simd_double8 x) { - return simd_reduce_min(simd_min(x.lo, x.hi)); -} - -static inline SIMD_CFUNC char simd_reduce_max(simd_char2 x) { - return x.y > x.x ? x.y : x.x; -} - -static inline SIMD_CFUNC char simd_reduce_max(simd_char3 x) { - char t = x.z > x.x ? x.z : x.x; - return x.y > t ? x.y : t; -} - -static inline SIMD_CFUNC char simd_reduce_max(simd_char4 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC char simd_reduce_max(simd_char8 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC char simd_reduce_max(simd_char16 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC char simd_reduce_max(simd_char32 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC char simd_reduce_max(simd_char64 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC unsigned char simd_reduce_max(simd_uchar2 x) { - return x.y > x.x ? x.y : x.x; -} - -static inline SIMD_CFUNC unsigned char simd_reduce_max(simd_uchar3 x) { - unsigned char t = x.z > x.x ? x.z : x.x; - return x.y > t ? x.y : t; -} - -static inline SIMD_CFUNC unsigned char simd_reduce_max(simd_uchar4 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC unsigned char simd_reduce_max(simd_uchar8 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC unsigned char simd_reduce_max(simd_uchar16 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC unsigned char simd_reduce_max(simd_uchar32 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC unsigned char simd_reduce_max(simd_uchar64 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC short simd_reduce_max(simd_short2 x) { - return x.y > x.x ? x.y : x.x; -} - -static inline SIMD_CFUNC short simd_reduce_max(simd_short3 x) { - short t = x.z > x.x ? x.z : x.x; - return x.y > t ? x.y : t; -} - -static inline SIMD_CFUNC short simd_reduce_max(simd_short4 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC short simd_reduce_max(simd_short8 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC short simd_reduce_max(simd_short16 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC short simd_reduce_max(simd_short32 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC unsigned short simd_reduce_max(simd_ushort2 x) { - return x.y > x.x ? x.y : x.x; -} - -static inline SIMD_CFUNC unsigned short simd_reduce_max(simd_ushort3 x) { - unsigned short t = x.z > x.x ? x.z : x.x; - return x.y > t ? x.y : t; -} - -static inline SIMD_CFUNC unsigned short simd_reduce_max(simd_ushort4 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC unsigned short simd_reduce_max(simd_ushort8 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC unsigned short simd_reduce_max(simd_ushort16 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC unsigned short simd_reduce_max(simd_ushort32 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC int simd_reduce_max(simd_int2 x) { - return x.y > x.x ? x.y : x.x; -} - -static inline SIMD_CFUNC int simd_reduce_max(simd_int3 x) { - int t = x.z > x.x ? x.z : x.x; - return x.y > t ? x.y : t; -} - -static inline SIMD_CFUNC int simd_reduce_max(simd_int4 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC int simd_reduce_max(simd_int8 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC int simd_reduce_max(simd_int16 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC unsigned int simd_reduce_max(simd_uint2 x) { - return x.y > x.x ? x.y : x.x; -} - -static inline SIMD_CFUNC unsigned int simd_reduce_max(simd_uint3 x) { - unsigned int t = x.z > x.x ? x.z : x.x; - return x.y > t ? x.y : t; -} - -static inline SIMD_CFUNC unsigned int simd_reduce_max(simd_uint4 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC unsigned int simd_reduce_max(simd_uint8 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC unsigned int simd_reduce_max(simd_uint16 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC float simd_reduce_max(simd_float2 x) { - return fmax(x.x, x.y); -} - -static inline SIMD_CFUNC float simd_reduce_max(simd_float3 x) { - return fmax(fmax(x.x, x.z), x.y); -} - -static inline SIMD_CFUNC float simd_reduce_max(simd_float4 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC float simd_reduce_max(simd_float8 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC float simd_reduce_max(simd_float16 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC simd_long1 simd_reduce_max(simd_long2 x) { - return x.y > x.x ? x.y : x.x; -} - -static inline SIMD_CFUNC simd_long1 simd_reduce_max(simd_long3 x) { - simd_long1 t = x.z > x.x ? x.z : x.x; - return x.y > t ? x.y : t; -} - -static inline SIMD_CFUNC simd_long1 simd_reduce_max(simd_long4 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC simd_long1 simd_reduce_max(simd_long8 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC simd_ulong1 simd_reduce_max(simd_ulong2 x) { - return x.y > x.x ? x.y : x.x; -} - -static inline SIMD_CFUNC simd_ulong1 simd_reduce_max(simd_ulong3 x) { - simd_ulong1 t = x.z > x.x ? x.z : x.x; - return x.y > t ? x.y : t; -} - -static inline SIMD_CFUNC simd_ulong1 simd_reduce_max(simd_ulong4 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC simd_ulong1 simd_reduce_max(simd_ulong8 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC double simd_reduce_max(simd_double2 x) { - return fmax(x.x, x.y); -} - -static inline SIMD_CFUNC double simd_reduce_max(simd_double3 x) { - return fmax(fmax(x.x, x.z), x.y); -} - -static inline SIMD_CFUNC double simd_reduce_max(simd_double4 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -static inline SIMD_CFUNC double simd_reduce_max(simd_double8 x) { - return simd_reduce_max(simd_max(x.lo, x.hi)); -} - -#ifdef __cplusplus -} -#endif -#endif /* SIMD_COMPILER_HAS_REQUIRED_FEATURES */ -#endif /* SIMD_COMMON_HEADER */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/simd/conversion.h b/lib/libc/include/x86_64-macos-gnu/simd/conversion.h deleted file mode 100644 index cc6c533e8f..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/simd/conversion.h +++ /dev/null @@ -1,1876 +0,0 @@ -/* Copyright (c) 2014-2017 Apple, Inc. All rights reserved. - * - * The interfaces declared in this header provide conversions between vector - * types. The following functions are available: - * - * simd_char(x) simd_uchar(x) - * simd_short(x) simd_ushort(x) - * simd_int(x) simd_uint(x) - * simd_long(x) simd_ulong(x) - * simd_float(x) - * simd_double(x) - * - * Each of these functions converts x to a vector whose elements have the - * type named by the function, with the same number of elements as x. Unlike - * a vector cast, these functions convert the elements to the new element - * type. These conversions behave exactly as C scalar conversions, except - * that conversions from integer vector types to signed integer vector types - * are guaranteed to wrap modulo 2^N (where N is the number of bits in an - * element of the result type). - * - * For integer vector types, saturating conversions are also available: - * - * simd_char_sat(x) simd_uchar_sat(x) - * simd_short_sat(x) simd_ushort_sat(x) - * simd_int_sat(x) simd_uint_sat(x) - * simd_long_sat(x) simd_ulong_sat(x) - * - * These conversions clamp x to the representable range of the result type - * before converting. - * - * Unlike most vector operations in , there are no abbreviated C++ - * names for these functions in the simd:: namespace. - */ - -#ifndef __SIMD_CONVERSION_HEADER__ -#define __SIMD_CONVERSION_HEADER__ - -#include -#if SIMD_COMPILER_HAS_REQUIRED_FEATURES -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -static simd_char2 SIMD_CFUNC simd_char(simd_char2 __x); -static simd_char3 SIMD_CFUNC simd_char(simd_char3 __x); -static simd_char4 SIMD_CFUNC simd_char(simd_char4 __x); -static simd_char8 SIMD_CFUNC simd_char(simd_char8 __x); -static simd_char16 SIMD_CFUNC simd_char(simd_char16 __x); -static simd_char32 SIMD_CFUNC simd_char(simd_char32 __x); -static simd_char2 SIMD_CFUNC simd_char(simd_uchar2 __x); -static simd_char3 SIMD_CFUNC simd_char(simd_uchar3 __x); -static simd_char4 SIMD_CFUNC simd_char(simd_uchar4 __x); -static simd_char8 SIMD_CFUNC simd_char(simd_uchar8 __x); -static simd_char16 SIMD_CFUNC simd_char(simd_uchar16 __x); -static simd_char32 SIMD_CFUNC simd_char(simd_uchar32 __x); -static simd_char2 SIMD_CFUNC simd_char(simd_short2 __x); -static simd_char3 SIMD_CFUNC simd_char(simd_short3 __x); -static simd_char4 SIMD_CFUNC simd_char(simd_short4 __x); -static simd_char8 SIMD_CFUNC simd_char(simd_short8 __x); -static simd_char16 SIMD_CFUNC simd_char(simd_short16 __x); -static simd_char32 SIMD_CFUNC simd_char(simd_short32 __x); -static simd_char2 SIMD_CFUNC simd_char(simd_ushort2 __x); -static simd_char3 SIMD_CFUNC simd_char(simd_ushort3 __x); -static simd_char4 SIMD_CFUNC simd_char(simd_ushort4 __x); -static simd_char8 SIMD_CFUNC simd_char(simd_ushort8 __x); -static simd_char16 SIMD_CFUNC simd_char(simd_ushort16 __x); -static simd_char32 SIMD_CFUNC simd_char(simd_ushort32 __x); -static simd_char2 SIMD_CFUNC simd_char(simd_int2 __x); -static simd_char3 SIMD_CFUNC simd_char(simd_int3 __x); -static simd_char4 SIMD_CFUNC simd_char(simd_int4 __x); -static simd_char8 SIMD_CFUNC simd_char(simd_int8 __x); -static simd_char16 SIMD_CFUNC simd_char(simd_int16 __x); -static simd_char2 SIMD_CFUNC simd_char(simd_uint2 __x); -static simd_char3 SIMD_CFUNC simd_char(simd_uint3 __x); -static simd_char4 SIMD_CFUNC simd_char(simd_uint4 __x); -static simd_char8 SIMD_CFUNC simd_char(simd_uint8 __x); -static simd_char16 SIMD_CFUNC simd_char(simd_uint16 __x); -static simd_char2 SIMD_CFUNC simd_char(simd_float2 __x); -static simd_char3 SIMD_CFUNC simd_char(simd_float3 __x); -static simd_char4 SIMD_CFUNC simd_char(simd_float4 __x); -static simd_char8 SIMD_CFUNC simd_char(simd_float8 __x); -static simd_char16 SIMD_CFUNC simd_char(simd_float16 __x); -static simd_char2 SIMD_CFUNC simd_char(simd_long2 __x); -static simd_char3 SIMD_CFUNC simd_char(simd_long3 __x); -static simd_char4 SIMD_CFUNC simd_char(simd_long4 __x); -static simd_char8 SIMD_CFUNC simd_char(simd_long8 __x); -static simd_char2 SIMD_CFUNC simd_char(simd_ulong2 __x); -static simd_char3 SIMD_CFUNC simd_char(simd_ulong3 __x); -static simd_char4 SIMD_CFUNC simd_char(simd_ulong4 __x); -static simd_char8 SIMD_CFUNC simd_char(simd_ulong8 __x); -static simd_char2 SIMD_CFUNC simd_char(simd_double2 __x); -static simd_char3 SIMD_CFUNC simd_char(simd_double3 __x); -static simd_char4 SIMD_CFUNC simd_char(simd_double4 __x); -static simd_char8 SIMD_CFUNC simd_char(simd_double8 __x); -static simd_char2 SIMD_CFUNC simd_char_sat(simd_char2 __x); -static simd_char3 SIMD_CFUNC simd_char_sat(simd_char3 __x); -static simd_char4 SIMD_CFUNC simd_char_sat(simd_char4 __x); -static simd_char8 SIMD_CFUNC simd_char_sat(simd_char8 __x); -static simd_char16 SIMD_CFUNC simd_char_sat(simd_char16 __x); -static simd_char32 SIMD_CFUNC simd_char_sat(simd_char32 __x); -static simd_char2 SIMD_CFUNC simd_char_sat(simd_short2 __x); -static simd_char3 SIMD_CFUNC simd_char_sat(simd_short3 __x); -static simd_char4 SIMD_CFUNC simd_char_sat(simd_short4 __x); -static simd_char8 SIMD_CFUNC simd_char_sat(simd_short8 __x); -static simd_char16 SIMD_CFUNC simd_char_sat(simd_short16 __x); -static simd_char32 SIMD_CFUNC simd_char_sat(simd_short32 __x); -static simd_char2 SIMD_CFUNC simd_char_sat(simd_int2 __x); -static simd_char3 SIMD_CFUNC simd_char_sat(simd_int3 __x); -static simd_char4 SIMD_CFUNC simd_char_sat(simd_int4 __x); -static simd_char8 SIMD_CFUNC simd_char_sat(simd_int8 __x); -static simd_char16 SIMD_CFUNC simd_char_sat(simd_int16 __x); -static simd_char2 SIMD_CFUNC simd_char_sat(simd_float2 __x); -static simd_char3 SIMD_CFUNC simd_char_sat(simd_float3 __x); -static simd_char4 SIMD_CFUNC simd_char_sat(simd_float4 __x); -static simd_char8 SIMD_CFUNC simd_char_sat(simd_float8 __x); -static simd_char16 SIMD_CFUNC simd_char_sat(simd_float16 __x); -static simd_char2 SIMD_CFUNC simd_char_sat(simd_long2 __x); -static simd_char3 SIMD_CFUNC simd_char_sat(simd_long3 __x); -static simd_char4 SIMD_CFUNC simd_char_sat(simd_long4 __x); -static simd_char8 SIMD_CFUNC simd_char_sat(simd_long8 __x); -static simd_char2 SIMD_CFUNC simd_char_sat(simd_double2 __x); -static simd_char3 SIMD_CFUNC simd_char_sat(simd_double3 __x); -static simd_char4 SIMD_CFUNC simd_char_sat(simd_double4 __x); -static simd_char8 SIMD_CFUNC simd_char_sat(simd_double8 __x); -static simd_char2 SIMD_CFUNC simd_char_sat(simd_uchar2 __x); -static simd_char3 SIMD_CFUNC simd_char_sat(simd_uchar3 __x); -static simd_char4 SIMD_CFUNC simd_char_sat(simd_uchar4 __x); -static simd_char8 SIMD_CFUNC simd_char_sat(simd_uchar8 __x); -static simd_char16 SIMD_CFUNC simd_char_sat(simd_uchar16 __x); -static simd_char32 SIMD_CFUNC simd_char_sat(simd_uchar32 __x); -static simd_char2 SIMD_CFUNC simd_char_sat(simd_ushort2 __x); -static simd_char3 SIMD_CFUNC simd_char_sat(simd_ushort3 __x); -static simd_char4 SIMD_CFUNC simd_char_sat(simd_ushort4 __x); -static simd_char8 SIMD_CFUNC simd_char_sat(simd_ushort8 __x); -static simd_char16 SIMD_CFUNC simd_char_sat(simd_ushort16 __x); -static simd_char32 SIMD_CFUNC simd_char_sat(simd_ushort32 __x); -static simd_char2 SIMD_CFUNC simd_char_sat(simd_uint2 __x); -static simd_char3 SIMD_CFUNC simd_char_sat(simd_uint3 __x); -static simd_char4 SIMD_CFUNC simd_char_sat(simd_uint4 __x); -static simd_char8 SIMD_CFUNC simd_char_sat(simd_uint8 __x); -static simd_char16 SIMD_CFUNC simd_char_sat(simd_uint16 __x); -static simd_char2 SIMD_CFUNC simd_char_sat(simd_ulong2 __x); -static simd_char3 SIMD_CFUNC simd_char_sat(simd_ulong3 __x); -static simd_char4 SIMD_CFUNC simd_char_sat(simd_ulong4 __x); -static simd_char8 SIMD_CFUNC simd_char_sat(simd_ulong8 __x); -#define vector_char simd_char -#define vector_char_sat simd_char_sat - -static simd_uchar2 SIMD_CFUNC simd_uchar(simd_char2 __x); -static simd_uchar3 SIMD_CFUNC simd_uchar(simd_char3 __x); -static simd_uchar4 SIMD_CFUNC simd_uchar(simd_char4 __x); -static simd_uchar8 SIMD_CFUNC simd_uchar(simd_char8 __x); -static simd_uchar16 SIMD_CFUNC simd_uchar(simd_char16 __x); -static simd_uchar32 SIMD_CFUNC simd_uchar(simd_char32 __x); -static simd_uchar2 SIMD_CFUNC simd_uchar(simd_uchar2 __x); -static simd_uchar3 SIMD_CFUNC simd_uchar(simd_uchar3 __x); -static simd_uchar4 SIMD_CFUNC simd_uchar(simd_uchar4 __x); -static simd_uchar8 SIMD_CFUNC simd_uchar(simd_uchar8 __x); -static simd_uchar16 SIMD_CFUNC simd_uchar(simd_uchar16 __x); -static simd_uchar32 SIMD_CFUNC simd_uchar(simd_uchar32 __x); -static simd_uchar2 SIMD_CFUNC simd_uchar(simd_short2 __x); -static simd_uchar3 SIMD_CFUNC simd_uchar(simd_short3 __x); -static simd_uchar4 SIMD_CFUNC simd_uchar(simd_short4 __x); -static simd_uchar8 SIMD_CFUNC simd_uchar(simd_short8 __x); -static simd_uchar16 SIMD_CFUNC simd_uchar(simd_short16 __x); -static simd_uchar32 SIMD_CFUNC simd_uchar(simd_short32 __x); -static simd_uchar2 SIMD_CFUNC simd_uchar(simd_ushort2 __x); -static simd_uchar3 SIMD_CFUNC simd_uchar(simd_ushort3 __x); -static simd_uchar4 SIMD_CFUNC simd_uchar(simd_ushort4 __x); -static simd_uchar8 SIMD_CFUNC simd_uchar(simd_ushort8 __x); -static simd_uchar16 SIMD_CFUNC simd_uchar(simd_ushort16 __x); -static simd_uchar32 SIMD_CFUNC simd_uchar(simd_ushort32 __x); -static simd_uchar2 SIMD_CFUNC simd_uchar(simd_int2 __x); -static simd_uchar3 SIMD_CFUNC simd_uchar(simd_int3 __x); -static simd_uchar4 SIMD_CFUNC simd_uchar(simd_int4 __x); -static simd_uchar8 SIMD_CFUNC simd_uchar(simd_int8 __x); -static simd_uchar16 SIMD_CFUNC simd_uchar(simd_int16 __x); -static simd_uchar2 SIMD_CFUNC simd_uchar(simd_uint2 __x); -static simd_uchar3 SIMD_CFUNC simd_uchar(simd_uint3 __x); -static simd_uchar4 SIMD_CFUNC simd_uchar(simd_uint4 __x); -static simd_uchar8 SIMD_CFUNC simd_uchar(simd_uint8 __x); -static simd_uchar16 SIMD_CFUNC simd_uchar(simd_uint16 __x); -static simd_uchar2 SIMD_CFUNC simd_uchar(simd_float2 __x); -static simd_uchar3 SIMD_CFUNC simd_uchar(simd_float3 __x); -static simd_uchar4 SIMD_CFUNC simd_uchar(simd_float4 __x); -static simd_uchar8 SIMD_CFUNC simd_uchar(simd_float8 __x); -static simd_uchar16 SIMD_CFUNC simd_uchar(simd_float16 __x); -static simd_uchar2 SIMD_CFUNC simd_uchar(simd_long2 __x); -static simd_uchar3 SIMD_CFUNC simd_uchar(simd_long3 __x); -static simd_uchar4 SIMD_CFUNC simd_uchar(simd_long4 __x); -static simd_uchar8 SIMD_CFUNC simd_uchar(simd_long8 __x); -static simd_uchar2 SIMD_CFUNC simd_uchar(simd_ulong2 __x); -static simd_uchar3 SIMD_CFUNC simd_uchar(simd_ulong3 __x); -static simd_uchar4 SIMD_CFUNC simd_uchar(simd_ulong4 __x); -static simd_uchar8 SIMD_CFUNC simd_uchar(simd_ulong8 __x); -static simd_uchar2 SIMD_CFUNC simd_uchar(simd_double2 __x); -static simd_uchar3 SIMD_CFUNC simd_uchar(simd_double3 __x); -static simd_uchar4 SIMD_CFUNC simd_uchar(simd_double4 __x); -static simd_uchar8 SIMD_CFUNC simd_uchar(simd_double8 __x); -static simd_uchar2 SIMD_CFUNC simd_uchar_sat(simd_char2 __x); -static simd_uchar3 SIMD_CFUNC simd_uchar_sat(simd_char3 __x); -static simd_uchar4 SIMD_CFUNC simd_uchar_sat(simd_char4 __x); -static simd_uchar8 SIMD_CFUNC simd_uchar_sat(simd_char8 __x); -static simd_uchar16 SIMD_CFUNC simd_uchar_sat(simd_char16 __x); -static simd_uchar32 SIMD_CFUNC simd_uchar_sat(simd_char32 __x); -static simd_uchar2 SIMD_CFUNC simd_uchar_sat(simd_short2 __x); -static simd_uchar3 SIMD_CFUNC simd_uchar_sat(simd_short3 __x); -static simd_uchar4 SIMD_CFUNC simd_uchar_sat(simd_short4 __x); -static simd_uchar8 SIMD_CFUNC simd_uchar_sat(simd_short8 __x); -static simd_uchar16 SIMD_CFUNC simd_uchar_sat(simd_short16 __x); -static simd_uchar32 SIMD_CFUNC simd_uchar_sat(simd_short32 __x); -static simd_uchar2 SIMD_CFUNC simd_uchar_sat(simd_int2 __x); -static simd_uchar3 SIMD_CFUNC simd_uchar_sat(simd_int3 __x); -static simd_uchar4 SIMD_CFUNC simd_uchar_sat(simd_int4 __x); -static simd_uchar8 SIMD_CFUNC simd_uchar_sat(simd_int8 __x); -static simd_uchar16 SIMD_CFUNC simd_uchar_sat(simd_int16 __x); -static simd_uchar2 SIMD_CFUNC simd_uchar_sat(simd_float2 __x); -static simd_uchar3 SIMD_CFUNC simd_uchar_sat(simd_float3 __x); -static simd_uchar4 SIMD_CFUNC simd_uchar_sat(simd_float4 __x); -static simd_uchar8 SIMD_CFUNC simd_uchar_sat(simd_float8 __x); -static simd_uchar16 SIMD_CFUNC simd_uchar_sat(simd_float16 __x); -static simd_uchar2 SIMD_CFUNC simd_uchar_sat(simd_long2 __x); -static simd_uchar3 SIMD_CFUNC simd_uchar_sat(simd_long3 __x); -static simd_uchar4 SIMD_CFUNC simd_uchar_sat(simd_long4 __x); -static simd_uchar8 SIMD_CFUNC simd_uchar_sat(simd_long8 __x); -static simd_uchar2 SIMD_CFUNC simd_uchar_sat(simd_double2 __x); -static simd_uchar3 SIMD_CFUNC simd_uchar_sat(simd_double3 __x); -static simd_uchar4 SIMD_CFUNC simd_uchar_sat(simd_double4 __x); -static simd_uchar8 SIMD_CFUNC simd_uchar_sat(simd_double8 __x); -static simd_uchar2 SIMD_CFUNC simd_uchar_sat(simd_uchar2 __x); -static simd_uchar3 SIMD_CFUNC simd_uchar_sat(simd_uchar3 __x); -static simd_uchar4 SIMD_CFUNC simd_uchar_sat(simd_uchar4 __x); -static simd_uchar8 SIMD_CFUNC simd_uchar_sat(simd_uchar8 __x); -static simd_uchar16 SIMD_CFUNC simd_uchar_sat(simd_uchar16 __x); -static simd_uchar32 SIMD_CFUNC simd_uchar_sat(simd_uchar32 __x); -static simd_uchar2 SIMD_CFUNC simd_uchar_sat(simd_ushort2 __x); -static simd_uchar3 SIMD_CFUNC simd_uchar_sat(simd_ushort3 __x); -static simd_uchar4 SIMD_CFUNC simd_uchar_sat(simd_ushort4 __x); -static simd_uchar8 SIMD_CFUNC simd_uchar_sat(simd_ushort8 __x); -static simd_uchar16 SIMD_CFUNC simd_uchar_sat(simd_ushort16 __x); -static simd_uchar32 SIMD_CFUNC simd_uchar_sat(simd_ushort32 __x); -static simd_uchar2 SIMD_CFUNC simd_uchar_sat(simd_uint2 __x); -static simd_uchar3 SIMD_CFUNC simd_uchar_sat(simd_uint3 __x); -static simd_uchar4 SIMD_CFUNC simd_uchar_sat(simd_uint4 __x); -static simd_uchar8 SIMD_CFUNC simd_uchar_sat(simd_uint8 __x); -static simd_uchar16 SIMD_CFUNC simd_uchar_sat(simd_uint16 __x); -static simd_uchar2 SIMD_CFUNC simd_uchar_sat(simd_ulong2 __x); -static simd_uchar3 SIMD_CFUNC simd_uchar_sat(simd_ulong3 __x); -static simd_uchar4 SIMD_CFUNC simd_uchar_sat(simd_ulong4 __x); -static simd_uchar8 SIMD_CFUNC simd_uchar_sat(simd_ulong8 __x); -#define vector_uchar simd_uchar -#define vector_uchar_sat simd_uchar_sat - -static simd_short2 SIMD_CFUNC simd_short(simd_char2 __x); -static simd_short3 SIMD_CFUNC simd_short(simd_char3 __x); -static simd_short4 SIMD_CFUNC simd_short(simd_char4 __x); -static simd_short8 SIMD_CFUNC simd_short(simd_char8 __x); -static simd_short16 SIMD_CFUNC simd_short(simd_char16 __x); -static simd_short32 SIMD_CFUNC simd_short(simd_char32 __x); -static simd_short2 SIMD_CFUNC simd_short(simd_uchar2 __x); -static simd_short3 SIMD_CFUNC simd_short(simd_uchar3 __x); -static simd_short4 SIMD_CFUNC simd_short(simd_uchar4 __x); -static simd_short8 SIMD_CFUNC simd_short(simd_uchar8 __x); -static simd_short16 SIMD_CFUNC simd_short(simd_uchar16 __x); -static simd_short32 SIMD_CFUNC simd_short(simd_uchar32 __x); -static simd_short2 SIMD_CFUNC simd_short(simd_short2 __x); -static simd_short3 SIMD_CFUNC simd_short(simd_short3 __x); -static simd_short4 SIMD_CFUNC simd_short(simd_short4 __x); -static simd_short8 SIMD_CFUNC simd_short(simd_short8 __x); -static simd_short16 SIMD_CFUNC simd_short(simd_short16 __x); -static simd_short32 SIMD_CFUNC simd_short(simd_short32 __x); -static simd_short2 SIMD_CFUNC simd_short(simd_ushort2 __x); -static simd_short3 SIMD_CFUNC simd_short(simd_ushort3 __x); -static simd_short4 SIMD_CFUNC simd_short(simd_ushort4 __x); -static simd_short8 SIMD_CFUNC simd_short(simd_ushort8 __x); -static simd_short16 SIMD_CFUNC simd_short(simd_ushort16 __x); -static simd_short32 SIMD_CFUNC simd_short(simd_ushort32 __x); -static simd_short2 SIMD_CFUNC simd_short(simd_int2 __x); -static simd_short3 SIMD_CFUNC simd_short(simd_int3 __x); -static simd_short4 SIMD_CFUNC simd_short(simd_int4 __x); -static simd_short8 SIMD_CFUNC simd_short(simd_int8 __x); -static simd_short16 SIMD_CFUNC simd_short(simd_int16 __x); -static simd_short2 SIMD_CFUNC simd_short(simd_uint2 __x); -static simd_short3 SIMD_CFUNC simd_short(simd_uint3 __x); -static simd_short4 SIMD_CFUNC simd_short(simd_uint4 __x); -static simd_short8 SIMD_CFUNC simd_short(simd_uint8 __x); -static simd_short16 SIMD_CFUNC simd_short(simd_uint16 __x); -static simd_short2 SIMD_CFUNC simd_short(simd_float2 __x); -static simd_short3 SIMD_CFUNC simd_short(simd_float3 __x); -static simd_short4 SIMD_CFUNC simd_short(simd_float4 __x); -static simd_short8 SIMD_CFUNC simd_short(simd_float8 __x); -static simd_short16 SIMD_CFUNC simd_short(simd_float16 __x); -static simd_short2 SIMD_CFUNC simd_short(simd_long2 __x); -static simd_short3 SIMD_CFUNC simd_short(simd_long3 __x); -static simd_short4 SIMD_CFUNC simd_short(simd_long4 __x); -static simd_short8 SIMD_CFUNC simd_short(simd_long8 __x); -static simd_short2 SIMD_CFUNC simd_short(simd_ulong2 __x); -static simd_short3 SIMD_CFUNC simd_short(simd_ulong3 __x); -static simd_short4 SIMD_CFUNC simd_short(simd_ulong4 __x); -static simd_short8 SIMD_CFUNC simd_short(simd_ulong8 __x); -static simd_short2 SIMD_CFUNC simd_short(simd_double2 __x); -static simd_short3 SIMD_CFUNC simd_short(simd_double3 __x); -static simd_short4 SIMD_CFUNC simd_short(simd_double4 __x); -static simd_short8 SIMD_CFUNC simd_short(simd_double8 __x); -static simd_short2 SIMD_CFUNC simd_short_sat(simd_char2 __x); -static simd_short3 SIMD_CFUNC simd_short_sat(simd_char3 __x); -static simd_short4 SIMD_CFUNC simd_short_sat(simd_char4 __x); -static simd_short8 SIMD_CFUNC simd_short_sat(simd_char8 __x); -static simd_short16 SIMD_CFUNC simd_short_sat(simd_char16 __x); -static simd_short32 SIMD_CFUNC simd_short_sat(simd_char32 __x); -static simd_short2 SIMD_CFUNC simd_short_sat(simd_short2 __x); -static simd_short3 SIMD_CFUNC simd_short_sat(simd_short3 __x); -static simd_short4 SIMD_CFUNC simd_short_sat(simd_short4 __x); -static simd_short8 SIMD_CFUNC simd_short_sat(simd_short8 __x); -static simd_short16 SIMD_CFUNC simd_short_sat(simd_short16 __x); -static simd_short32 SIMD_CFUNC simd_short_sat(simd_short32 __x); -static simd_short2 SIMD_CFUNC simd_short_sat(simd_int2 __x); -static simd_short3 SIMD_CFUNC simd_short_sat(simd_int3 __x); -static simd_short4 SIMD_CFUNC simd_short_sat(simd_int4 __x); -static simd_short8 SIMD_CFUNC simd_short_sat(simd_int8 __x); -static simd_short16 SIMD_CFUNC simd_short_sat(simd_int16 __x); -static simd_short2 SIMD_CFUNC simd_short_sat(simd_float2 __x); -static simd_short3 SIMD_CFUNC simd_short_sat(simd_float3 __x); -static simd_short4 SIMD_CFUNC simd_short_sat(simd_float4 __x); -static simd_short8 SIMD_CFUNC simd_short_sat(simd_float8 __x); -static simd_short16 SIMD_CFUNC simd_short_sat(simd_float16 __x); -static simd_short2 SIMD_CFUNC simd_short_sat(simd_long2 __x); -static simd_short3 SIMD_CFUNC simd_short_sat(simd_long3 __x); -static simd_short4 SIMD_CFUNC simd_short_sat(simd_long4 __x); -static simd_short8 SIMD_CFUNC simd_short_sat(simd_long8 __x); -static simd_short2 SIMD_CFUNC simd_short_sat(simd_double2 __x); -static simd_short3 SIMD_CFUNC simd_short_sat(simd_double3 __x); -static simd_short4 SIMD_CFUNC simd_short_sat(simd_double4 __x); -static simd_short8 SIMD_CFUNC simd_short_sat(simd_double8 __x); -static simd_short2 SIMD_CFUNC simd_short_sat(simd_uchar2 __x); -static simd_short3 SIMD_CFUNC simd_short_sat(simd_uchar3 __x); -static simd_short4 SIMD_CFUNC simd_short_sat(simd_uchar4 __x); -static simd_short8 SIMD_CFUNC simd_short_sat(simd_uchar8 __x); -static simd_short16 SIMD_CFUNC simd_short_sat(simd_uchar16 __x); -static simd_short32 SIMD_CFUNC simd_short_sat(simd_uchar32 __x); -static simd_short2 SIMD_CFUNC simd_short_sat(simd_ushort2 __x); -static simd_short3 SIMD_CFUNC simd_short_sat(simd_ushort3 __x); -static simd_short4 SIMD_CFUNC simd_short_sat(simd_ushort4 __x); -static simd_short8 SIMD_CFUNC simd_short_sat(simd_ushort8 __x); -static simd_short16 SIMD_CFUNC simd_short_sat(simd_ushort16 __x); -static simd_short32 SIMD_CFUNC simd_short_sat(simd_ushort32 __x); -static simd_short2 SIMD_CFUNC simd_short_sat(simd_uint2 __x); -static simd_short3 SIMD_CFUNC simd_short_sat(simd_uint3 __x); -static simd_short4 SIMD_CFUNC simd_short_sat(simd_uint4 __x); -static simd_short8 SIMD_CFUNC simd_short_sat(simd_uint8 __x); -static simd_short16 SIMD_CFUNC simd_short_sat(simd_uint16 __x); -static simd_short2 SIMD_CFUNC simd_short_sat(simd_ulong2 __x); -static simd_short3 SIMD_CFUNC simd_short_sat(simd_ulong3 __x); -static simd_short4 SIMD_CFUNC simd_short_sat(simd_ulong4 __x); -static simd_short8 SIMD_CFUNC simd_short_sat(simd_ulong8 __x); -#define vector_short simd_short -#define vector_short_sat simd_short_sat - -static simd_ushort2 SIMD_CFUNC simd_ushort(simd_char2 __x); -static simd_ushort3 SIMD_CFUNC simd_ushort(simd_char3 __x); -static simd_ushort4 SIMD_CFUNC simd_ushort(simd_char4 __x); -static simd_ushort8 SIMD_CFUNC simd_ushort(simd_char8 __x); -static simd_ushort16 SIMD_CFUNC simd_ushort(simd_char16 __x); -static simd_ushort32 SIMD_CFUNC simd_ushort(simd_char32 __x); -static simd_ushort2 SIMD_CFUNC simd_ushort(simd_uchar2 __x); -static simd_ushort3 SIMD_CFUNC simd_ushort(simd_uchar3 __x); -static simd_ushort4 SIMD_CFUNC simd_ushort(simd_uchar4 __x); -static simd_ushort8 SIMD_CFUNC simd_ushort(simd_uchar8 __x); -static simd_ushort16 SIMD_CFUNC simd_ushort(simd_uchar16 __x); -static simd_ushort32 SIMD_CFUNC simd_ushort(simd_uchar32 __x); -static simd_ushort2 SIMD_CFUNC simd_ushort(simd_short2 __x); -static simd_ushort3 SIMD_CFUNC simd_ushort(simd_short3 __x); -static simd_ushort4 SIMD_CFUNC simd_ushort(simd_short4 __x); -static simd_ushort8 SIMD_CFUNC simd_ushort(simd_short8 __x); -static simd_ushort16 SIMD_CFUNC simd_ushort(simd_short16 __x); -static simd_ushort32 SIMD_CFUNC simd_ushort(simd_short32 __x); -static simd_ushort2 SIMD_CFUNC simd_ushort(simd_ushort2 __x); -static simd_ushort3 SIMD_CFUNC simd_ushort(simd_ushort3 __x); -static simd_ushort4 SIMD_CFUNC simd_ushort(simd_ushort4 __x); -static simd_ushort8 SIMD_CFUNC simd_ushort(simd_ushort8 __x); -static simd_ushort16 SIMD_CFUNC simd_ushort(simd_ushort16 __x); -static simd_ushort32 SIMD_CFUNC simd_ushort(simd_ushort32 __x); -static simd_ushort2 SIMD_CFUNC simd_ushort(simd_int2 __x); -static simd_ushort3 SIMD_CFUNC simd_ushort(simd_int3 __x); -static simd_ushort4 SIMD_CFUNC simd_ushort(simd_int4 __x); -static simd_ushort8 SIMD_CFUNC simd_ushort(simd_int8 __x); -static simd_ushort16 SIMD_CFUNC simd_ushort(simd_int16 __x); -static simd_ushort2 SIMD_CFUNC simd_ushort(simd_uint2 __x); -static simd_ushort3 SIMD_CFUNC simd_ushort(simd_uint3 __x); -static simd_ushort4 SIMD_CFUNC simd_ushort(simd_uint4 __x); -static simd_ushort8 SIMD_CFUNC simd_ushort(simd_uint8 __x); -static simd_ushort16 SIMD_CFUNC simd_ushort(simd_uint16 __x); -static simd_ushort2 SIMD_CFUNC simd_ushort(simd_float2 __x); -static simd_ushort3 SIMD_CFUNC simd_ushort(simd_float3 __x); -static simd_ushort4 SIMD_CFUNC simd_ushort(simd_float4 __x); -static simd_ushort8 SIMD_CFUNC simd_ushort(simd_float8 __x); -static simd_ushort16 SIMD_CFUNC simd_ushort(simd_float16 __x); -static simd_ushort2 SIMD_CFUNC simd_ushort(simd_long2 __x); -static simd_ushort3 SIMD_CFUNC simd_ushort(simd_long3 __x); -static simd_ushort4 SIMD_CFUNC simd_ushort(simd_long4 __x); -static simd_ushort8 SIMD_CFUNC simd_ushort(simd_long8 __x); -static simd_ushort2 SIMD_CFUNC simd_ushort(simd_ulong2 __x); -static simd_ushort3 SIMD_CFUNC simd_ushort(simd_ulong3 __x); -static simd_ushort4 SIMD_CFUNC simd_ushort(simd_ulong4 __x); -static simd_ushort8 SIMD_CFUNC simd_ushort(simd_ulong8 __x); -static simd_ushort2 SIMD_CFUNC simd_ushort(simd_double2 __x); -static simd_ushort3 SIMD_CFUNC simd_ushort(simd_double3 __x); -static simd_ushort4 SIMD_CFUNC simd_ushort(simd_double4 __x); -static simd_ushort8 SIMD_CFUNC simd_ushort(simd_double8 __x); -static simd_ushort2 SIMD_CFUNC simd_ushort_sat(simd_char2 __x); -static simd_ushort3 SIMD_CFUNC simd_ushort_sat(simd_char3 __x); -static simd_ushort4 SIMD_CFUNC simd_ushort_sat(simd_char4 __x); -static simd_ushort8 SIMD_CFUNC simd_ushort_sat(simd_char8 __x); -static simd_ushort16 SIMD_CFUNC simd_ushort_sat(simd_char16 __x); -static simd_ushort32 SIMD_CFUNC simd_ushort_sat(simd_char32 __x); -static simd_ushort2 SIMD_CFUNC simd_ushort_sat(simd_short2 __x); -static simd_ushort3 SIMD_CFUNC simd_ushort_sat(simd_short3 __x); -static simd_ushort4 SIMD_CFUNC simd_ushort_sat(simd_short4 __x); -static simd_ushort8 SIMD_CFUNC simd_ushort_sat(simd_short8 __x); -static simd_ushort16 SIMD_CFUNC simd_ushort_sat(simd_short16 __x); -static simd_ushort32 SIMD_CFUNC simd_ushort_sat(simd_short32 __x); -static simd_ushort2 SIMD_CFUNC simd_ushort_sat(simd_int2 __x); -static simd_ushort3 SIMD_CFUNC simd_ushort_sat(simd_int3 __x); -static simd_ushort4 SIMD_CFUNC simd_ushort_sat(simd_int4 __x); -static simd_ushort8 SIMD_CFUNC simd_ushort_sat(simd_int8 __x); -static simd_ushort16 SIMD_CFUNC simd_ushort_sat(simd_int16 __x); -static simd_ushort2 SIMD_CFUNC simd_ushort_sat(simd_float2 __x); -static simd_ushort3 SIMD_CFUNC simd_ushort_sat(simd_float3 __x); -static simd_ushort4 SIMD_CFUNC simd_ushort_sat(simd_float4 __x); -static simd_ushort8 SIMD_CFUNC simd_ushort_sat(simd_float8 __x); -static simd_ushort16 SIMD_CFUNC simd_ushort_sat(simd_float16 __x); -static simd_ushort2 SIMD_CFUNC simd_ushort_sat(simd_long2 __x); -static simd_ushort3 SIMD_CFUNC simd_ushort_sat(simd_long3 __x); -static simd_ushort4 SIMD_CFUNC simd_ushort_sat(simd_long4 __x); -static simd_ushort8 SIMD_CFUNC simd_ushort_sat(simd_long8 __x); -static simd_ushort2 SIMD_CFUNC simd_ushort_sat(simd_double2 __x); -static simd_ushort3 SIMD_CFUNC simd_ushort_sat(simd_double3 __x); -static simd_ushort4 SIMD_CFUNC simd_ushort_sat(simd_double4 __x); -static simd_ushort8 SIMD_CFUNC simd_ushort_sat(simd_double8 __x); -static simd_ushort2 SIMD_CFUNC simd_ushort_sat(simd_uchar2 __x); -static simd_ushort3 SIMD_CFUNC simd_ushort_sat(simd_uchar3 __x); -static simd_ushort4 SIMD_CFUNC simd_ushort_sat(simd_uchar4 __x); -static simd_ushort8 SIMD_CFUNC simd_ushort_sat(simd_uchar8 __x); -static simd_ushort16 SIMD_CFUNC simd_ushort_sat(simd_uchar16 __x); -static simd_ushort32 SIMD_CFUNC simd_ushort_sat(simd_uchar32 __x); -static simd_ushort2 SIMD_CFUNC simd_ushort_sat(simd_ushort2 __x); -static simd_ushort3 SIMD_CFUNC simd_ushort_sat(simd_ushort3 __x); -static simd_ushort4 SIMD_CFUNC simd_ushort_sat(simd_ushort4 __x); -static simd_ushort8 SIMD_CFUNC simd_ushort_sat(simd_ushort8 __x); -static simd_ushort16 SIMD_CFUNC simd_ushort_sat(simd_ushort16 __x); -static simd_ushort32 SIMD_CFUNC simd_ushort_sat(simd_ushort32 __x); -static simd_ushort2 SIMD_CFUNC simd_ushort_sat(simd_uint2 __x); -static simd_ushort3 SIMD_CFUNC simd_ushort_sat(simd_uint3 __x); -static simd_ushort4 SIMD_CFUNC simd_ushort_sat(simd_uint4 __x); -static simd_ushort8 SIMD_CFUNC simd_ushort_sat(simd_uint8 __x); -static simd_ushort16 SIMD_CFUNC simd_ushort_sat(simd_uint16 __x); -static simd_ushort2 SIMD_CFUNC simd_ushort_sat(simd_ulong2 __x); -static simd_ushort3 SIMD_CFUNC simd_ushort_sat(simd_ulong3 __x); -static simd_ushort4 SIMD_CFUNC simd_ushort_sat(simd_ulong4 __x); -static simd_ushort8 SIMD_CFUNC simd_ushort_sat(simd_ulong8 __x); -#define vector_ushort simd_ushort -#define vector_ushort_sat simd_ushort_sat - -static simd_int2 SIMD_CFUNC simd_int(simd_char2 __x); -static simd_int3 SIMD_CFUNC simd_int(simd_char3 __x); -static simd_int4 SIMD_CFUNC simd_int(simd_char4 __x); -static simd_int8 SIMD_CFUNC simd_int(simd_char8 __x); -static simd_int16 SIMD_CFUNC simd_int(simd_char16 __x); -static simd_int2 SIMD_CFUNC simd_int(simd_uchar2 __x); -static simd_int3 SIMD_CFUNC simd_int(simd_uchar3 __x); -static simd_int4 SIMD_CFUNC simd_int(simd_uchar4 __x); -static simd_int8 SIMD_CFUNC simd_int(simd_uchar8 __x); -static simd_int16 SIMD_CFUNC simd_int(simd_uchar16 __x); -static simd_int2 SIMD_CFUNC simd_int(simd_short2 __x); -static simd_int3 SIMD_CFUNC simd_int(simd_short3 __x); -static simd_int4 SIMD_CFUNC simd_int(simd_short4 __x); -static simd_int8 SIMD_CFUNC simd_int(simd_short8 __x); -static simd_int16 SIMD_CFUNC simd_int(simd_short16 __x); -static simd_int2 SIMD_CFUNC simd_int(simd_ushort2 __x); -static simd_int3 SIMD_CFUNC simd_int(simd_ushort3 __x); -static simd_int4 SIMD_CFUNC simd_int(simd_ushort4 __x); -static simd_int8 SIMD_CFUNC simd_int(simd_ushort8 __x); -static simd_int16 SIMD_CFUNC simd_int(simd_ushort16 __x); -static simd_int2 SIMD_CFUNC simd_int(simd_int2 __x); -static simd_int3 SIMD_CFUNC simd_int(simd_int3 __x); -static simd_int4 SIMD_CFUNC simd_int(simd_int4 __x); -static simd_int8 SIMD_CFUNC simd_int(simd_int8 __x); -static simd_int16 SIMD_CFUNC simd_int(simd_int16 __x); -static simd_int2 SIMD_CFUNC simd_int(simd_uint2 __x); -static simd_int3 SIMD_CFUNC simd_int(simd_uint3 __x); -static simd_int4 SIMD_CFUNC simd_int(simd_uint4 __x); -static simd_int8 SIMD_CFUNC simd_int(simd_uint8 __x); -static simd_int16 SIMD_CFUNC simd_int(simd_uint16 __x); -static simd_int2 SIMD_CFUNC simd_int(simd_float2 __x); -static simd_int3 SIMD_CFUNC simd_int(simd_float3 __x); -static simd_int4 SIMD_CFUNC simd_int(simd_float4 __x); -static simd_int8 SIMD_CFUNC simd_int(simd_float8 __x); -static simd_int16 SIMD_CFUNC simd_int(simd_float16 __x); -static simd_int2 SIMD_CFUNC simd_int(simd_long2 __x); -static simd_int3 SIMD_CFUNC simd_int(simd_long3 __x); -static simd_int4 SIMD_CFUNC simd_int(simd_long4 __x); -static simd_int8 SIMD_CFUNC simd_int(simd_long8 __x); -static simd_int2 SIMD_CFUNC simd_int(simd_ulong2 __x); -static simd_int3 SIMD_CFUNC simd_int(simd_ulong3 __x); -static simd_int4 SIMD_CFUNC simd_int(simd_ulong4 __x); -static simd_int8 SIMD_CFUNC simd_int(simd_ulong8 __x); -static simd_int2 SIMD_CFUNC simd_int(simd_double2 __x); -static simd_int3 SIMD_CFUNC simd_int(simd_double3 __x); -static simd_int4 SIMD_CFUNC simd_int(simd_double4 __x); -static simd_int8 SIMD_CFUNC simd_int(simd_double8 __x); -static simd_int2 SIMD_CFUNC simd_int_sat(simd_char2 __x); -static simd_int3 SIMD_CFUNC simd_int_sat(simd_char3 __x); -static simd_int4 SIMD_CFUNC simd_int_sat(simd_char4 __x); -static simd_int8 SIMD_CFUNC simd_int_sat(simd_char8 __x); -static simd_int16 SIMD_CFUNC simd_int_sat(simd_char16 __x); -static simd_int2 SIMD_CFUNC simd_int_sat(simd_short2 __x); -static simd_int3 SIMD_CFUNC simd_int_sat(simd_short3 __x); -static simd_int4 SIMD_CFUNC simd_int_sat(simd_short4 __x); -static simd_int8 SIMD_CFUNC simd_int_sat(simd_short8 __x); -static simd_int16 SIMD_CFUNC simd_int_sat(simd_short16 __x); -static simd_int2 SIMD_CFUNC simd_int_sat(simd_int2 __x); -static simd_int3 SIMD_CFUNC simd_int_sat(simd_int3 __x); -static simd_int4 SIMD_CFUNC simd_int_sat(simd_int4 __x); -static simd_int8 SIMD_CFUNC simd_int_sat(simd_int8 __x); -static simd_int16 SIMD_CFUNC simd_int_sat(simd_int16 __x); -static simd_int2 SIMD_CFUNC simd_int_sat(simd_float2 __x); -static simd_int3 SIMD_CFUNC simd_int_sat(simd_float3 __x); -static simd_int4 SIMD_CFUNC simd_int_sat(simd_float4 __x); -static simd_int8 SIMD_CFUNC simd_int_sat(simd_float8 __x); -static simd_int16 SIMD_CFUNC simd_int_sat(simd_float16 __x); -static simd_int2 SIMD_CFUNC simd_int_sat(simd_long2 __x); -static simd_int3 SIMD_CFUNC simd_int_sat(simd_long3 __x); -static simd_int4 SIMD_CFUNC simd_int_sat(simd_long4 __x); -static simd_int8 SIMD_CFUNC simd_int_sat(simd_long8 __x); -static simd_int2 SIMD_CFUNC simd_int_sat(simd_double2 __x); -static simd_int3 SIMD_CFUNC simd_int_sat(simd_double3 __x); -static simd_int4 SIMD_CFUNC simd_int_sat(simd_double4 __x); -static simd_int8 SIMD_CFUNC simd_int_sat(simd_double8 __x); -static simd_int2 SIMD_CFUNC simd_int_sat(simd_uchar2 __x); -static simd_int3 SIMD_CFUNC simd_int_sat(simd_uchar3 __x); -static simd_int4 SIMD_CFUNC simd_int_sat(simd_uchar4 __x); -static simd_int8 SIMD_CFUNC simd_int_sat(simd_uchar8 __x); -static simd_int16 SIMD_CFUNC simd_int_sat(simd_uchar16 __x); -static simd_int2 SIMD_CFUNC simd_int_sat(simd_ushort2 __x); -static simd_int3 SIMD_CFUNC simd_int_sat(simd_ushort3 __x); -static simd_int4 SIMD_CFUNC simd_int_sat(simd_ushort4 __x); -static simd_int8 SIMD_CFUNC simd_int_sat(simd_ushort8 __x); -static simd_int16 SIMD_CFUNC simd_int_sat(simd_ushort16 __x); -static simd_int2 SIMD_CFUNC simd_int_sat(simd_uint2 __x); -static simd_int3 SIMD_CFUNC simd_int_sat(simd_uint3 __x); -static simd_int4 SIMD_CFUNC simd_int_sat(simd_uint4 __x); -static simd_int8 SIMD_CFUNC simd_int_sat(simd_uint8 __x); -static simd_int16 SIMD_CFUNC simd_int_sat(simd_uint16 __x); -static simd_int2 SIMD_CFUNC simd_int_sat(simd_ulong2 __x); -static simd_int3 SIMD_CFUNC simd_int_sat(simd_ulong3 __x); -static simd_int4 SIMD_CFUNC simd_int_sat(simd_ulong4 __x); -static simd_int8 SIMD_CFUNC simd_int_sat(simd_ulong8 __x); -#define vector_int simd_int -#define vector_int_sat simd_int_sat - -static simd_uint2 SIMD_CFUNC simd_uint(simd_char2 __x); -static simd_uint3 SIMD_CFUNC simd_uint(simd_char3 __x); -static simd_uint4 SIMD_CFUNC simd_uint(simd_char4 __x); -static simd_uint8 SIMD_CFUNC simd_uint(simd_char8 __x); -static simd_uint16 SIMD_CFUNC simd_uint(simd_char16 __x); -static simd_uint2 SIMD_CFUNC simd_uint(simd_uchar2 __x); -static simd_uint3 SIMD_CFUNC simd_uint(simd_uchar3 __x); -static simd_uint4 SIMD_CFUNC simd_uint(simd_uchar4 __x); -static simd_uint8 SIMD_CFUNC simd_uint(simd_uchar8 __x); -static simd_uint16 SIMD_CFUNC simd_uint(simd_uchar16 __x); -static simd_uint2 SIMD_CFUNC simd_uint(simd_short2 __x); -static simd_uint3 SIMD_CFUNC simd_uint(simd_short3 __x); -static simd_uint4 SIMD_CFUNC simd_uint(simd_short4 __x); -static simd_uint8 SIMD_CFUNC simd_uint(simd_short8 __x); -static simd_uint16 SIMD_CFUNC simd_uint(simd_short16 __x); -static simd_uint2 SIMD_CFUNC simd_uint(simd_ushort2 __x); -static simd_uint3 SIMD_CFUNC simd_uint(simd_ushort3 __x); -static simd_uint4 SIMD_CFUNC simd_uint(simd_ushort4 __x); -static simd_uint8 SIMD_CFUNC simd_uint(simd_ushort8 __x); -static simd_uint16 SIMD_CFUNC simd_uint(simd_ushort16 __x); -static simd_uint2 SIMD_CFUNC simd_uint(simd_int2 __x); -static simd_uint3 SIMD_CFUNC simd_uint(simd_int3 __x); -static simd_uint4 SIMD_CFUNC simd_uint(simd_int4 __x); -static simd_uint8 SIMD_CFUNC simd_uint(simd_int8 __x); -static simd_uint16 SIMD_CFUNC simd_uint(simd_int16 __x); -static simd_uint2 SIMD_CFUNC simd_uint(simd_uint2 __x); -static simd_uint3 SIMD_CFUNC simd_uint(simd_uint3 __x); -static simd_uint4 SIMD_CFUNC simd_uint(simd_uint4 __x); -static simd_uint8 SIMD_CFUNC simd_uint(simd_uint8 __x); -static simd_uint16 SIMD_CFUNC simd_uint(simd_uint16 __x); -static simd_uint2 SIMD_CFUNC simd_uint(simd_float2 __x); -static simd_uint3 SIMD_CFUNC simd_uint(simd_float3 __x); -static simd_uint4 SIMD_CFUNC simd_uint(simd_float4 __x); -static simd_uint8 SIMD_CFUNC simd_uint(simd_float8 __x); -static simd_uint16 SIMD_CFUNC simd_uint(simd_float16 __x); -static simd_uint2 SIMD_CFUNC simd_uint(simd_long2 __x); -static simd_uint3 SIMD_CFUNC simd_uint(simd_long3 __x); -static simd_uint4 SIMD_CFUNC simd_uint(simd_long4 __x); -static simd_uint8 SIMD_CFUNC simd_uint(simd_long8 __x); -static simd_uint2 SIMD_CFUNC simd_uint(simd_ulong2 __x); -static simd_uint3 SIMD_CFUNC simd_uint(simd_ulong3 __x); -static simd_uint4 SIMD_CFUNC simd_uint(simd_ulong4 __x); -static simd_uint8 SIMD_CFUNC simd_uint(simd_ulong8 __x); -static simd_uint2 SIMD_CFUNC simd_uint(simd_double2 __x); -static simd_uint3 SIMD_CFUNC simd_uint(simd_double3 __x); -static simd_uint4 SIMD_CFUNC simd_uint(simd_double4 __x); -static simd_uint8 SIMD_CFUNC simd_uint(simd_double8 __x); -static simd_uint2 SIMD_CFUNC simd_uint_sat(simd_char2 __x); -static simd_uint3 SIMD_CFUNC simd_uint_sat(simd_char3 __x); -static simd_uint4 SIMD_CFUNC simd_uint_sat(simd_char4 __x); -static simd_uint8 SIMD_CFUNC simd_uint_sat(simd_char8 __x); -static simd_uint16 SIMD_CFUNC simd_uint_sat(simd_char16 __x); -static simd_uint2 SIMD_CFUNC simd_uint_sat(simd_short2 __x); -static simd_uint3 SIMD_CFUNC simd_uint_sat(simd_short3 __x); -static simd_uint4 SIMD_CFUNC simd_uint_sat(simd_short4 __x); -static simd_uint8 SIMD_CFUNC simd_uint_sat(simd_short8 __x); -static simd_uint16 SIMD_CFUNC simd_uint_sat(simd_short16 __x); -static simd_uint2 SIMD_CFUNC simd_uint_sat(simd_int2 __x); -static simd_uint3 SIMD_CFUNC simd_uint_sat(simd_int3 __x); -static simd_uint4 SIMD_CFUNC simd_uint_sat(simd_int4 __x); -static simd_uint8 SIMD_CFUNC simd_uint_sat(simd_int8 __x); -static simd_uint16 SIMD_CFUNC simd_uint_sat(simd_int16 __x); -static simd_uint2 SIMD_CFUNC simd_uint_sat(simd_float2 __x); -static simd_uint3 SIMD_CFUNC simd_uint_sat(simd_float3 __x); -static simd_uint4 SIMD_CFUNC simd_uint_sat(simd_float4 __x); -static simd_uint8 SIMD_CFUNC simd_uint_sat(simd_float8 __x); -static simd_uint16 SIMD_CFUNC simd_uint_sat(simd_float16 __x); -static simd_uint2 SIMD_CFUNC simd_uint_sat(simd_long2 __x); -static simd_uint3 SIMD_CFUNC simd_uint_sat(simd_long3 __x); -static simd_uint4 SIMD_CFUNC simd_uint_sat(simd_long4 __x); -static simd_uint8 SIMD_CFUNC simd_uint_sat(simd_long8 __x); -static simd_uint2 SIMD_CFUNC simd_uint_sat(simd_double2 __x); -static simd_uint3 SIMD_CFUNC simd_uint_sat(simd_double3 __x); -static simd_uint4 SIMD_CFUNC simd_uint_sat(simd_double4 __x); -static simd_uint8 SIMD_CFUNC simd_uint_sat(simd_double8 __x); -static simd_uint2 SIMD_CFUNC simd_uint_sat(simd_uchar2 __x); -static simd_uint3 SIMD_CFUNC simd_uint_sat(simd_uchar3 __x); -static simd_uint4 SIMD_CFUNC simd_uint_sat(simd_uchar4 __x); -static simd_uint8 SIMD_CFUNC simd_uint_sat(simd_uchar8 __x); -static simd_uint16 SIMD_CFUNC simd_uint_sat(simd_uchar16 __x); -static simd_uint2 SIMD_CFUNC simd_uint_sat(simd_ushort2 __x); -static simd_uint3 SIMD_CFUNC simd_uint_sat(simd_ushort3 __x); -static simd_uint4 SIMD_CFUNC simd_uint_sat(simd_ushort4 __x); -static simd_uint8 SIMD_CFUNC simd_uint_sat(simd_ushort8 __x); -static simd_uint16 SIMD_CFUNC simd_uint_sat(simd_ushort16 __x); -static simd_uint2 SIMD_CFUNC simd_uint_sat(simd_uint2 __x); -static simd_uint3 SIMD_CFUNC simd_uint_sat(simd_uint3 __x); -static simd_uint4 SIMD_CFUNC simd_uint_sat(simd_uint4 __x); -static simd_uint8 SIMD_CFUNC simd_uint_sat(simd_uint8 __x); -static simd_uint16 SIMD_CFUNC simd_uint_sat(simd_uint16 __x); -static simd_uint2 SIMD_CFUNC simd_uint_sat(simd_ulong2 __x); -static simd_uint3 SIMD_CFUNC simd_uint_sat(simd_ulong3 __x); -static simd_uint4 SIMD_CFUNC simd_uint_sat(simd_ulong4 __x); -static simd_uint8 SIMD_CFUNC simd_uint_sat(simd_ulong8 __x); -#define vector_uint simd_uint -#define vector_uint_sat simd_uint_sat - -static simd_float2 SIMD_CFUNC simd_float(simd_char2 __x); -static simd_float3 SIMD_CFUNC simd_float(simd_char3 __x); -static simd_float4 SIMD_CFUNC simd_float(simd_char4 __x); -static simd_float8 SIMD_CFUNC simd_float(simd_char8 __x); -static simd_float16 SIMD_CFUNC simd_float(simd_char16 __x); -static simd_float2 SIMD_CFUNC simd_float(simd_uchar2 __x); -static simd_float3 SIMD_CFUNC simd_float(simd_uchar3 __x); -static simd_float4 SIMD_CFUNC simd_float(simd_uchar4 __x); -static simd_float8 SIMD_CFUNC simd_float(simd_uchar8 __x); -static simd_float16 SIMD_CFUNC simd_float(simd_uchar16 __x); -static simd_float2 SIMD_CFUNC simd_float(simd_short2 __x); -static simd_float3 SIMD_CFUNC simd_float(simd_short3 __x); -static simd_float4 SIMD_CFUNC simd_float(simd_short4 __x); -static simd_float8 SIMD_CFUNC simd_float(simd_short8 __x); -static simd_float16 SIMD_CFUNC simd_float(simd_short16 __x); -static simd_float2 SIMD_CFUNC simd_float(simd_ushort2 __x); -static simd_float3 SIMD_CFUNC simd_float(simd_ushort3 __x); -static simd_float4 SIMD_CFUNC simd_float(simd_ushort4 __x); -static simd_float8 SIMD_CFUNC simd_float(simd_ushort8 __x); -static simd_float16 SIMD_CFUNC simd_float(simd_ushort16 __x); -static simd_float2 SIMD_CFUNC simd_float(simd_int2 __x); -static simd_float3 SIMD_CFUNC simd_float(simd_int3 __x); -static simd_float4 SIMD_CFUNC simd_float(simd_int4 __x); -static simd_float8 SIMD_CFUNC simd_float(simd_int8 __x); -static simd_float16 SIMD_CFUNC simd_float(simd_int16 __x); -static simd_float2 SIMD_CFUNC simd_float(simd_uint2 __x); -static simd_float3 SIMD_CFUNC simd_float(simd_uint3 __x); -static simd_float4 SIMD_CFUNC simd_float(simd_uint4 __x); -static simd_float8 SIMD_CFUNC simd_float(simd_uint8 __x); -static simd_float16 SIMD_CFUNC simd_float(simd_uint16 __x); -static simd_float2 SIMD_CFUNC simd_float(simd_float2 __x); -static simd_float3 SIMD_CFUNC simd_float(simd_float3 __x); -static simd_float4 SIMD_CFUNC simd_float(simd_float4 __x); -static simd_float8 SIMD_CFUNC simd_float(simd_float8 __x); -static simd_float16 SIMD_CFUNC simd_float(simd_float16 __x); -static simd_float2 SIMD_CFUNC simd_float(simd_long2 __x); -static simd_float3 SIMD_CFUNC simd_float(simd_long3 __x); -static simd_float4 SIMD_CFUNC simd_float(simd_long4 __x); -static simd_float8 SIMD_CFUNC simd_float(simd_long8 __x); -static simd_float2 SIMD_CFUNC simd_float(simd_ulong2 __x); -static simd_float3 SIMD_CFUNC simd_float(simd_ulong3 __x); -static simd_float4 SIMD_CFUNC simd_float(simd_ulong4 __x); -static simd_float8 SIMD_CFUNC simd_float(simd_ulong8 __x); -static simd_float2 SIMD_CFUNC simd_float(simd_double2 __x); -static simd_float3 SIMD_CFUNC simd_float(simd_double3 __x); -static simd_float4 SIMD_CFUNC simd_float(simd_double4 __x); -static simd_float8 SIMD_CFUNC simd_float(simd_double8 __x); -#define vector_float simd_float - -static simd_long2 SIMD_CFUNC simd_long(simd_char2 __x); -static simd_long3 SIMD_CFUNC simd_long(simd_char3 __x); -static simd_long4 SIMD_CFUNC simd_long(simd_char4 __x); -static simd_long8 SIMD_CFUNC simd_long(simd_char8 __x); -static simd_long2 SIMD_CFUNC simd_long(simd_uchar2 __x); -static simd_long3 SIMD_CFUNC simd_long(simd_uchar3 __x); -static simd_long4 SIMD_CFUNC simd_long(simd_uchar4 __x); -static simd_long8 SIMD_CFUNC simd_long(simd_uchar8 __x); -static simd_long2 SIMD_CFUNC simd_long(simd_short2 __x); -static simd_long3 SIMD_CFUNC simd_long(simd_short3 __x); -static simd_long4 SIMD_CFUNC simd_long(simd_short4 __x); -static simd_long8 SIMD_CFUNC simd_long(simd_short8 __x); -static simd_long2 SIMD_CFUNC simd_long(simd_ushort2 __x); -static simd_long3 SIMD_CFUNC simd_long(simd_ushort3 __x); -static simd_long4 SIMD_CFUNC simd_long(simd_ushort4 __x); -static simd_long8 SIMD_CFUNC simd_long(simd_ushort8 __x); -static simd_long2 SIMD_CFUNC simd_long(simd_int2 __x); -static simd_long3 SIMD_CFUNC simd_long(simd_int3 __x); -static simd_long4 SIMD_CFUNC simd_long(simd_int4 __x); -static simd_long8 SIMD_CFUNC simd_long(simd_int8 __x); -static simd_long2 SIMD_CFUNC simd_long(simd_uint2 __x); -static simd_long3 SIMD_CFUNC simd_long(simd_uint3 __x); -static simd_long4 SIMD_CFUNC simd_long(simd_uint4 __x); -static simd_long8 SIMD_CFUNC simd_long(simd_uint8 __x); -static simd_long2 SIMD_CFUNC simd_long(simd_float2 __x); -static simd_long3 SIMD_CFUNC simd_long(simd_float3 __x); -static simd_long4 SIMD_CFUNC simd_long(simd_float4 __x); -static simd_long8 SIMD_CFUNC simd_long(simd_float8 __x); -static simd_long2 SIMD_CFUNC simd_long(simd_long2 __x); -static simd_long3 SIMD_CFUNC simd_long(simd_long3 __x); -static simd_long4 SIMD_CFUNC simd_long(simd_long4 __x); -static simd_long8 SIMD_CFUNC simd_long(simd_long8 __x); -static simd_long2 SIMD_CFUNC simd_long(simd_ulong2 __x); -static simd_long3 SIMD_CFUNC simd_long(simd_ulong3 __x); -static simd_long4 SIMD_CFUNC simd_long(simd_ulong4 __x); -static simd_long8 SIMD_CFUNC simd_long(simd_ulong8 __x); -static simd_long2 SIMD_CFUNC simd_long(simd_double2 __x); -static simd_long3 SIMD_CFUNC simd_long(simd_double3 __x); -static simd_long4 SIMD_CFUNC simd_long(simd_double4 __x); -static simd_long8 SIMD_CFUNC simd_long(simd_double8 __x); -static simd_long2 SIMD_CFUNC simd_long_sat(simd_char2 __x); -static simd_long3 SIMD_CFUNC simd_long_sat(simd_char3 __x); -static simd_long4 SIMD_CFUNC simd_long_sat(simd_char4 __x); -static simd_long8 SIMD_CFUNC simd_long_sat(simd_char8 __x); -static simd_long2 SIMD_CFUNC simd_long_sat(simd_short2 __x); -static simd_long3 SIMD_CFUNC simd_long_sat(simd_short3 __x); -static simd_long4 SIMD_CFUNC simd_long_sat(simd_short4 __x); -static simd_long8 SIMD_CFUNC simd_long_sat(simd_short8 __x); -static simd_long2 SIMD_CFUNC simd_long_sat(simd_int2 __x); -static simd_long3 SIMD_CFUNC simd_long_sat(simd_int3 __x); -static simd_long4 SIMD_CFUNC simd_long_sat(simd_int4 __x); -static simd_long8 SIMD_CFUNC simd_long_sat(simd_int8 __x); -static simd_long2 SIMD_CFUNC simd_long_sat(simd_float2 __x); -static simd_long3 SIMD_CFUNC simd_long_sat(simd_float3 __x); -static simd_long4 SIMD_CFUNC simd_long_sat(simd_float4 __x); -static simd_long8 SIMD_CFUNC simd_long_sat(simd_float8 __x); -static simd_long2 SIMD_CFUNC simd_long_sat(simd_long2 __x); -static simd_long3 SIMD_CFUNC simd_long_sat(simd_long3 __x); -static simd_long4 SIMD_CFUNC simd_long_sat(simd_long4 __x); -static simd_long8 SIMD_CFUNC simd_long_sat(simd_long8 __x); -static simd_long2 SIMD_CFUNC simd_long_sat(simd_double2 __x); -static simd_long3 SIMD_CFUNC simd_long_sat(simd_double3 __x); -static simd_long4 SIMD_CFUNC simd_long_sat(simd_double4 __x); -static simd_long8 SIMD_CFUNC simd_long_sat(simd_double8 __x); -static simd_long2 SIMD_CFUNC simd_long_sat(simd_uchar2 __x); -static simd_long3 SIMD_CFUNC simd_long_sat(simd_uchar3 __x); -static simd_long4 SIMD_CFUNC simd_long_sat(simd_uchar4 __x); -static simd_long8 SIMD_CFUNC simd_long_sat(simd_uchar8 __x); -static simd_long2 SIMD_CFUNC simd_long_sat(simd_ushort2 __x); -static simd_long3 SIMD_CFUNC simd_long_sat(simd_ushort3 __x); -static simd_long4 SIMD_CFUNC simd_long_sat(simd_ushort4 __x); -static simd_long8 SIMD_CFUNC simd_long_sat(simd_ushort8 __x); -static simd_long2 SIMD_CFUNC simd_long_sat(simd_uint2 __x); -static simd_long3 SIMD_CFUNC simd_long_sat(simd_uint3 __x); -static simd_long4 SIMD_CFUNC simd_long_sat(simd_uint4 __x); -static simd_long8 SIMD_CFUNC simd_long_sat(simd_uint8 __x); -static simd_long2 SIMD_CFUNC simd_long_sat(simd_ulong2 __x); -static simd_long3 SIMD_CFUNC simd_long_sat(simd_ulong3 __x); -static simd_long4 SIMD_CFUNC simd_long_sat(simd_ulong4 __x); -static simd_long8 SIMD_CFUNC simd_long_sat(simd_ulong8 __x); -#define vector_long simd_long -#define vector_long_sat simd_long_sat - -static simd_ulong2 SIMD_CFUNC simd_ulong(simd_char2 __x); -static simd_ulong3 SIMD_CFUNC simd_ulong(simd_char3 __x); -static simd_ulong4 SIMD_CFUNC simd_ulong(simd_char4 __x); -static simd_ulong8 SIMD_CFUNC simd_ulong(simd_char8 __x); -static simd_ulong2 SIMD_CFUNC simd_ulong(simd_uchar2 __x); -static simd_ulong3 SIMD_CFUNC simd_ulong(simd_uchar3 __x); -static simd_ulong4 SIMD_CFUNC simd_ulong(simd_uchar4 __x); -static simd_ulong8 SIMD_CFUNC simd_ulong(simd_uchar8 __x); -static simd_ulong2 SIMD_CFUNC simd_ulong(simd_short2 __x); -static simd_ulong3 SIMD_CFUNC simd_ulong(simd_short3 __x); -static simd_ulong4 SIMD_CFUNC simd_ulong(simd_short4 __x); -static simd_ulong8 SIMD_CFUNC simd_ulong(simd_short8 __x); -static simd_ulong2 SIMD_CFUNC simd_ulong(simd_ushort2 __x); -static simd_ulong3 SIMD_CFUNC simd_ulong(simd_ushort3 __x); -static simd_ulong4 SIMD_CFUNC simd_ulong(simd_ushort4 __x); -static simd_ulong8 SIMD_CFUNC simd_ulong(simd_ushort8 __x); -static simd_ulong2 SIMD_CFUNC simd_ulong(simd_int2 __x); -static simd_ulong3 SIMD_CFUNC simd_ulong(simd_int3 __x); -static simd_ulong4 SIMD_CFUNC simd_ulong(simd_int4 __x); -static simd_ulong8 SIMD_CFUNC simd_ulong(simd_int8 __x); -static simd_ulong2 SIMD_CFUNC simd_ulong(simd_uint2 __x); -static simd_ulong3 SIMD_CFUNC simd_ulong(simd_uint3 __x); -static simd_ulong4 SIMD_CFUNC simd_ulong(simd_uint4 __x); -static simd_ulong8 SIMD_CFUNC simd_ulong(simd_uint8 __x); -static simd_ulong2 SIMD_CFUNC simd_ulong(simd_float2 __x); -static simd_ulong3 SIMD_CFUNC simd_ulong(simd_float3 __x); -static simd_ulong4 SIMD_CFUNC simd_ulong(simd_float4 __x); -static simd_ulong8 SIMD_CFUNC simd_ulong(simd_float8 __x); -static simd_ulong2 SIMD_CFUNC simd_ulong(simd_long2 __x); -static simd_ulong3 SIMD_CFUNC simd_ulong(simd_long3 __x); -static simd_ulong4 SIMD_CFUNC simd_ulong(simd_long4 __x); -static simd_ulong8 SIMD_CFUNC simd_ulong(simd_long8 __x); -static simd_ulong2 SIMD_CFUNC simd_ulong(simd_ulong2 __x); -static simd_ulong3 SIMD_CFUNC simd_ulong(simd_ulong3 __x); -static simd_ulong4 SIMD_CFUNC simd_ulong(simd_ulong4 __x); -static simd_ulong8 SIMD_CFUNC simd_ulong(simd_ulong8 __x); -static simd_ulong2 SIMD_CFUNC simd_ulong(simd_double2 __x); -static simd_ulong3 SIMD_CFUNC simd_ulong(simd_double3 __x); -static simd_ulong4 SIMD_CFUNC simd_ulong(simd_double4 __x); -static simd_ulong8 SIMD_CFUNC simd_ulong(simd_double8 __x); -static simd_ulong2 SIMD_CFUNC simd_ulong_sat(simd_char2 __x); -static simd_ulong3 SIMD_CFUNC simd_ulong_sat(simd_char3 __x); -static simd_ulong4 SIMD_CFUNC simd_ulong_sat(simd_char4 __x); -static simd_ulong8 SIMD_CFUNC simd_ulong_sat(simd_char8 __x); -static simd_ulong2 SIMD_CFUNC simd_ulong_sat(simd_short2 __x); -static simd_ulong3 SIMD_CFUNC simd_ulong_sat(simd_short3 __x); -static simd_ulong4 SIMD_CFUNC simd_ulong_sat(simd_short4 __x); -static simd_ulong8 SIMD_CFUNC simd_ulong_sat(simd_short8 __x); -static simd_ulong2 SIMD_CFUNC simd_ulong_sat(simd_int2 __x); -static simd_ulong3 SIMD_CFUNC simd_ulong_sat(simd_int3 __x); -static simd_ulong4 SIMD_CFUNC simd_ulong_sat(simd_int4 __x); -static simd_ulong8 SIMD_CFUNC simd_ulong_sat(simd_int8 __x); -static simd_ulong2 SIMD_CFUNC simd_ulong_sat(simd_float2 __x); -static simd_ulong3 SIMD_CFUNC simd_ulong_sat(simd_float3 __x); -static simd_ulong4 SIMD_CFUNC simd_ulong_sat(simd_float4 __x); -static simd_ulong8 SIMD_CFUNC simd_ulong_sat(simd_float8 __x); -static simd_ulong2 SIMD_CFUNC simd_ulong_sat(simd_long2 __x); -static simd_ulong3 SIMD_CFUNC simd_ulong_sat(simd_long3 __x); -static simd_ulong4 SIMD_CFUNC simd_ulong_sat(simd_long4 __x); -static simd_ulong8 SIMD_CFUNC simd_ulong_sat(simd_long8 __x); -static simd_ulong2 SIMD_CFUNC simd_ulong_sat(simd_double2 __x); -static simd_ulong3 SIMD_CFUNC simd_ulong_sat(simd_double3 __x); -static simd_ulong4 SIMD_CFUNC simd_ulong_sat(simd_double4 __x); -static simd_ulong8 SIMD_CFUNC simd_ulong_sat(simd_double8 __x); -static simd_ulong2 SIMD_CFUNC simd_ulong_sat(simd_uchar2 __x); -static simd_ulong3 SIMD_CFUNC simd_ulong_sat(simd_uchar3 __x); -static simd_ulong4 SIMD_CFUNC simd_ulong_sat(simd_uchar4 __x); -static simd_ulong8 SIMD_CFUNC simd_ulong_sat(simd_uchar8 __x); -static simd_ulong2 SIMD_CFUNC simd_ulong_sat(simd_ushort2 __x); -static simd_ulong3 SIMD_CFUNC simd_ulong_sat(simd_ushort3 __x); -static simd_ulong4 SIMD_CFUNC simd_ulong_sat(simd_ushort4 __x); -static simd_ulong8 SIMD_CFUNC simd_ulong_sat(simd_ushort8 __x); -static simd_ulong2 SIMD_CFUNC simd_ulong_sat(simd_uint2 __x); -static simd_ulong3 SIMD_CFUNC simd_ulong_sat(simd_uint3 __x); -static simd_ulong4 SIMD_CFUNC simd_ulong_sat(simd_uint4 __x); -static simd_ulong8 SIMD_CFUNC simd_ulong_sat(simd_uint8 __x); -static simd_ulong2 SIMD_CFUNC simd_ulong_sat(simd_ulong2 __x); -static simd_ulong3 SIMD_CFUNC simd_ulong_sat(simd_ulong3 __x); -static simd_ulong4 SIMD_CFUNC simd_ulong_sat(simd_ulong4 __x); -static simd_ulong8 SIMD_CFUNC simd_ulong_sat(simd_ulong8 __x); -#define vector_ulong simd_ulong -#define vector_ulong_sat simd_ulong_sat - -static simd_double2 SIMD_CFUNC simd_double(simd_char2 __x); -static simd_double3 SIMD_CFUNC simd_double(simd_char3 __x); -static simd_double4 SIMD_CFUNC simd_double(simd_char4 __x); -static simd_double8 SIMD_CFUNC simd_double(simd_char8 __x); -static simd_double2 SIMD_CFUNC simd_double(simd_uchar2 __x); -static simd_double3 SIMD_CFUNC simd_double(simd_uchar3 __x); -static simd_double4 SIMD_CFUNC simd_double(simd_uchar4 __x); -static simd_double8 SIMD_CFUNC simd_double(simd_uchar8 __x); -static simd_double2 SIMD_CFUNC simd_double(simd_short2 __x); -static simd_double3 SIMD_CFUNC simd_double(simd_short3 __x); -static simd_double4 SIMD_CFUNC simd_double(simd_short4 __x); -static simd_double8 SIMD_CFUNC simd_double(simd_short8 __x); -static simd_double2 SIMD_CFUNC simd_double(simd_ushort2 __x); -static simd_double3 SIMD_CFUNC simd_double(simd_ushort3 __x); -static simd_double4 SIMD_CFUNC simd_double(simd_ushort4 __x); -static simd_double8 SIMD_CFUNC simd_double(simd_ushort8 __x); -static simd_double2 SIMD_CFUNC simd_double(simd_int2 __x); -static simd_double3 SIMD_CFUNC simd_double(simd_int3 __x); -static simd_double4 SIMD_CFUNC simd_double(simd_int4 __x); -static simd_double8 SIMD_CFUNC simd_double(simd_int8 __x); -static simd_double2 SIMD_CFUNC simd_double(simd_uint2 __x); -static simd_double3 SIMD_CFUNC simd_double(simd_uint3 __x); -static simd_double4 SIMD_CFUNC simd_double(simd_uint4 __x); -static simd_double8 SIMD_CFUNC simd_double(simd_uint8 __x); -static simd_double2 SIMD_CFUNC simd_double(simd_float2 __x); -static simd_double3 SIMD_CFUNC simd_double(simd_float3 __x); -static simd_double4 SIMD_CFUNC simd_double(simd_float4 __x); -static simd_double8 SIMD_CFUNC simd_double(simd_float8 __x); -static simd_double2 SIMD_CFUNC simd_double(simd_long2 __x); -static simd_double3 SIMD_CFUNC simd_double(simd_long3 __x); -static simd_double4 SIMD_CFUNC simd_double(simd_long4 __x); -static simd_double8 SIMD_CFUNC simd_double(simd_long8 __x); -static simd_double2 SIMD_CFUNC simd_double(simd_ulong2 __x); -static simd_double3 SIMD_CFUNC simd_double(simd_ulong3 __x); -static simd_double4 SIMD_CFUNC simd_double(simd_ulong4 __x); -static simd_double8 SIMD_CFUNC simd_double(simd_ulong8 __x); -static simd_double2 SIMD_CFUNC simd_double(simd_double2 __x); -static simd_double3 SIMD_CFUNC simd_double(simd_double3 __x); -static simd_double4 SIMD_CFUNC simd_double(simd_double4 __x); -static simd_double8 SIMD_CFUNC simd_double(simd_double8 __x); -#define vector_double simd_double - -static simd_char2 SIMD_CFUNC vector2(char __x, char __y) { return ( simd_char2){__x, __y}; } -static simd_uchar2 SIMD_CFUNC vector2(unsigned char __x, unsigned char __y) { return ( simd_uchar2){__x, __y}; } -static simd_short2 SIMD_CFUNC vector2(short __x, short __y) { return ( simd_short2){__x, __y}; } -static simd_ushort2 SIMD_CFUNC vector2(unsigned short __x, unsigned short __y) { return (simd_ushort2){__x, __y}; } -static simd_int2 SIMD_CFUNC vector2(int __x, int __y) { return ( simd_int2){__x, __y}; } -static simd_uint2 SIMD_CFUNC vector2(unsigned int __x, unsigned int __y) { return ( simd_uint2){__x, __y}; } -static simd_float2 SIMD_CFUNC vector2(float __x, float __y) { return ( simd_float2){__x, __y}; } -static simd_long2 SIMD_CFUNC vector2(simd_long1 __x, simd_long1 __y) { return ( simd_long2){__x, __y}; } -static simd_ulong2 SIMD_CFUNC vector2(simd_ulong1 __x, simd_ulong1 __y) { return ( simd_ulong2){__x, __y}; } -static simd_double2 SIMD_CFUNC vector2(double __x, double __y) { return (simd_double2){__x, __y}; } - -static simd_char3 SIMD_CFUNC vector3(char __x, char __y, char __z) { return ( simd_char3){__x, __y, __z}; } -static simd_uchar3 SIMD_CFUNC vector3(unsigned char __x, unsigned char __y, unsigned char __z) { return ( simd_uchar3){__x, __y, __z}; } -static simd_short3 SIMD_CFUNC vector3(short __x, short __y, short __z) { return ( simd_short3){__x, __y, __z}; } -static simd_ushort3 SIMD_CFUNC vector3(unsigned short __x, unsigned short __y, unsigned short __z) { return (simd_ushort3){__x, __y, __z}; } -static simd_int3 SIMD_CFUNC vector3(int __x, int __y, int __z) { return ( simd_int3){__x, __y, __z}; } -static simd_uint3 SIMD_CFUNC vector3(unsigned int __x, unsigned int __y, unsigned int __z) { return ( simd_uint3){__x, __y, __z}; } -static simd_float3 SIMD_CFUNC vector3(float __x, float __y, float __z) { return ( simd_float3){__x, __y, __z}; } -static simd_long3 SIMD_CFUNC vector3(simd_long1 __x, simd_long1 __y, simd_long1 __z) { return ( simd_long3){__x, __y, __z}; } -static simd_ulong3 SIMD_CFUNC vector3(simd_ulong1 __x, simd_ulong1 __y, simd_ulong1 __z) { return ( simd_ulong3){__x, __y, __z}; } -static simd_double3 SIMD_CFUNC vector3(double __x, double __y, double __z) { return (simd_double3){__x, __y, __z}; } - -static simd_char3 SIMD_CFUNC vector3(simd_char2 __xy, char __z) { simd_char3 __r; __r.xy = __xy; __r.z = __z; return __r; } -static simd_uchar3 SIMD_CFUNC vector3(simd_uchar2 __xy, unsigned char __z) { simd_uchar3 __r; __r.xy = __xy; __r.z = __z; return __r; } -static simd_short3 SIMD_CFUNC vector3(simd_short2 __xy, short __z) { simd_short3 __r; __r.xy = __xy; __r.z = __z; return __r; } -static simd_ushort3 SIMD_CFUNC vector3(simd_ushort2 __xy, unsigned short __z) { simd_ushort3 __r; __r.xy = __xy; __r.z = __z; return __r; } -static simd_int3 SIMD_CFUNC vector3(simd_int2 __xy, int __z) { simd_int3 __r; __r.xy = __xy; __r.z = __z; return __r; } -static simd_uint3 SIMD_CFUNC vector3(simd_uint2 __xy, unsigned int __z) { simd_uint3 __r; __r.xy = __xy; __r.z = __z; return __r; } -static simd_float3 SIMD_CFUNC vector3(simd_float2 __xy, float __z) { simd_float3 __r; __r.xy = __xy; __r.z = __z; return __r; } -static simd_long3 SIMD_CFUNC vector3(simd_long2 __xy, simd_long1 __z) { simd_long3 __r; __r.xy = __xy; __r.z = __z; return __r; } -static simd_ulong3 SIMD_CFUNC vector3(simd_ulong2 __xy, simd_ulong1 __z) { simd_ulong3 __r; __r.xy = __xy; __r.z = __z; return __r; } -static simd_double3 SIMD_CFUNC vector3(simd_double2 __xy, double __z) { simd_double3 __r; __r.xy = __xy; __r.z = __z; return __r; } - -static simd_char4 SIMD_CFUNC vector4(char __x, char __y, char __z, char __w) { return ( simd_char4){__x, __y, __z, __w}; } -static simd_uchar4 SIMD_CFUNC vector4(unsigned char __x, unsigned char __y, unsigned char __z, unsigned char __w) { return ( simd_uchar4){__x, __y, __z, __w}; } -static simd_short4 SIMD_CFUNC vector4(short __x, short __y, short __z, short __w) { return ( simd_short4){__x, __y, __z, __w}; } -static simd_ushort4 SIMD_CFUNC vector4(unsigned short __x, unsigned short __y, unsigned short __z, unsigned short __w) { return (simd_ushort4){__x, __y, __z, __w}; } -static simd_int4 SIMD_CFUNC vector4(int __x, int __y, int __z, int __w) { return ( simd_int4){__x, __y, __z, __w}; } -static simd_uint4 SIMD_CFUNC vector4(unsigned int __x, unsigned int __y, unsigned int __z, unsigned int __w) { return ( simd_uint4){__x, __y, __z, __w}; } -static simd_float4 SIMD_CFUNC vector4(float __x, float __y, float __z, float __w) { return ( simd_float4){__x, __y, __z, __w}; } -static simd_long4 SIMD_CFUNC vector4(simd_long1 __x, simd_long1 __y, simd_long1 __z, simd_long1 __w) { return ( simd_long4){__x, __y, __z, __w}; } -static simd_ulong4 SIMD_CFUNC vector4(simd_ulong1 __x, simd_ulong1 __y, simd_ulong1 __z, simd_ulong1 __w) { return ( simd_ulong4){__x, __y, __z, __w}; } -static simd_double4 SIMD_CFUNC vector4(double __x, double __y, double __z, double __w) { return (simd_double4){__x, __y, __z, __w}; } - -static simd_char4 SIMD_CFUNC vector4(simd_char2 __xy, simd_char2 __zw) { simd_char4 __r; __r.xy = __xy; __r.zw = __zw; return __r; } -static simd_uchar4 SIMD_CFUNC vector4(simd_uchar2 __xy, simd_uchar2 __zw) { simd_uchar4 __r; __r.xy = __xy; __r.zw = __zw; return __r; } -static simd_short4 SIMD_CFUNC vector4(simd_short2 __xy, simd_short2 __zw) { simd_short4 __r; __r.xy = __xy; __r.zw = __zw; return __r; } -static simd_ushort4 SIMD_CFUNC vector4(simd_ushort2 __xy, simd_ushort2 __zw) { simd_ushort4 __r; __r.xy = __xy; __r.zw = __zw; return __r; } -static simd_int4 SIMD_CFUNC vector4(simd_int2 __xy, simd_int2 __zw) { simd_int4 __r; __r.xy = __xy; __r.zw = __zw; return __r; } -static simd_uint4 SIMD_CFUNC vector4(simd_uint2 __xy, simd_uint2 __zw) { simd_uint4 __r; __r.xy = __xy; __r.zw = __zw; return __r; } -static simd_float4 SIMD_CFUNC vector4(simd_float2 __xy, simd_float2 __zw) { simd_float4 __r; __r.xy = __xy; __r.zw = __zw; return __r; } -static simd_long4 SIMD_CFUNC vector4(simd_long2 __xy, simd_long2 __zw) { simd_long4 __r; __r.xy = __xy; __r.zw = __zw; return __r; } -static simd_ulong4 SIMD_CFUNC vector4(simd_ulong2 __xy, simd_ulong2 __zw) { simd_ulong4 __r; __r.xy = __xy; __r.zw = __zw; return __r; } -static simd_double4 SIMD_CFUNC vector4(simd_double2 __xy, simd_double2 __zw) { simd_double4 __r; __r.xy = __xy; __r.zw = __zw; return __r; } - -static simd_char4 SIMD_CFUNC vector4(simd_char3 __xyz, char __w) { simd_char4 __r; __r.xyz = __xyz; __r.w = __w; return __r; } -static simd_uchar4 SIMD_CFUNC vector4(simd_uchar3 __xyz, unsigned char __w) { simd_uchar4 __r; __r.xyz = __xyz; __r.w = __w; return __r; } -static simd_short4 SIMD_CFUNC vector4(simd_short3 __xyz, short __w) { simd_short4 __r; __r.xyz = __xyz; __r.w = __w; return __r; } -static simd_ushort4 SIMD_CFUNC vector4(simd_ushort3 __xyz, unsigned short __w) { simd_ushort4 __r; __r.xyz = __xyz; __r.w = __w; return __r; } -static simd_int4 SIMD_CFUNC vector4(simd_int3 __xyz, int __w) { simd_int4 __r; __r.xyz = __xyz; __r.w = __w; return __r; } -static simd_uint4 SIMD_CFUNC vector4(simd_uint3 __xyz, unsigned int __w) { simd_uint4 __r; __r.xyz = __xyz; __r.w = __w; return __r; } -static simd_float4 SIMD_CFUNC vector4(simd_float3 __xyz, float __w) { simd_float4 __r; __r.xyz = __xyz; __r.w = __w; return __r; } -static simd_long4 SIMD_CFUNC vector4(simd_long3 __xyz, simd_long1 __w) { simd_long4 __r; __r.xyz = __xyz; __r.w = __w; return __r; } -static simd_ulong4 SIMD_CFUNC vector4(simd_ulong3 __xyz, simd_ulong1 __w) { simd_ulong4 __r; __r.xyz = __xyz; __r.w = __w; return __r; } -static simd_double4 SIMD_CFUNC vector4(simd_double3 __xyz, double __w) { simd_double4 __r; __r.xyz = __xyz; __r.w = __w; return __r; } - -static simd_char8 SIMD_CFUNC vector8(simd_char4 __lo, simd_char4 __hi) { simd_char8 __r; __r.lo = __lo; __r.hi = __hi; return __r; } -static simd_uchar8 SIMD_CFUNC vector8(simd_uchar4 __lo, simd_uchar4 __hi) { simd_uchar8 __r; __r.lo = __lo; __r.hi = __hi; return __r; } -static simd_short8 SIMD_CFUNC vector8(simd_short4 __lo, simd_short4 __hi) { simd_short8 __r; __r.lo = __lo; __r.hi = __hi; return __r; } -static simd_ushort8 SIMD_CFUNC vector8(simd_ushort4 __lo, simd_ushort4 __hi) { simd_ushort8 __r; __r.lo = __lo; __r.hi = __hi; return __r; } -static simd_int8 SIMD_CFUNC vector8(simd_int4 __lo, simd_int4 __hi) { simd_int8 __r; __r.lo = __lo; __r.hi = __hi; return __r; } -static simd_uint8 SIMD_CFUNC vector8(simd_uint4 __lo, simd_uint4 __hi) { simd_uint8 __r; __r.lo = __lo; __r.hi = __hi; return __r; } -static simd_float8 SIMD_CFUNC vector8(simd_float4 __lo, simd_float4 __hi) { simd_float8 __r; __r.lo = __lo; __r.hi = __hi; return __r; } -static simd_long8 SIMD_CFUNC vector8(simd_long4 __lo, simd_long4 __hi) { simd_long8 __r; __r.lo = __lo; __r.hi = __hi; return __r; } -static simd_ulong8 SIMD_CFUNC vector8(simd_ulong4 __lo, simd_ulong4 __hi) { simd_ulong8 __r; __r.lo = __lo; __r.hi = __hi; return __r; } -static simd_double8 SIMD_CFUNC vector8(simd_double4 __lo, simd_double4 __hi) { simd_double8 __r; __r.lo = __lo; __r.hi = __hi; return __r; } - -static simd_char16 SIMD_CFUNC vector16(simd_char8 __lo, simd_char8 __hi) { simd_char16 __r; __r.lo = __lo; __r.hi = __hi; return __r; } -static simd_uchar16 SIMD_CFUNC vector16(simd_uchar8 __lo, simd_uchar8 __hi) { simd_uchar16 __r; __r.lo = __lo; __r.hi = __hi; return __r; } -static simd_short16 SIMD_CFUNC vector16(simd_short8 __lo, simd_short8 __hi) { simd_short16 __r; __r.lo = __lo; __r.hi = __hi; return __r; } -static simd_ushort16 SIMD_CFUNC vector16(simd_ushort8 __lo, simd_ushort8 __hi) { simd_ushort16 __r; __r.lo = __lo; __r.hi = __hi; return __r; } -static simd_int16 SIMD_CFUNC vector16(simd_int8 __lo, simd_int8 __hi) { simd_int16 __r; __r.lo = __lo; __r.hi = __hi; return __r; } -static simd_uint16 SIMD_CFUNC vector16(simd_uint8 __lo, simd_uint8 __hi) { simd_uint16 __r; __r.lo = __lo; __r.hi = __hi; return __r; } -static simd_float16 SIMD_CFUNC vector16(simd_float8 __lo, simd_float8 __hi) { simd_float16 __r; __r.lo = __lo; __r.hi = __hi; return __r; } - -static simd_char32 SIMD_CFUNC vector32(simd_char16 __lo, simd_char16 __hi) { simd_char32 __r; __r.lo = __lo; __r.hi = __hi; return __r; } -static simd_uchar32 SIMD_CFUNC vector32(simd_uchar16 __lo, simd_uchar16 __hi) { simd_uchar32 __r; __r.lo = __lo; __r.hi = __hi; return __r; } -static simd_short32 SIMD_CFUNC vector32(simd_short16 __lo, simd_short16 __hi) { simd_short32 __r; __r.lo = __lo; __r.hi = __hi; return __r; } -static simd_ushort32 SIMD_CFUNC vector32(simd_ushort16 __lo, simd_ushort16 __hi) { simd_ushort32 __r; __r.lo = __lo; __r.hi = __hi; return __r; } - -#pragma mark - Implementation - -static simd_char2 SIMD_CFUNC simd_char(simd_char2 __x) { return __x; } -static simd_char3 SIMD_CFUNC simd_char(simd_char3 __x) { return __x; } -static simd_char4 SIMD_CFUNC simd_char(simd_char4 __x) { return __x; } -static simd_char8 SIMD_CFUNC simd_char(simd_char8 __x) { return __x; } -static simd_char16 SIMD_CFUNC simd_char(simd_char16 __x) { return __x; } -static simd_char32 SIMD_CFUNC simd_char(simd_char32 __x) { return __x; } -static simd_char2 SIMD_CFUNC simd_char(simd_uchar2 __x) { return (simd_char2)__x; } -static simd_char3 SIMD_CFUNC simd_char(simd_uchar3 __x) { return (simd_char3)__x; } -static simd_char4 SIMD_CFUNC simd_char(simd_uchar4 __x) { return (simd_char4)__x; } -static simd_char8 SIMD_CFUNC simd_char(simd_uchar8 __x) { return (simd_char8)__x; } -static simd_char16 SIMD_CFUNC simd_char(simd_uchar16 __x) { return (simd_char16)__x; } -static simd_char32 SIMD_CFUNC simd_char(simd_uchar32 __x) { return (simd_char32)__x; } -static simd_char2 SIMD_CFUNC simd_char(simd_short2 __x) { return __builtin_convertvector(__x & 0xff, simd_char2); } -static simd_char3 SIMD_CFUNC simd_char(simd_short3 __x) { return __builtin_convertvector(__x & 0xff, simd_char3); } -static simd_char4 SIMD_CFUNC simd_char(simd_short4 __x) { return __builtin_convertvector(__x & 0xff, simd_char4); } -static simd_char8 SIMD_CFUNC simd_char(simd_short8 __x) { return __builtin_convertvector(__x & 0xff, simd_char8); } -static simd_char16 SIMD_CFUNC simd_char(simd_short16 __x) { return __builtin_convertvector(__x & 0xff, simd_char16); } -static simd_char32 SIMD_CFUNC simd_char(simd_short32 __x) { return __builtin_convertvector(__x & 0xff, simd_char32); } -static simd_char2 SIMD_CFUNC simd_char(simd_ushort2 __x) { return simd_char(simd_short(__x)); } -static simd_char3 SIMD_CFUNC simd_char(simd_ushort3 __x) { return simd_char(simd_short(__x)); } -static simd_char4 SIMD_CFUNC simd_char(simd_ushort4 __x) { return simd_char(simd_short(__x)); } -static simd_char8 SIMD_CFUNC simd_char(simd_ushort8 __x) { return simd_char(simd_short(__x)); } -static simd_char16 SIMD_CFUNC simd_char(simd_ushort16 __x) { return simd_char(simd_short(__x)); } -static simd_char32 SIMD_CFUNC simd_char(simd_ushort32 __x) { return simd_char(simd_short(__x)); } -static simd_char2 SIMD_CFUNC simd_char(simd_int2 __x) { return simd_char(simd_short(__x)); } -static simd_char3 SIMD_CFUNC simd_char(simd_int3 __x) { return simd_char(simd_short(__x)); } -static simd_char4 SIMD_CFUNC simd_char(simd_int4 __x) { return simd_char(simd_short(__x)); } -static simd_char8 SIMD_CFUNC simd_char(simd_int8 __x) { return simd_char(simd_short(__x)); } -static simd_char16 SIMD_CFUNC simd_char(simd_int16 __x) { return simd_char(simd_short(__x)); } -static simd_char2 SIMD_CFUNC simd_char(simd_uint2 __x) { return simd_char(simd_short(__x)); } -static simd_char3 SIMD_CFUNC simd_char(simd_uint3 __x) { return simd_char(simd_short(__x)); } -static simd_char4 SIMD_CFUNC simd_char(simd_uint4 __x) { return simd_char(simd_short(__x)); } -static simd_char8 SIMD_CFUNC simd_char(simd_uint8 __x) { return simd_char(simd_short(__x)); } -static simd_char16 SIMD_CFUNC simd_char(simd_uint16 __x) { return simd_char(simd_short(__x)); } -static simd_char2 SIMD_CFUNC simd_char(simd_float2 __x) { return simd_char(simd_short(__x)); } -static simd_char3 SIMD_CFUNC simd_char(simd_float3 __x) { return simd_char(simd_short(__x)); } -static simd_char4 SIMD_CFUNC simd_char(simd_float4 __x) { return simd_char(simd_short(__x)); } -static simd_char8 SIMD_CFUNC simd_char(simd_float8 __x) { return simd_char(simd_short(__x)); } -static simd_char16 SIMD_CFUNC simd_char(simd_float16 __x) { return simd_char(simd_short(__x)); } -static simd_char2 SIMD_CFUNC simd_char(simd_long2 __x) { return simd_char(simd_short(__x)); } -static simd_char3 SIMD_CFUNC simd_char(simd_long3 __x) { return simd_char(simd_short(__x)); } -static simd_char4 SIMD_CFUNC simd_char(simd_long4 __x) { return simd_char(simd_short(__x)); } -static simd_char8 SIMD_CFUNC simd_char(simd_long8 __x) { return simd_char(simd_short(__x)); } -static simd_char2 SIMD_CFUNC simd_char(simd_ulong2 __x) { return simd_char(simd_short(__x)); } -static simd_char3 SIMD_CFUNC simd_char(simd_ulong3 __x) { return simd_char(simd_short(__x)); } -static simd_char4 SIMD_CFUNC simd_char(simd_ulong4 __x) { return simd_char(simd_short(__x)); } -static simd_char8 SIMD_CFUNC simd_char(simd_ulong8 __x) { return simd_char(simd_short(__x)); } -static simd_char2 SIMD_CFUNC simd_char(simd_double2 __x) { return simd_char(simd_short(__x)); } -static simd_char3 SIMD_CFUNC simd_char(simd_double3 __x) { return simd_char(simd_short(__x)); } -static simd_char4 SIMD_CFUNC simd_char(simd_double4 __x) { return simd_char(simd_short(__x)); } -static simd_char8 SIMD_CFUNC simd_char(simd_double8 __x) { return simd_char(simd_short(__x)); } - -static simd_char2 SIMD_CFUNC simd_char_sat(simd_char2 __x) { return __x; } -static simd_char3 SIMD_CFUNC simd_char_sat(simd_char3 __x) { return __x; } -static simd_char4 SIMD_CFUNC simd_char_sat(simd_char4 __x) { return __x; } -static simd_char8 SIMD_CFUNC simd_char_sat(simd_char8 __x) { return __x; } -static simd_char16 SIMD_CFUNC simd_char_sat(simd_char16 __x) { return __x; } -static simd_char32 SIMD_CFUNC simd_char_sat(simd_char32 __x) { return __x; } -static simd_char2 SIMD_CFUNC simd_char_sat(simd_short2 __x) { return simd_char(simd_clamp(__x,-0x80,0x7f)); } -static simd_char3 SIMD_CFUNC simd_char_sat(simd_short3 __x) { return simd_char(simd_clamp(__x,-0x80,0x7f)); } -static simd_char4 SIMD_CFUNC simd_char_sat(simd_short4 __x) { return simd_char(simd_clamp(__x,-0x80,0x7f)); } -static simd_char8 SIMD_CFUNC simd_char_sat(simd_short8 __x) { return simd_char(simd_clamp(__x,-0x80,0x7f)); } -static simd_char16 SIMD_CFUNC simd_char_sat(simd_short16 __x) { return simd_char(simd_clamp(__x,-0x80,0x7f)); } -static simd_char32 SIMD_CFUNC simd_char_sat(simd_short32 __x) { return simd_char(simd_clamp(__x,-0x80,0x7f)); } -static simd_char2 SIMD_CFUNC simd_char_sat(simd_int2 __x) { return simd_char(simd_clamp(__x,-0x80,0x7f)); } -static simd_char3 SIMD_CFUNC simd_char_sat(simd_int3 __x) { return simd_char(simd_clamp(__x,-0x80,0x7f)); } -static simd_char4 SIMD_CFUNC simd_char_sat(simd_int4 __x) { return simd_char(simd_clamp(__x,-0x80,0x7f)); } -static simd_char8 SIMD_CFUNC simd_char_sat(simd_int8 __x) { return simd_char(simd_clamp(__x,-0x80,0x7f)); } -static simd_char16 SIMD_CFUNC simd_char_sat(simd_int16 __x) { return simd_char(simd_clamp(__x,-0x80,0x7f)); } -static simd_char2 SIMD_CFUNC simd_char_sat(simd_float2 __x) { return simd_char(simd_clamp(__x,-0x80,0x7f)); } -static simd_char3 SIMD_CFUNC simd_char_sat(simd_float3 __x) { return simd_char(simd_clamp(__x,-0x80,0x7f)); } -static simd_char4 SIMD_CFUNC simd_char_sat(simd_float4 __x) { return simd_char(simd_clamp(__x,-0x80,0x7f)); } -static simd_char8 SIMD_CFUNC simd_char_sat(simd_float8 __x) { return simd_char(simd_clamp(__x,-0x80,0x7f)); } -static simd_char16 SIMD_CFUNC simd_char_sat(simd_float16 __x) { return simd_char(simd_clamp(__x,-0x80,0x7f)); } -static simd_char2 SIMD_CFUNC simd_char_sat(simd_long2 __x) { return simd_char(simd_clamp(__x,-0x80,0x7f)); } -static simd_char3 SIMD_CFUNC simd_char_sat(simd_long3 __x) { return simd_char(simd_clamp(__x,-0x80,0x7f)); } -static simd_char4 SIMD_CFUNC simd_char_sat(simd_long4 __x) { return simd_char(simd_clamp(__x,-0x80,0x7f)); } -static simd_char8 SIMD_CFUNC simd_char_sat(simd_long8 __x) { return simd_char(simd_clamp(__x,-0x80,0x7f)); } -static simd_char2 SIMD_CFUNC simd_char_sat(simd_double2 __x) { return simd_char(simd_clamp(__x,-0x80,0x7f)); } -static simd_char3 SIMD_CFUNC simd_char_sat(simd_double3 __x) { return simd_char(simd_clamp(__x,-0x80,0x7f)); } -static simd_char4 SIMD_CFUNC simd_char_sat(simd_double4 __x) { return simd_char(simd_clamp(__x,-0x80,0x7f)); } -static simd_char8 SIMD_CFUNC simd_char_sat(simd_double8 __x) { return simd_char(simd_clamp(__x,-0x80,0x7f)); } -static simd_char2 SIMD_CFUNC simd_char_sat(simd_uchar2 __x) { return simd_char(simd_min(__x,0x7f)); } -static simd_char3 SIMD_CFUNC simd_char_sat(simd_uchar3 __x) { return simd_char(simd_min(__x,0x7f)); } -static simd_char4 SIMD_CFUNC simd_char_sat(simd_uchar4 __x) { return simd_char(simd_min(__x,0x7f)); } -static simd_char8 SIMD_CFUNC simd_char_sat(simd_uchar8 __x) { return simd_char(simd_min(__x,0x7f)); } -static simd_char16 SIMD_CFUNC simd_char_sat(simd_uchar16 __x) { return simd_char(simd_min(__x,0x7f)); } -static simd_char32 SIMD_CFUNC simd_char_sat(simd_uchar32 __x) { return simd_char(simd_min(__x,0x7f)); } -static simd_char2 SIMD_CFUNC simd_char_sat(simd_ushort2 __x) { return simd_char(simd_min(__x,0x7f)); } -static simd_char3 SIMD_CFUNC simd_char_sat(simd_ushort3 __x) { return simd_char(simd_min(__x,0x7f)); } -static simd_char4 SIMD_CFUNC simd_char_sat(simd_ushort4 __x) { return simd_char(simd_min(__x,0x7f)); } -static simd_char8 SIMD_CFUNC simd_char_sat(simd_ushort8 __x) { return simd_char(simd_min(__x,0x7f)); } -static simd_char16 SIMD_CFUNC simd_char_sat(simd_ushort16 __x) { return simd_char(simd_min(__x,0x7f)); } -static simd_char32 SIMD_CFUNC simd_char_sat(simd_ushort32 __x) { return simd_char(simd_min(__x,0x7f)); } -static simd_char2 SIMD_CFUNC simd_char_sat(simd_uint2 __x) { return simd_char(simd_min(__x,0x7f)); } -static simd_char3 SIMD_CFUNC simd_char_sat(simd_uint3 __x) { return simd_char(simd_min(__x,0x7f)); } -static simd_char4 SIMD_CFUNC simd_char_sat(simd_uint4 __x) { return simd_char(simd_min(__x,0x7f)); } -static simd_char8 SIMD_CFUNC simd_char_sat(simd_uint8 __x) { return simd_char(simd_min(__x,0x7f)); } -static simd_char16 SIMD_CFUNC simd_char_sat(simd_uint16 __x) { return simd_char(simd_min(__x,0x7f)); } -static simd_char2 SIMD_CFUNC simd_char_sat(simd_ulong2 __x) { return simd_char(simd_min(__x,0x7f)); } -static simd_char3 SIMD_CFUNC simd_char_sat(simd_ulong3 __x) { return simd_char(simd_min(__x,0x7f)); } -static simd_char4 SIMD_CFUNC simd_char_sat(simd_ulong4 __x) { return simd_char(simd_min(__x,0x7f)); } -static simd_char8 SIMD_CFUNC simd_char_sat(simd_ulong8 __x) { return simd_char(simd_min(__x,0x7f)); } - -static simd_uchar2 SIMD_CFUNC simd_uchar(simd_char2 __x) { return (simd_uchar2)__x; } -static simd_uchar3 SIMD_CFUNC simd_uchar(simd_char3 __x) { return (simd_uchar3)__x; } -static simd_uchar4 SIMD_CFUNC simd_uchar(simd_char4 __x) { return (simd_uchar4)__x; } -static simd_uchar8 SIMD_CFUNC simd_uchar(simd_char8 __x) { return (simd_uchar8)__x; } -static simd_uchar16 SIMD_CFUNC simd_uchar(simd_char16 __x) { return (simd_uchar16)__x; } -static simd_uchar32 SIMD_CFUNC simd_uchar(simd_char32 __x) { return (simd_uchar32)__x; } -static simd_uchar2 SIMD_CFUNC simd_uchar(simd_uchar2 __x) { return __x; } -static simd_uchar3 SIMD_CFUNC simd_uchar(simd_uchar3 __x) { return __x; } -static simd_uchar4 SIMD_CFUNC simd_uchar(simd_uchar4 __x) { return __x; } -static simd_uchar8 SIMD_CFUNC simd_uchar(simd_uchar8 __x) { return __x; } -static simd_uchar16 SIMD_CFUNC simd_uchar(simd_uchar16 __x) { return __x; } -static simd_uchar32 SIMD_CFUNC simd_uchar(simd_uchar32 __x) { return __x; } -static simd_uchar2 SIMD_CFUNC simd_uchar(simd_short2 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar3 SIMD_CFUNC simd_uchar(simd_short3 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar4 SIMD_CFUNC simd_uchar(simd_short4 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar8 SIMD_CFUNC simd_uchar(simd_short8 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar16 SIMD_CFUNC simd_uchar(simd_short16 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar32 SIMD_CFUNC simd_uchar(simd_short32 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar2 SIMD_CFUNC simd_uchar(simd_ushort2 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar3 SIMD_CFUNC simd_uchar(simd_ushort3 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar4 SIMD_CFUNC simd_uchar(simd_ushort4 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar8 SIMD_CFUNC simd_uchar(simd_ushort8 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar16 SIMD_CFUNC simd_uchar(simd_ushort16 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar32 SIMD_CFUNC simd_uchar(simd_ushort32 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar2 SIMD_CFUNC simd_uchar(simd_int2 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar3 SIMD_CFUNC simd_uchar(simd_int3 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar4 SIMD_CFUNC simd_uchar(simd_int4 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar8 SIMD_CFUNC simd_uchar(simd_int8 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar16 SIMD_CFUNC simd_uchar(simd_int16 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar2 SIMD_CFUNC simd_uchar(simd_uint2 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar3 SIMD_CFUNC simd_uchar(simd_uint3 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar4 SIMD_CFUNC simd_uchar(simd_uint4 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar8 SIMD_CFUNC simd_uchar(simd_uint8 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar16 SIMD_CFUNC simd_uchar(simd_uint16 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar2 SIMD_CFUNC simd_uchar(simd_float2 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar3 SIMD_CFUNC simd_uchar(simd_float3 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar4 SIMD_CFUNC simd_uchar(simd_float4 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar8 SIMD_CFUNC simd_uchar(simd_float8 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar16 SIMD_CFUNC simd_uchar(simd_float16 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar2 SIMD_CFUNC simd_uchar(simd_long2 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar3 SIMD_CFUNC simd_uchar(simd_long3 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar4 SIMD_CFUNC simd_uchar(simd_long4 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar8 SIMD_CFUNC simd_uchar(simd_long8 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar2 SIMD_CFUNC simd_uchar(simd_ulong2 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar3 SIMD_CFUNC simd_uchar(simd_ulong3 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar4 SIMD_CFUNC simd_uchar(simd_ulong4 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar8 SIMD_CFUNC simd_uchar(simd_ulong8 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar2 SIMD_CFUNC simd_uchar(simd_double2 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar3 SIMD_CFUNC simd_uchar(simd_double3 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar4 SIMD_CFUNC simd_uchar(simd_double4 __x) { return simd_uchar(simd_char(__x)); } -static simd_uchar8 SIMD_CFUNC simd_uchar(simd_double8 __x) { return simd_uchar(simd_char(__x)); } - -static simd_uchar2 SIMD_CFUNC simd_uchar_sat(simd_char2 __x) { return simd_uchar(simd_max(0,__x)); } -static simd_uchar3 SIMD_CFUNC simd_uchar_sat(simd_char3 __x) { return simd_uchar(simd_max(0,__x)); } -static simd_uchar4 SIMD_CFUNC simd_uchar_sat(simd_char4 __x) { return simd_uchar(simd_max(0,__x)); } -static simd_uchar8 SIMD_CFUNC simd_uchar_sat(simd_char8 __x) { return simd_uchar(simd_max(0,__x)); } -static simd_uchar16 SIMD_CFUNC simd_uchar_sat(simd_char16 __x) { return simd_uchar(simd_max(0,__x)); } -static simd_uchar32 SIMD_CFUNC simd_uchar_sat(simd_char32 __x) { return simd_uchar(simd_max(0,__x)); } -static simd_uchar2 SIMD_CFUNC simd_uchar_sat(simd_short2 __x) { return simd_uchar(simd_clamp(__x,0,0xff)); } -static simd_uchar3 SIMD_CFUNC simd_uchar_sat(simd_short3 __x) { return simd_uchar(simd_clamp(__x,0,0xff)); } -static simd_uchar4 SIMD_CFUNC simd_uchar_sat(simd_short4 __x) { return simd_uchar(simd_clamp(__x,0,0xff)); } -static simd_uchar8 SIMD_CFUNC simd_uchar_sat(simd_short8 __x) { return simd_uchar(simd_clamp(__x,0,0xff)); } -static simd_uchar16 SIMD_CFUNC simd_uchar_sat(simd_short16 __x) { return simd_uchar(simd_clamp(__x,0,0xff)); } -static simd_uchar32 SIMD_CFUNC simd_uchar_sat(simd_short32 __x) { return simd_uchar(simd_clamp(__x,0,0xff)); } -static simd_uchar2 SIMD_CFUNC simd_uchar_sat(simd_int2 __x) { return simd_uchar(simd_clamp(__x,0,0xff)); } -static simd_uchar3 SIMD_CFUNC simd_uchar_sat(simd_int3 __x) { return simd_uchar(simd_clamp(__x,0,0xff)); } -static simd_uchar4 SIMD_CFUNC simd_uchar_sat(simd_int4 __x) { return simd_uchar(simd_clamp(__x,0,0xff)); } -static simd_uchar8 SIMD_CFUNC simd_uchar_sat(simd_int8 __x) { return simd_uchar(simd_clamp(__x,0,0xff)); } -static simd_uchar16 SIMD_CFUNC simd_uchar_sat(simd_int16 __x) { return simd_uchar(simd_clamp(__x,0,0xff)); } -static simd_uchar2 SIMD_CFUNC simd_uchar_sat(simd_float2 __x) { return simd_uchar(simd_clamp(__x,0,0xff)); } -static simd_uchar3 SIMD_CFUNC simd_uchar_sat(simd_float3 __x) { return simd_uchar(simd_clamp(__x,0,0xff)); } -static simd_uchar4 SIMD_CFUNC simd_uchar_sat(simd_float4 __x) { return simd_uchar(simd_clamp(__x,0,0xff)); } -static simd_uchar8 SIMD_CFUNC simd_uchar_sat(simd_float8 __x) { return simd_uchar(simd_clamp(__x,0,0xff)); } -static simd_uchar16 SIMD_CFUNC simd_uchar_sat(simd_float16 __x) { return simd_uchar(simd_clamp(__x,0,0xff)); } -static simd_uchar2 SIMD_CFUNC simd_uchar_sat(simd_long2 __x) { return simd_uchar(simd_clamp(__x,0,0xff)); } -static simd_uchar3 SIMD_CFUNC simd_uchar_sat(simd_long3 __x) { return simd_uchar(simd_clamp(__x,0,0xff)); } -static simd_uchar4 SIMD_CFUNC simd_uchar_sat(simd_long4 __x) { return simd_uchar(simd_clamp(__x,0,0xff)); } -static simd_uchar8 SIMD_CFUNC simd_uchar_sat(simd_long8 __x) { return simd_uchar(simd_clamp(__x,0,0xff)); } -static simd_uchar2 SIMD_CFUNC simd_uchar_sat(simd_double2 __x) { return simd_uchar(simd_clamp(__x,0,0xff)); } -static simd_uchar3 SIMD_CFUNC simd_uchar_sat(simd_double3 __x) { return simd_uchar(simd_clamp(__x,0,0xff)); } -static simd_uchar4 SIMD_CFUNC simd_uchar_sat(simd_double4 __x) { return simd_uchar(simd_clamp(__x,0,0xff)); } -static simd_uchar8 SIMD_CFUNC simd_uchar_sat(simd_double8 __x) { return simd_uchar(simd_clamp(__x,0,0xff)); } -static simd_uchar2 SIMD_CFUNC simd_uchar_sat(simd_uchar2 __x) { return __x; } -static simd_uchar3 SIMD_CFUNC simd_uchar_sat(simd_uchar3 __x) { return __x; } -static simd_uchar4 SIMD_CFUNC simd_uchar_sat(simd_uchar4 __x) { return __x; } -static simd_uchar8 SIMD_CFUNC simd_uchar_sat(simd_uchar8 __x) { return __x; } -static simd_uchar16 SIMD_CFUNC simd_uchar_sat(simd_uchar16 __x) { return __x; } -static simd_uchar32 SIMD_CFUNC simd_uchar_sat(simd_uchar32 __x) { return __x; } -static simd_uchar2 SIMD_CFUNC simd_uchar_sat(simd_ushort2 __x) { return simd_uchar(simd_min(__x,0xff)); } -static simd_uchar3 SIMD_CFUNC simd_uchar_sat(simd_ushort3 __x) { return simd_uchar(simd_min(__x,0xff)); } -static simd_uchar4 SIMD_CFUNC simd_uchar_sat(simd_ushort4 __x) { return simd_uchar(simd_min(__x,0xff)); } -static simd_uchar8 SIMD_CFUNC simd_uchar_sat(simd_ushort8 __x) { return simd_uchar(simd_min(__x,0xff)); } -static simd_uchar16 SIMD_CFUNC simd_uchar_sat(simd_ushort16 __x) { return simd_uchar(simd_min(__x,0xff)); } -static simd_uchar32 SIMD_CFUNC simd_uchar_sat(simd_ushort32 __x) { return simd_uchar(simd_min(__x,0xff)); } -static simd_uchar2 SIMD_CFUNC simd_uchar_sat(simd_uint2 __x) { return simd_uchar(simd_min(__x,0xff)); } -static simd_uchar3 SIMD_CFUNC simd_uchar_sat(simd_uint3 __x) { return simd_uchar(simd_min(__x,0xff)); } -static simd_uchar4 SIMD_CFUNC simd_uchar_sat(simd_uint4 __x) { return simd_uchar(simd_min(__x,0xff)); } -static simd_uchar8 SIMD_CFUNC simd_uchar_sat(simd_uint8 __x) { return simd_uchar(simd_min(__x,0xff)); } -static simd_uchar16 SIMD_CFUNC simd_uchar_sat(simd_uint16 __x) { return simd_uchar(simd_min(__x,0xff)); } -static simd_uchar2 SIMD_CFUNC simd_uchar_sat(simd_ulong2 __x) { return simd_uchar(simd_min(__x,0xff)); } -static simd_uchar3 SIMD_CFUNC simd_uchar_sat(simd_ulong3 __x) { return simd_uchar(simd_min(__x,0xff)); } -static simd_uchar4 SIMD_CFUNC simd_uchar_sat(simd_ulong4 __x) { return simd_uchar(simd_min(__x,0xff)); } -static simd_uchar8 SIMD_CFUNC simd_uchar_sat(simd_ulong8 __x) { return simd_uchar(simd_min(__x,0xff)); } - -static simd_short2 SIMD_CFUNC simd_short(simd_char2 __x) { return __builtin_convertvector(__x, simd_short2); } -static simd_short3 SIMD_CFUNC simd_short(simd_char3 __x) { return __builtin_convertvector(__x, simd_short3); } -static simd_short4 SIMD_CFUNC simd_short(simd_char4 __x) { return __builtin_convertvector(__x, simd_short4); } -static simd_short8 SIMD_CFUNC simd_short(simd_char8 __x) { return __builtin_convertvector(__x, simd_short8); } -static simd_short16 SIMD_CFUNC simd_short(simd_char16 __x) { return __builtin_convertvector(__x, simd_short16); } -static simd_short32 SIMD_CFUNC simd_short(simd_char32 __x) { return __builtin_convertvector(__x, simd_short32); } -static simd_short2 SIMD_CFUNC simd_short(simd_uchar2 __x) { return __builtin_convertvector(__x, simd_short2); } -static simd_short3 SIMD_CFUNC simd_short(simd_uchar3 __x) { return __builtin_convertvector(__x, simd_short3); } -static simd_short4 SIMD_CFUNC simd_short(simd_uchar4 __x) { return __builtin_convertvector(__x, simd_short4); } -static simd_short8 SIMD_CFUNC simd_short(simd_uchar8 __x) { return __builtin_convertvector(__x, simd_short8); } -static simd_short16 SIMD_CFUNC simd_short(simd_uchar16 __x) { return __builtin_convertvector(__x, simd_short16); } -static simd_short32 SIMD_CFUNC simd_short(simd_uchar32 __x) { return __builtin_convertvector(__x, simd_short32); } -static simd_short2 SIMD_CFUNC simd_short(simd_short2 __x) { return __x; } -static simd_short3 SIMD_CFUNC simd_short(simd_short3 __x) { return __x; } -static simd_short4 SIMD_CFUNC simd_short(simd_short4 __x) { return __x; } -static simd_short8 SIMD_CFUNC simd_short(simd_short8 __x) { return __x; } -static simd_short16 SIMD_CFUNC simd_short(simd_short16 __x) { return __x; } -static simd_short32 SIMD_CFUNC simd_short(simd_short32 __x) { return __x; } -static simd_short2 SIMD_CFUNC simd_short(simd_ushort2 __x) { return (simd_short2)__x; } -static simd_short3 SIMD_CFUNC simd_short(simd_ushort3 __x) { return (simd_short3)__x; } -static simd_short4 SIMD_CFUNC simd_short(simd_ushort4 __x) { return (simd_short4)__x; } -static simd_short8 SIMD_CFUNC simd_short(simd_ushort8 __x) { return (simd_short8)__x; } -static simd_short16 SIMD_CFUNC simd_short(simd_ushort16 __x) { return (simd_short16)__x; } -static simd_short32 SIMD_CFUNC simd_short(simd_ushort32 __x) { return (simd_short32)__x; } -static simd_short2 SIMD_CFUNC simd_short(simd_int2 __x) { return __builtin_convertvector(__x & 0xffff, simd_short2); } -static simd_short3 SIMD_CFUNC simd_short(simd_int3 __x) { return __builtin_convertvector(__x & 0xffff, simd_short3); } -static simd_short4 SIMD_CFUNC simd_short(simd_int4 __x) { return __builtin_convertvector(__x & 0xffff, simd_short4); } -static simd_short8 SIMD_CFUNC simd_short(simd_int8 __x) { return __builtin_convertvector(__x & 0xffff, simd_short8); } -static simd_short16 SIMD_CFUNC simd_short(simd_int16 __x) { return __builtin_convertvector(__x & 0xffff, simd_short16); } -static simd_short2 SIMD_CFUNC simd_short(simd_uint2 __x) { return simd_short(simd_int(__x)); } -static simd_short3 SIMD_CFUNC simd_short(simd_uint3 __x) { return simd_short(simd_int(__x)); } -static simd_short4 SIMD_CFUNC simd_short(simd_uint4 __x) { return simd_short(simd_int(__x)); } -static simd_short8 SIMD_CFUNC simd_short(simd_uint8 __x) { return simd_short(simd_int(__x)); } -static simd_short16 SIMD_CFUNC simd_short(simd_uint16 __x) { return simd_short(simd_int(__x)); } -static simd_short2 SIMD_CFUNC simd_short(simd_float2 __x) { return simd_short(simd_int(__x)); } -static simd_short3 SIMD_CFUNC simd_short(simd_float3 __x) { return simd_short(simd_int(__x)); } -static simd_short4 SIMD_CFUNC simd_short(simd_float4 __x) { return simd_short(simd_int(__x)); } -static simd_short8 SIMD_CFUNC simd_short(simd_float8 __x) { return simd_short(simd_int(__x)); } -static simd_short16 SIMD_CFUNC simd_short(simd_float16 __x) { return simd_short(simd_int(__x)); } -static simd_short2 SIMD_CFUNC simd_short(simd_long2 __x) { return simd_short(simd_int(__x)); } -static simd_short3 SIMD_CFUNC simd_short(simd_long3 __x) { return simd_short(simd_int(__x)); } -static simd_short4 SIMD_CFUNC simd_short(simd_long4 __x) { return simd_short(simd_int(__x)); } -static simd_short8 SIMD_CFUNC simd_short(simd_long8 __x) { return simd_short(simd_int(__x)); } -static simd_short2 SIMD_CFUNC simd_short(simd_ulong2 __x) { return simd_short(simd_int(__x)); } -static simd_short3 SIMD_CFUNC simd_short(simd_ulong3 __x) { return simd_short(simd_int(__x)); } -static simd_short4 SIMD_CFUNC simd_short(simd_ulong4 __x) { return simd_short(simd_int(__x)); } -static simd_short8 SIMD_CFUNC simd_short(simd_ulong8 __x) { return simd_short(simd_int(__x)); } -static simd_short2 SIMD_CFUNC simd_short(simd_double2 __x) { return simd_short(simd_int(__x)); } -static simd_short3 SIMD_CFUNC simd_short(simd_double3 __x) { return simd_short(simd_int(__x)); } -static simd_short4 SIMD_CFUNC simd_short(simd_double4 __x) { return simd_short(simd_int(__x)); } -static simd_short8 SIMD_CFUNC simd_short(simd_double8 __x) { return simd_short(simd_int(__x)); } - -static simd_short2 SIMD_CFUNC simd_short_sat(simd_char2 __x) { return simd_short(__x); } -static simd_short3 SIMD_CFUNC simd_short_sat(simd_char3 __x) { return simd_short(__x); } -static simd_short4 SIMD_CFUNC simd_short_sat(simd_char4 __x) { return simd_short(__x); } -static simd_short8 SIMD_CFUNC simd_short_sat(simd_char8 __x) { return simd_short(__x); } -static simd_short16 SIMD_CFUNC simd_short_sat(simd_char16 __x) { return simd_short(__x); } -static simd_short32 SIMD_CFUNC simd_short_sat(simd_char32 __x) { return simd_short(__x); } -static simd_short2 SIMD_CFUNC simd_short_sat(simd_short2 __x) { return __x; } -static simd_short3 SIMD_CFUNC simd_short_sat(simd_short3 __x) { return __x; } -static simd_short4 SIMD_CFUNC simd_short_sat(simd_short4 __x) { return __x; } -static simd_short8 SIMD_CFUNC simd_short_sat(simd_short8 __x) { return __x; } -static simd_short16 SIMD_CFUNC simd_short_sat(simd_short16 __x) { return __x; } -static simd_short32 SIMD_CFUNC simd_short_sat(simd_short32 __x) { return __x; } -static simd_short2 SIMD_CFUNC simd_short_sat(simd_int2 __x) { return simd_short(simd_clamp(__x,-0x8000,0x7fff)); } -static simd_short3 SIMD_CFUNC simd_short_sat(simd_int3 __x) { return simd_short(simd_clamp(__x,-0x8000,0x7fff)); } -static simd_short4 SIMD_CFUNC simd_short_sat(simd_int4 __x) { return simd_short(simd_clamp(__x,-0x8000,0x7fff)); } -static simd_short8 SIMD_CFUNC simd_short_sat(simd_int8 __x) { return simd_short(simd_clamp(__x,-0x8000,0x7fff)); } -static simd_short16 SIMD_CFUNC simd_short_sat(simd_int16 __x) { return simd_short(simd_clamp(__x,-0x8000,0x7fff)); } -static simd_short2 SIMD_CFUNC simd_short_sat(simd_float2 __x) { return simd_short(simd_clamp(__x,-0x8000,0x7fff)); } -static simd_short3 SIMD_CFUNC simd_short_sat(simd_float3 __x) { return simd_short(simd_clamp(__x,-0x8000,0x7fff)); } -static simd_short4 SIMD_CFUNC simd_short_sat(simd_float4 __x) { return simd_short(simd_clamp(__x,-0x8000,0x7fff)); } -static simd_short8 SIMD_CFUNC simd_short_sat(simd_float8 __x) { return simd_short(simd_clamp(__x,-0x8000,0x7fff)); } -static simd_short16 SIMD_CFUNC simd_short_sat(simd_float16 __x) { return simd_short(simd_clamp(__x,-0x8000,0x7fff)); } -static simd_short2 SIMD_CFUNC simd_short_sat(simd_long2 __x) { return simd_short(simd_clamp(__x,-0x8000,0x7fff)); } -static simd_short3 SIMD_CFUNC simd_short_sat(simd_long3 __x) { return simd_short(simd_clamp(__x,-0x8000,0x7fff)); } -static simd_short4 SIMD_CFUNC simd_short_sat(simd_long4 __x) { return simd_short(simd_clamp(__x,-0x8000,0x7fff)); } -static simd_short8 SIMD_CFUNC simd_short_sat(simd_long8 __x) { return simd_short(simd_clamp(__x,-0x8000,0x7fff)); } -static simd_short2 SIMD_CFUNC simd_short_sat(simd_double2 __x) { return simd_short(simd_clamp(__x,-0x8000,0x7fff)); } -static simd_short3 SIMD_CFUNC simd_short_sat(simd_double3 __x) { return simd_short(simd_clamp(__x,-0x8000,0x7fff)); } -static simd_short4 SIMD_CFUNC simd_short_sat(simd_double4 __x) { return simd_short(simd_clamp(__x,-0x8000,0x7fff)); } -static simd_short8 SIMD_CFUNC simd_short_sat(simd_double8 __x) { return simd_short(simd_clamp(__x,-0x8000,0x7fff)); } -static simd_short2 SIMD_CFUNC simd_short_sat(simd_uchar2 __x) { return simd_short(__x); } -static simd_short3 SIMD_CFUNC simd_short_sat(simd_uchar3 __x) { return simd_short(__x); } -static simd_short4 SIMD_CFUNC simd_short_sat(simd_uchar4 __x) { return simd_short(__x); } -static simd_short8 SIMD_CFUNC simd_short_sat(simd_uchar8 __x) { return simd_short(__x); } -static simd_short16 SIMD_CFUNC simd_short_sat(simd_uchar16 __x) { return simd_short(__x); } -static simd_short32 SIMD_CFUNC simd_short_sat(simd_uchar32 __x) { return simd_short(__x); } -static simd_short2 SIMD_CFUNC simd_short_sat(simd_ushort2 __x) { return simd_short(simd_min(__x,0x7fff)); } -static simd_short3 SIMD_CFUNC simd_short_sat(simd_ushort3 __x) { return simd_short(simd_min(__x,0x7fff)); } -static simd_short4 SIMD_CFUNC simd_short_sat(simd_ushort4 __x) { return simd_short(simd_min(__x,0x7fff)); } -static simd_short8 SIMD_CFUNC simd_short_sat(simd_ushort8 __x) { return simd_short(simd_min(__x,0x7fff)); } -static simd_short16 SIMD_CFUNC simd_short_sat(simd_ushort16 __x) { return simd_short(simd_min(__x,0x7fff)); } -static simd_short32 SIMD_CFUNC simd_short_sat(simd_ushort32 __x) { return simd_short(simd_min(__x,0x7fff)); } -static simd_short2 SIMD_CFUNC simd_short_sat(simd_uint2 __x) { return simd_short(simd_min(__x,0x7fff)); } -static simd_short3 SIMD_CFUNC simd_short_sat(simd_uint3 __x) { return simd_short(simd_min(__x,0x7fff)); } -static simd_short4 SIMD_CFUNC simd_short_sat(simd_uint4 __x) { return simd_short(simd_min(__x,0x7fff)); } -static simd_short8 SIMD_CFUNC simd_short_sat(simd_uint8 __x) { return simd_short(simd_min(__x,0x7fff)); } -static simd_short16 SIMD_CFUNC simd_short_sat(simd_uint16 __x) { return simd_short(simd_min(__x,0x7fff)); } -static simd_short2 SIMD_CFUNC simd_short_sat(simd_ulong2 __x) { return simd_short(simd_min(__x,0x7fff)); } -static simd_short3 SIMD_CFUNC simd_short_sat(simd_ulong3 __x) { return simd_short(simd_min(__x,0x7fff)); } -static simd_short4 SIMD_CFUNC simd_short_sat(simd_ulong4 __x) { return simd_short(simd_min(__x,0x7fff)); } -static simd_short8 SIMD_CFUNC simd_short_sat(simd_ulong8 __x) { return simd_short(simd_min(__x,0x7fff)); } - -static simd_ushort2 SIMD_CFUNC simd_ushort(simd_char2 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort3 SIMD_CFUNC simd_ushort(simd_char3 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort4 SIMD_CFUNC simd_ushort(simd_char4 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort8 SIMD_CFUNC simd_ushort(simd_char8 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort16 SIMD_CFUNC simd_ushort(simd_char16 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort32 SIMD_CFUNC simd_ushort(simd_char32 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort2 SIMD_CFUNC simd_ushort(simd_uchar2 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort3 SIMD_CFUNC simd_ushort(simd_uchar3 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort4 SIMD_CFUNC simd_ushort(simd_uchar4 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort8 SIMD_CFUNC simd_ushort(simd_uchar8 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort16 SIMD_CFUNC simd_ushort(simd_uchar16 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort32 SIMD_CFUNC simd_ushort(simd_uchar32 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort2 SIMD_CFUNC simd_ushort(simd_short2 __x) { return (simd_ushort2)__x; } -static simd_ushort3 SIMD_CFUNC simd_ushort(simd_short3 __x) { return (simd_ushort3)__x; } -static simd_ushort4 SIMD_CFUNC simd_ushort(simd_short4 __x) { return (simd_ushort4)__x; } -static simd_ushort8 SIMD_CFUNC simd_ushort(simd_short8 __x) { return (simd_ushort8)__x; } -static simd_ushort16 SIMD_CFUNC simd_ushort(simd_short16 __x) { return (simd_ushort16)__x; } -static simd_ushort32 SIMD_CFUNC simd_ushort(simd_short32 __x) { return (simd_ushort32)__x; } -static simd_ushort2 SIMD_CFUNC simd_ushort(simd_ushort2 __x) { return __x; } -static simd_ushort3 SIMD_CFUNC simd_ushort(simd_ushort3 __x) { return __x; } -static simd_ushort4 SIMD_CFUNC simd_ushort(simd_ushort4 __x) { return __x; } -static simd_ushort8 SIMD_CFUNC simd_ushort(simd_ushort8 __x) { return __x; } -static simd_ushort16 SIMD_CFUNC simd_ushort(simd_ushort16 __x) { return __x; } -static simd_ushort32 SIMD_CFUNC simd_ushort(simd_ushort32 __x) { return __x; } -static simd_ushort2 SIMD_CFUNC simd_ushort(simd_int2 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort3 SIMD_CFUNC simd_ushort(simd_int3 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort4 SIMD_CFUNC simd_ushort(simd_int4 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort8 SIMD_CFUNC simd_ushort(simd_int8 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort16 SIMD_CFUNC simd_ushort(simd_int16 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort2 SIMD_CFUNC simd_ushort(simd_uint2 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort3 SIMD_CFUNC simd_ushort(simd_uint3 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort4 SIMD_CFUNC simd_ushort(simd_uint4 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort8 SIMD_CFUNC simd_ushort(simd_uint8 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort16 SIMD_CFUNC simd_ushort(simd_uint16 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort2 SIMD_CFUNC simd_ushort(simd_float2 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort3 SIMD_CFUNC simd_ushort(simd_float3 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort4 SIMD_CFUNC simd_ushort(simd_float4 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort8 SIMD_CFUNC simd_ushort(simd_float8 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort16 SIMD_CFUNC simd_ushort(simd_float16 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort2 SIMD_CFUNC simd_ushort(simd_long2 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort3 SIMD_CFUNC simd_ushort(simd_long3 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort4 SIMD_CFUNC simd_ushort(simd_long4 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort8 SIMD_CFUNC simd_ushort(simd_long8 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort2 SIMD_CFUNC simd_ushort(simd_ulong2 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort3 SIMD_CFUNC simd_ushort(simd_ulong3 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort4 SIMD_CFUNC simd_ushort(simd_ulong4 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort8 SIMD_CFUNC simd_ushort(simd_ulong8 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort2 SIMD_CFUNC simd_ushort(simd_double2 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort3 SIMD_CFUNC simd_ushort(simd_double3 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort4 SIMD_CFUNC simd_ushort(simd_double4 __x) { return simd_ushort(simd_short(__x)); } -static simd_ushort8 SIMD_CFUNC simd_ushort(simd_double8 __x) { return simd_ushort(simd_short(__x)); } - -static simd_ushort2 SIMD_CFUNC simd_ushort_sat(simd_char2 __x) { return simd_ushort(simd_max(__x, 0)); } -static simd_ushort3 SIMD_CFUNC simd_ushort_sat(simd_char3 __x) { return simd_ushort(simd_max(__x, 0)); } -static simd_ushort4 SIMD_CFUNC simd_ushort_sat(simd_char4 __x) { return simd_ushort(simd_max(__x, 0)); } -static simd_ushort8 SIMD_CFUNC simd_ushort_sat(simd_char8 __x) { return simd_ushort(simd_max(__x, 0)); } -static simd_ushort16 SIMD_CFUNC simd_ushort_sat(simd_char16 __x) { return simd_ushort(simd_max(__x, 0)); } -static simd_ushort32 SIMD_CFUNC simd_ushort_sat(simd_char32 __x) { return simd_ushort(simd_max(__x, 0)); } -static simd_ushort2 SIMD_CFUNC simd_ushort_sat(simd_short2 __x) { return simd_ushort(simd_max(__x, 0)); } -static simd_ushort3 SIMD_CFUNC simd_ushort_sat(simd_short3 __x) { return simd_ushort(simd_max(__x, 0)); } -static simd_ushort4 SIMD_CFUNC simd_ushort_sat(simd_short4 __x) { return simd_ushort(simd_max(__x, 0)); } -static simd_ushort8 SIMD_CFUNC simd_ushort_sat(simd_short8 __x) { return simd_ushort(simd_max(__x, 0)); } -static simd_ushort16 SIMD_CFUNC simd_ushort_sat(simd_short16 __x) { return simd_ushort(simd_max(__x, 0)); } -static simd_ushort32 SIMD_CFUNC simd_ushort_sat(simd_short32 __x) { return simd_ushort(simd_max(__x, 0)); } -static simd_ushort2 SIMD_CFUNC simd_ushort_sat(simd_int2 __x) { return simd_ushort(simd_clamp(__x, 0, 0xffff)); } -static simd_ushort3 SIMD_CFUNC simd_ushort_sat(simd_int3 __x) { return simd_ushort(simd_clamp(__x, 0, 0xffff)); } -static simd_ushort4 SIMD_CFUNC simd_ushort_sat(simd_int4 __x) { return simd_ushort(simd_clamp(__x, 0, 0xffff)); } -static simd_ushort8 SIMD_CFUNC simd_ushort_sat(simd_int8 __x) { return simd_ushort(simd_clamp(__x, 0, 0xffff)); } -static simd_ushort16 SIMD_CFUNC simd_ushort_sat(simd_int16 __x) { return simd_ushort(simd_clamp(__x, 0, 0xffff)); } -static simd_ushort2 SIMD_CFUNC simd_ushort_sat(simd_float2 __x) { return simd_ushort(simd_clamp(__x, 0, 0xffff)); } -static simd_ushort3 SIMD_CFUNC simd_ushort_sat(simd_float3 __x) { return simd_ushort(simd_clamp(__x, 0, 0xffff)); } -static simd_ushort4 SIMD_CFUNC simd_ushort_sat(simd_float4 __x) { return simd_ushort(simd_clamp(__x, 0, 0xffff)); } -static simd_ushort8 SIMD_CFUNC simd_ushort_sat(simd_float8 __x) { return simd_ushort(simd_clamp(__x, 0, 0xffff)); } -static simd_ushort16 SIMD_CFUNC simd_ushort_sat(simd_float16 __x) { return simd_ushort(simd_clamp(__x, 0, 0xffff)); } -static simd_ushort2 SIMD_CFUNC simd_ushort_sat(simd_long2 __x) { return simd_ushort(simd_clamp(__x, 0, 0xffff)); } -static simd_ushort3 SIMD_CFUNC simd_ushort_sat(simd_long3 __x) { return simd_ushort(simd_clamp(__x, 0, 0xffff)); } -static simd_ushort4 SIMD_CFUNC simd_ushort_sat(simd_long4 __x) { return simd_ushort(simd_clamp(__x, 0, 0xffff)); } -static simd_ushort8 SIMD_CFUNC simd_ushort_sat(simd_long8 __x) { return simd_ushort(simd_clamp(__x, 0, 0xffff)); } -static simd_ushort2 SIMD_CFUNC simd_ushort_sat(simd_double2 __x) { return simd_ushort(simd_clamp(__x, 0, 0xffff)); } -static simd_ushort3 SIMD_CFUNC simd_ushort_sat(simd_double3 __x) { return simd_ushort(simd_clamp(__x, 0, 0xffff)); } -static simd_ushort4 SIMD_CFUNC simd_ushort_sat(simd_double4 __x) { return simd_ushort(simd_clamp(__x, 0, 0xffff)); } -static simd_ushort8 SIMD_CFUNC simd_ushort_sat(simd_double8 __x) { return simd_ushort(simd_clamp(__x, 0, 0xffff)); } -static simd_ushort2 SIMD_CFUNC simd_ushort_sat(simd_uchar2 __x) { return simd_ushort(__x); } -static simd_ushort3 SIMD_CFUNC simd_ushort_sat(simd_uchar3 __x) { return simd_ushort(__x); } -static simd_ushort4 SIMD_CFUNC simd_ushort_sat(simd_uchar4 __x) { return simd_ushort(__x); } -static simd_ushort8 SIMD_CFUNC simd_ushort_sat(simd_uchar8 __x) { return simd_ushort(__x); } -static simd_ushort16 SIMD_CFUNC simd_ushort_sat(simd_uchar16 __x) { return simd_ushort(__x); } -static simd_ushort32 SIMD_CFUNC simd_ushort_sat(simd_uchar32 __x) { return simd_ushort(__x); } -static simd_ushort2 SIMD_CFUNC simd_ushort_sat(simd_ushort2 __x) { return __x; } -static simd_ushort3 SIMD_CFUNC simd_ushort_sat(simd_ushort3 __x) { return __x; } -static simd_ushort4 SIMD_CFUNC simd_ushort_sat(simd_ushort4 __x) { return __x; } -static simd_ushort8 SIMD_CFUNC simd_ushort_sat(simd_ushort8 __x) { return __x; } -static simd_ushort16 SIMD_CFUNC simd_ushort_sat(simd_ushort16 __x) { return __x; } -static simd_ushort32 SIMD_CFUNC simd_ushort_sat(simd_ushort32 __x) { return __x; } -static simd_ushort2 SIMD_CFUNC simd_ushort_sat(simd_uint2 __x) { return simd_ushort(simd_min(__x, 0xffff)); } -static simd_ushort3 SIMD_CFUNC simd_ushort_sat(simd_uint3 __x) { return simd_ushort(simd_min(__x, 0xffff)); } -static simd_ushort4 SIMD_CFUNC simd_ushort_sat(simd_uint4 __x) { return simd_ushort(simd_min(__x, 0xffff)); } -static simd_ushort8 SIMD_CFUNC simd_ushort_sat(simd_uint8 __x) { return simd_ushort(simd_min(__x, 0xffff)); } -static simd_ushort16 SIMD_CFUNC simd_ushort_sat(simd_uint16 __x) { return simd_ushort(simd_min(__x, 0xffff)); } -static simd_ushort2 SIMD_CFUNC simd_ushort_sat(simd_ulong2 __x) { return simd_ushort(simd_min(__x, 0xffff)); } -static simd_ushort3 SIMD_CFUNC simd_ushort_sat(simd_ulong3 __x) { return simd_ushort(simd_min(__x, 0xffff)); } -static simd_ushort4 SIMD_CFUNC simd_ushort_sat(simd_ulong4 __x) { return simd_ushort(simd_min(__x, 0xffff)); } -static simd_ushort8 SIMD_CFUNC simd_ushort_sat(simd_ulong8 __x) { return simd_ushort(simd_min(__x, 0xffff)); } - -static simd_int2 SIMD_CFUNC simd_int(simd_char2 __x) { return __builtin_convertvector(__x, simd_int2); } -static simd_int3 SIMD_CFUNC simd_int(simd_char3 __x) { return __builtin_convertvector(__x, simd_int3); } -static simd_int4 SIMD_CFUNC simd_int(simd_char4 __x) { return __builtin_convertvector(__x, simd_int4); } -static simd_int8 SIMD_CFUNC simd_int(simd_char8 __x) { return __builtin_convertvector(__x, simd_int8); } -static simd_int16 SIMD_CFUNC simd_int(simd_char16 __x) { return __builtin_convertvector(__x, simd_int16); } -static simd_int2 SIMD_CFUNC simd_int(simd_uchar2 __x) { return __builtin_convertvector(__x, simd_int2); } -static simd_int3 SIMD_CFUNC simd_int(simd_uchar3 __x) { return __builtin_convertvector(__x, simd_int3); } -static simd_int4 SIMD_CFUNC simd_int(simd_uchar4 __x) { return __builtin_convertvector(__x, simd_int4); } -static simd_int8 SIMD_CFUNC simd_int(simd_uchar8 __x) { return __builtin_convertvector(__x, simd_int8); } -static simd_int16 SIMD_CFUNC simd_int(simd_uchar16 __x) { return __builtin_convertvector(__x, simd_int16); } -static simd_int2 SIMD_CFUNC simd_int(simd_short2 __x) { return __builtin_convertvector(__x, simd_int2); } -static simd_int3 SIMD_CFUNC simd_int(simd_short3 __x) { return __builtin_convertvector(__x, simd_int3); } -static simd_int4 SIMD_CFUNC simd_int(simd_short4 __x) { return __builtin_convertvector(__x, simd_int4); } -static simd_int8 SIMD_CFUNC simd_int(simd_short8 __x) { return __builtin_convertvector(__x, simd_int8); } -static simd_int16 SIMD_CFUNC simd_int(simd_short16 __x) { return __builtin_convertvector(__x, simd_int16); } -static simd_int2 SIMD_CFUNC simd_int(simd_ushort2 __x) { return __builtin_convertvector(__x, simd_int2); } -static simd_int3 SIMD_CFUNC simd_int(simd_ushort3 __x) { return __builtin_convertvector(__x, simd_int3); } -static simd_int4 SIMD_CFUNC simd_int(simd_ushort4 __x) { return __builtin_convertvector(__x, simd_int4); } -static simd_int8 SIMD_CFUNC simd_int(simd_ushort8 __x) { return __builtin_convertvector(__x, simd_int8); } -static simd_int16 SIMD_CFUNC simd_int(simd_ushort16 __x) { return __builtin_convertvector(__x, simd_int16); } -static simd_int2 SIMD_CFUNC simd_int(simd_int2 __x) { return __x; } -static simd_int3 SIMD_CFUNC simd_int(simd_int3 __x) { return __x; } -static simd_int4 SIMD_CFUNC simd_int(simd_int4 __x) { return __x; } -static simd_int8 SIMD_CFUNC simd_int(simd_int8 __x) { return __x; } -static simd_int16 SIMD_CFUNC simd_int(simd_int16 __x) { return __x; } -static simd_int2 SIMD_CFUNC simd_int(simd_uint2 __x) { return (simd_int2)__x; } -static simd_int3 SIMD_CFUNC simd_int(simd_uint3 __x) { return (simd_int3)__x; } -static simd_int4 SIMD_CFUNC simd_int(simd_uint4 __x) { return (simd_int4)__x; } -static simd_int8 SIMD_CFUNC simd_int(simd_uint8 __x) { return (simd_int8)__x; } -static simd_int16 SIMD_CFUNC simd_int(simd_uint16 __x) { return (simd_int16)__x; } -static simd_int2 SIMD_CFUNC simd_int(simd_float2 __x) { return __builtin_convertvector(__x, simd_int2); } -static simd_int3 SIMD_CFUNC simd_int(simd_float3 __x) { return __builtin_convertvector(__x, simd_int3); } -static simd_int4 SIMD_CFUNC simd_int(simd_float4 __x) { return __builtin_convertvector(__x, simd_int4); } -static simd_int8 SIMD_CFUNC simd_int(simd_float8 __x) { return __builtin_convertvector(__x, simd_int8); } -static simd_int16 SIMD_CFUNC simd_int(simd_float16 __x) { return __builtin_convertvector(__x, simd_int16); } -static simd_int2 SIMD_CFUNC simd_int(simd_long2 __x) { return __builtin_convertvector(__x & 0xffffffff, simd_int2); } -static simd_int3 SIMD_CFUNC simd_int(simd_long3 __x) { return __builtin_convertvector(__x & 0xffffffff, simd_int3); } -static simd_int4 SIMD_CFUNC simd_int(simd_long4 __x) { return __builtin_convertvector(__x & 0xffffffff, simd_int4); } -static simd_int8 SIMD_CFUNC simd_int(simd_long8 __x) { return __builtin_convertvector(__x & 0xffffffff, simd_int8); } -static simd_int2 SIMD_CFUNC simd_int(simd_ulong2 __x) { return simd_int(simd_long(__x)); } -static simd_int3 SIMD_CFUNC simd_int(simd_ulong3 __x) { return simd_int(simd_long(__x)); } -static simd_int4 SIMD_CFUNC simd_int(simd_ulong4 __x) { return simd_int(simd_long(__x)); } -static simd_int8 SIMD_CFUNC simd_int(simd_ulong8 __x) { return simd_int(simd_long(__x)); } -static simd_int2 SIMD_CFUNC simd_int(simd_double2 __x) { return __builtin_convertvector(__x, simd_int2); } -static simd_int3 SIMD_CFUNC simd_int(simd_double3 __x) { return __builtin_convertvector(__x, simd_int3); } -static simd_int4 SIMD_CFUNC simd_int(simd_double4 __x) { return __builtin_convertvector(__x, simd_int4); } -static simd_int8 SIMD_CFUNC simd_int(simd_double8 __x) { return __builtin_convertvector(__x, simd_int8); } - -static simd_int2 SIMD_CFUNC simd_int_sat(simd_char2 __x) { return simd_int(__x); } -static simd_int3 SIMD_CFUNC simd_int_sat(simd_char3 __x) { return simd_int(__x); } -static simd_int4 SIMD_CFUNC simd_int_sat(simd_char4 __x) { return simd_int(__x); } -static simd_int8 SIMD_CFUNC simd_int_sat(simd_char8 __x) { return simd_int(__x); } -static simd_int16 SIMD_CFUNC simd_int_sat(simd_char16 __x) { return simd_int(__x); } -static simd_int2 SIMD_CFUNC simd_int_sat(simd_short2 __x) { return simd_int(__x); } -static simd_int3 SIMD_CFUNC simd_int_sat(simd_short3 __x) { return simd_int(__x); } -static simd_int4 SIMD_CFUNC simd_int_sat(simd_short4 __x) { return simd_int(__x); } -static simd_int8 SIMD_CFUNC simd_int_sat(simd_short8 __x) { return simd_int(__x); } -static simd_int16 SIMD_CFUNC simd_int_sat(simd_short16 __x) { return simd_int(__x); } -static simd_int2 SIMD_CFUNC simd_int_sat(simd_int2 __x) { return __x; } -static simd_int3 SIMD_CFUNC simd_int_sat(simd_int3 __x) { return __x; } -static simd_int4 SIMD_CFUNC simd_int_sat(simd_int4 __x) { return __x; } -static simd_int8 SIMD_CFUNC simd_int_sat(simd_int8 __x) { return __x; } -static simd_int16 SIMD_CFUNC simd_int_sat(simd_int16 __x) { return __x; } -static simd_int2 SIMD_CFUNC simd_int_sat(simd_float2 __x) { return simd_bitselect(simd_int(simd_max(__x,-0x1.0p31f)), 0x7fffffff, __x >= 0x1.0p31f); } -static simd_int3 SIMD_CFUNC simd_int_sat(simd_float3 __x) { return simd_bitselect(simd_int(simd_max(__x,-0x1.0p31f)), 0x7fffffff, __x >= 0x1.0p31f); } -static simd_int4 SIMD_CFUNC simd_int_sat(simd_float4 __x) { return simd_bitselect(simd_int(simd_max(__x,-0x1.0p31f)), 0x7fffffff, __x >= 0x1.0p31f); } -static simd_int8 SIMD_CFUNC simd_int_sat(simd_float8 __x) { return simd_bitselect(simd_int(simd_max(__x,-0x1.0p31f)), 0x7fffffff, __x >= 0x1.0p31f); } -static simd_int16 SIMD_CFUNC simd_int_sat(simd_float16 __x) { return simd_bitselect(simd_int(simd_max(__x,-0x1.0p31f)), 0x7fffffff, __x >= 0x1.0p31f); } -static simd_int2 SIMD_CFUNC simd_int_sat(simd_long2 __x) { return simd_int(simd_clamp(__x,-0x80000000LL,0x7fffffffLL)); } -static simd_int3 SIMD_CFUNC simd_int_sat(simd_long3 __x) { return simd_int(simd_clamp(__x,-0x80000000LL,0x7fffffffLL)); } -static simd_int4 SIMD_CFUNC simd_int_sat(simd_long4 __x) { return simd_int(simd_clamp(__x,-0x80000000LL,0x7fffffffLL)); } -static simd_int8 SIMD_CFUNC simd_int_sat(simd_long8 __x) { return simd_int(simd_clamp(__x,-0x80000000LL,0x7fffffffLL)); } -static simd_int2 SIMD_CFUNC simd_int_sat(simd_double2 __x) { return simd_int(simd_clamp(__x,-0x1.0p31,0x1.fffffffcp30)); } -static simd_int3 SIMD_CFUNC simd_int_sat(simd_double3 __x) { return simd_int(simd_clamp(__x,-0x1.0p31,0x1.fffffffcp30)); } -static simd_int4 SIMD_CFUNC simd_int_sat(simd_double4 __x) { return simd_int(simd_clamp(__x,-0x1.0p31,0x1.fffffffcp30)); } -static simd_int8 SIMD_CFUNC simd_int_sat(simd_double8 __x) { return simd_int(simd_clamp(__x,-0x1.0p31,0x1.fffffffcp30)); } -static simd_int2 SIMD_CFUNC simd_int_sat(simd_uchar2 __x) { return simd_int(__x); } -static simd_int3 SIMD_CFUNC simd_int_sat(simd_uchar3 __x) { return simd_int(__x); } -static simd_int4 SIMD_CFUNC simd_int_sat(simd_uchar4 __x) { return simd_int(__x); } -static simd_int8 SIMD_CFUNC simd_int_sat(simd_uchar8 __x) { return simd_int(__x); } -static simd_int16 SIMD_CFUNC simd_int_sat(simd_uchar16 __x) { return simd_int(__x); } -static simd_int2 SIMD_CFUNC simd_int_sat(simd_ushort2 __x) { return simd_int(__x); } -static simd_int3 SIMD_CFUNC simd_int_sat(simd_ushort3 __x) { return simd_int(__x); } -static simd_int4 SIMD_CFUNC simd_int_sat(simd_ushort4 __x) { return simd_int(__x); } -static simd_int8 SIMD_CFUNC simd_int_sat(simd_ushort8 __x) { return simd_int(__x); } -static simd_int16 SIMD_CFUNC simd_int_sat(simd_ushort16 __x) { return simd_int(__x); } -static simd_int2 SIMD_CFUNC simd_int_sat(simd_uint2 __x) { return simd_int(simd_min(__x,0x7fffffff)); } -static simd_int3 SIMD_CFUNC simd_int_sat(simd_uint3 __x) { return simd_int(simd_min(__x,0x7fffffff)); } -static simd_int4 SIMD_CFUNC simd_int_sat(simd_uint4 __x) { return simd_int(simd_min(__x,0x7fffffff)); } -static simd_int8 SIMD_CFUNC simd_int_sat(simd_uint8 __x) { return simd_int(simd_min(__x,0x7fffffff)); } -static simd_int16 SIMD_CFUNC simd_int_sat(simd_uint16 __x) { return simd_int(simd_min(__x,0x7fffffff)); } -static simd_int2 SIMD_CFUNC simd_int_sat(simd_ulong2 __x) { return simd_int(simd_min(__x,0x7fffffff)); } -static simd_int3 SIMD_CFUNC simd_int_sat(simd_ulong3 __x) { return simd_int(simd_min(__x,0x7fffffff)); } -static simd_int4 SIMD_CFUNC simd_int_sat(simd_ulong4 __x) { return simd_int(simd_min(__x,0x7fffffff)); } -static simd_int8 SIMD_CFUNC simd_int_sat(simd_ulong8 __x) { return simd_int(simd_min(__x,0x7fffffff)); } - -static simd_uint2 SIMD_CFUNC simd_uint(simd_char2 __x) { return simd_uint(simd_int(__x)); } -static simd_uint3 SIMD_CFUNC simd_uint(simd_char3 __x) { return simd_uint(simd_int(__x)); } -static simd_uint4 SIMD_CFUNC simd_uint(simd_char4 __x) { return simd_uint(simd_int(__x)); } -static simd_uint8 SIMD_CFUNC simd_uint(simd_char8 __x) { return simd_uint(simd_int(__x)); } -static simd_uint16 SIMD_CFUNC simd_uint(simd_char16 __x) { return simd_uint(simd_int(__x)); } -static simd_uint2 SIMD_CFUNC simd_uint(simd_uchar2 __x) { return simd_uint(simd_int(__x)); } -static simd_uint3 SIMD_CFUNC simd_uint(simd_uchar3 __x) { return simd_uint(simd_int(__x)); } -static simd_uint4 SIMD_CFUNC simd_uint(simd_uchar4 __x) { return simd_uint(simd_int(__x)); } -static simd_uint8 SIMD_CFUNC simd_uint(simd_uchar8 __x) { return simd_uint(simd_int(__x)); } -static simd_uint16 SIMD_CFUNC simd_uint(simd_uchar16 __x) { return simd_uint(simd_int(__x)); } -static simd_uint2 SIMD_CFUNC simd_uint(simd_short2 __x) { return simd_uint(simd_int(__x)); } -static simd_uint3 SIMD_CFUNC simd_uint(simd_short3 __x) { return simd_uint(simd_int(__x)); } -static simd_uint4 SIMD_CFUNC simd_uint(simd_short4 __x) { return simd_uint(simd_int(__x)); } -static simd_uint8 SIMD_CFUNC simd_uint(simd_short8 __x) { return simd_uint(simd_int(__x)); } -static simd_uint16 SIMD_CFUNC simd_uint(simd_short16 __x) { return simd_uint(simd_int(__x)); } -static simd_uint2 SIMD_CFUNC simd_uint(simd_ushort2 __x) { return simd_uint(simd_int(__x)); } -static simd_uint3 SIMD_CFUNC simd_uint(simd_ushort3 __x) { return simd_uint(simd_int(__x)); } -static simd_uint4 SIMD_CFUNC simd_uint(simd_ushort4 __x) { return simd_uint(simd_int(__x)); } -static simd_uint8 SIMD_CFUNC simd_uint(simd_ushort8 __x) { return simd_uint(simd_int(__x)); } -static simd_uint16 SIMD_CFUNC simd_uint(simd_ushort16 __x) { return simd_uint(simd_int(__x)); } -static simd_uint2 SIMD_CFUNC simd_uint(simd_int2 __x) { return (simd_uint2)__x; } -static simd_uint3 SIMD_CFUNC simd_uint(simd_int3 __x) { return (simd_uint3)__x; } -static simd_uint4 SIMD_CFUNC simd_uint(simd_int4 __x) { return (simd_uint4)__x; } -static simd_uint8 SIMD_CFUNC simd_uint(simd_int8 __x) { return (simd_uint8)__x; } -static simd_uint16 SIMD_CFUNC simd_uint(simd_int16 __x) { return (simd_uint16)__x; } -static simd_uint2 SIMD_CFUNC simd_uint(simd_uint2 __x) { return __x; } -static simd_uint3 SIMD_CFUNC simd_uint(simd_uint3 __x) { return __x; } -static simd_uint4 SIMD_CFUNC simd_uint(simd_uint4 __x) { return __x; } -static simd_uint8 SIMD_CFUNC simd_uint(simd_uint8 __x) { return __x; } -static simd_uint16 SIMD_CFUNC simd_uint(simd_uint16 __x) { return __x; } -static simd_uint2 SIMD_CFUNC simd_uint(simd_float2 __x) { simd_int2 __big = __x > 0x1.0p31f; return simd_uint(simd_int(__x - simd_bitselect((simd_float2)0,0x1.0p31f,__big))) + simd_bitselect((simd_uint2)0,0x80000000,__big); } -static simd_uint3 SIMD_CFUNC simd_uint(simd_float3 __x) { simd_int3 __big = __x > 0x1.0p31f; return simd_uint(simd_int(__x - simd_bitselect((simd_float3)0,0x1.0p31f,__big))) + simd_bitselect((simd_uint3)0,0x80000000,__big); } -static simd_uint4 SIMD_CFUNC simd_uint(simd_float4 __x) { simd_int4 __big = __x > 0x1.0p31f; return simd_uint(simd_int(__x - simd_bitselect((simd_float4)0,0x1.0p31f,__big))) + simd_bitselect((simd_uint4)0,0x80000000,__big); } -static simd_uint8 SIMD_CFUNC simd_uint(simd_float8 __x) { simd_int8 __big = __x > 0x1.0p31f; return simd_uint(simd_int(__x - simd_bitselect((simd_float8)0,0x1.0p31f,__big))) + simd_bitselect((simd_uint8)0,0x80000000,__big); } -static simd_uint16 SIMD_CFUNC simd_uint(simd_float16 __x) { simd_int16 __big = __x > 0x1.0p31f; return simd_uint(simd_int(__x - simd_bitselect((simd_float16)0,0x1.0p31f,__big))) + simd_bitselect((simd_uint16)0,0x80000000,__big); } -static simd_uint2 SIMD_CFUNC simd_uint(simd_long2 __x) { return simd_uint(simd_int(__x)); } -static simd_uint3 SIMD_CFUNC simd_uint(simd_long3 __x) { return simd_uint(simd_int(__x)); } -static simd_uint4 SIMD_CFUNC simd_uint(simd_long4 __x) { return simd_uint(simd_int(__x)); } -static simd_uint8 SIMD_CFUNC simd_uint(simd_long8 __x) { return simd_uint(simd_int(__x)); } -static simd_uint2 SIMD_CFUNC simd_uint(simd_ulong2 __x) { return simd_uint(simd_int(__x)); } -static simd_uint3 SIMD_CFUNC simd_uint(simd_ulong3 __x) { return simd_uint(simd_int(__x)); } -static simd_uint4 SIMD_CFUNC simd_uint(simd_ulong4 __x) { return simd_uint(simd_int(__x)); } -static simd_uint8 SIMD_CFUNC simd_uint(simd_ulong8 __x) { return simd_uint(simd_int(__x)); } -static simd_uint2 SIMD_CFUNC simd_uint(simd_double2 __x) { simd_long2 __big = __x > 0x1.fffffffcp30; return simd_uint(simd_int(__x - simd_bitselect((simd_double2)0,0x1.0p31,__big))) + simd_bitselect((simd_uint2)0,0x80000000,simd_int(__big)); } -static simd_uint3 SIMD_CFUNC simd_uint(simd_double3 __x) { simd_long3 __big = __x > 0x1.fffffffcp30; return simd_uint(simd_int(__x - simd_bitselect((simd_double3)0,0x1.0p31,__big))) + simd_bitselect((simd_uint3)0,0x80000000,simd_int(__big)); } -static simd_uint4 SIMD_CFUNC simd_uint(simd_double4 __x) { simd_long4 __big = __x > 0x1.fffffffcp30; return simd_uint(simd_int(__x - simd_bitselect((simd_double4)0,0x1.0p31,__big))) + simd_bitselect((simd_uint4)0,0x80000000,simd_int(__big)); } -static simd_uint8 SIMD_CFUNC simd_uint(simd_double8 __x) { simd_long8 __big = __x > 0x1.fffffffcp30; return simd_uint(simd_int(__x - simd_bitselect((simd_double8)0,0x1.0p31,__big))) + simd_bitselect((simd_uint8)0,0x80000000,simd_int(__big)); } - -static simd_uint2 SIMD_CFUNC simd_uint_sat(simd_char2 __x) { return simd_uint(simd_max(__x,0)); } -static simd_uint3 SIMD_CFUNC simd_uint_sat(simd_char3 __x) { return simd_uint(simd_max(__x,0)); } -static simd_uint4 SIMD_CFUNC simd_uint_sat(simd_char4 __x) { return simd_uint(simd_max(__x,0)); } -static simd_uint8 SIMD_CFUNC simd_uint_sat(simd_char8 __x) { return simd_uint(simd_max(__x,0)); } -static simd_uint16 SIMD_CFUNC simd_uint_sat(simd_char16 __x) { return simd_uint(simd_max(__x,0)); } -static simd_uint2 SIMD_CFUNC simd_uint_sat(simd_short2 __x) { return simd_uint(simd_max(__x,0)); } -static simd_uint3 SIMD_CFUNC simd_uint_sat(simd_short3 __x) { return simd_uint(simd_max(__x,0)); } -static simd_uint4 SIMD_CFUNC simd_uint_sat(simd_short4 __x) { return simd_uint(simd_max(__x,0)); } -static simd_uint8 SIMD_CFUNC simd_uint_sat(simd_short8 __x) { return simd_uint(simd_max(__x,0)); } -static simd_uint16 SIMD_CFUNC simd_uint_sat(simd_short16 __x) { return simd_uint(simd_max(__x,0)); } -static simd_uint2 SIMD_CFUNC simd_uint_sat(simd_int2 __x) { return simd_uint(simd_max(__x,0)); } -static simd_uint3 SIMD_CFUNC simd_uint_sat(simd_int3 __x) { return simd_uint(simd_max(__x,0)); } -static simd_uint4 SIMD_CFUNC simd_uint_sat(simd_int4 __x) { return simd_uint(simd_max(__x,0)); } -static simd_uint8 SIMD_CFUNC simd_uint_sat(simd_int8 __x) { return simd_uint(simd_max(__x,0)); } -static simd_uint16 SIMD_CFUNC simd_uint_sat(simd_int16 __x) { return simd_uint(simd_max(__x,0)); } -static simd_uint2 SIMD_CFUNC simd_uint_sat(simd_float2 __x) { return simd_bitselect(simd_uint(simd_max(__x,0)), 0xffffffff, __x >= 0x1.0p32f); } -static simd_uint3 SIMD_CFUNC simd_uint_sat(simd_float3 __x) { return simd_bitselect(simd_uint(simd_max(__x,0)), 0xffffffff, __x >= 0x1.0p32f); } -static simd_uint4 SIMD_CFUNC simd_uint_sat(simd_float4 __x) { return simd_bitselect(simd_uint(simd_max(__x,0)), 0xffffffff, __x >= 0x1.0p32f); } -static simd_uint8 SIMD_CFUNC simd_uint_sat(simd_float8 __x) { return simd_bitselect(simd_uint(simd_max(__x,0)), 0xffffffff, __x >= 0x1.0p32f); } -static simd_uint16 SIMD_CFUNC simd_uint_sat(simd_float16 __x) { return simd_bitselect(simd_uint(simd_max(__x,0)), 0xffffffff, __x >= 0x1.0p32f); } -static simd_uint2 SIMD_CFUNC simd_uint_sat(simd_long2 __x) { return simd_uint(simd_clamp(__x,0,0xffffffff)); } -static simd_uint3 SIMD_CFUNC simd_uint_sat(simd_long3 __x) { return simd_uint(simd_clamp(__x,0,0xffffffff)); } -static simd_uint4 SIMD_CFUNC simd_uint_sat(simd_long4 __x) { return simd_uint(simd_clamp(__x,0,0xffffffff)); } -static simd_uint8 SIMD_CFUNC simd_uint_sat(simd_long8 __x) { return simd_uint(simd_clamp(__x,0,0xffffffff)); } -static simd_uint2 SIMD_CFUNC simd_uint_sat(simd_double2 __x) { return simd_uint(simd_clamp(__x,0,0xffffffff)); } -static simd_uint3 SIMD_CFUNC simd_uint_sat(simd_double3 __x) { return simd_uint(simd_clamp(__x,0,0xffffffff)); } -static simd_uint4 SIMD_CFUNC simd_uint_sat(simd_double4 __x) { return simd_uint(simd_clamp(__x,0,0xffffffff)); } -static simd_uint8 SIMD_CFUNC simd_uint_sat(simd_double8 __x) { return simd_uint(simd_clamp(__x,0,0xffffffff)); } -static simd_uint2 SIMD_CFUNC simd_uint_sat(simd_uchar2 __x) { return simd_uint(__x); } -static simd_uint3 SIMD_CFUNC simd_uint_sat(simd_uchar3 __x) { return simd_uint(__x); } -static simd_uint4 SIMD_CFUNC simd_uint_sat(simd_uchar4 __x) { return simd_uint(__x); } -static simd_uint8 SIMD_CFUNC simd_uint_sat(simd_uchar8 __x) { return simd_uint(__x); } -static simd_uint16 SIMD_CFUNC simd_uint_sat(simd_uchar16 __x) { return simd_uint(__x); } -static simd_uint2 SIMD_CFUNC simd_uint_sat(simd_ushort2 __x) { return simd_uint(__x); } -static simd_uint3 SIMD_CFUNC simd_uint_sat(simd_ushort3 __x) { return simd_uint(__x); } -static simd_uint4 SIMD_CFUNC simd_uint_sat(simd_ushort4 __x) { return simd_uint(__x); } -static simd_uint8 SIMD_CFUNC simd_uint_sat(simd_ushort8 __x) { return simd_uint(__x); } -static simd_uint16 SIMD_CFUNC simd_uint_sat(simd_ushort16 __x) { return simd_uint(__x); } -static simd_uint2 SIMD_CFUNC simd_uint_sat(simd_uint2 __x) { return __x; } -static simd_uint3 SIMD_CFUNC simd_uint_sat(simd_uint3 __x) { return __x; } -static simd_uint4 SIMD_CFUNC simd_uint_sat(simd_uint4 __x) { return __x; } -static simd_uint8 SIMD_CFUNC simd_uint_sat(simd_uint8 __x) { return __x; } -static simd_uint16 SIMD_CFUNC simd_uint_sat(simd_uint16 __x) { return __x; } -static simd_uint2 SIMD_CFUNC simd_uint_sat(simd_ulong2 __x) { return simd_uint(simd_clamp(__x,0,0xffffffff)); } -static simd_uint3 SIMD_CFUNC simd_uint_sat(simd_ulong3 __x) { return simd_uint(simd_clamp(__x,0,0xffffffff)); } -static simd_uint4 SIMD_CFUNC simd_uint_sat(simd_ulong4 __x) { return simd_uint(simd_clamp(__x,0,0xffffffff)); } -static simd_uint8 SIMD_CFUNC simd_uint_sat(simd_ulong8 __x) { return simd_uint(simd_clamp(__x,0,0xffffffff)); } - -static simd_float2 SIMD_CFUNC simd_float(simd_char2 __x) { return (simd_float2)(simd_int(__x) + 0x4b400000) - 0x1.8p23f; } -static simd_float3 SIMD_CFUNC simd_float(simd_char3 __x) { return (simd_float3)(simd_int(__x) + 0x4b400000) - 0x1.8p23f; } -static simd_float4 SIMD_CFUNC simd_float(simd_char4 __x) { return (simd_float4)(simd_int(__x) + 0x4b400000) - 0x1.8p23f; } -static simd_float8 SIMD_CFUNC simd_float(simd_char8 __x) { return (simd_float8)(simd_int(__x) + 0x4b400000) - 0x1.8p23f; } -static simd_float16 SIMD_CFUNC simd_float(simd_char16 __x) { return (simd_float16)(simd_int(__x) + 0x4b400000) - 0x1.8p23f; } -static simd_float2 SIMD_CFUNC simd_float(simd_uchar2 __x) { return (simd_float2)(simd_int(__x) + 0x4b400000) - 0x1.8p23f; } -static simd_float3 SIMD_CFUNC simd_float(simd_uchar3 __x) { return (simd_float3)(simd_int(__x) + 0x4b400000) - 0x1.8p23f; } -static simd_float4 SIMD_CFUNC simd_float(simd_uchar4 __x) { return (simd_float4)(simd_int(__x) + 0x4b400000) - 0x1.8p23f; } -static simd_float8 SIMD_CFUNC simd_float(simd_uchar8 __x) { return (simd_float8)(simd_int(__x) + 0x4b400000) - 0x1.8p23f; } -static simd_float16 SIMD_CFUNC simd_float(simd_uchar16 __x) { return (simd_float16)(simd_int(__x) + 0x4b400000) - 0x1.8p23f; } -static simd_float2 SIMD_CFUNC simd_float(simd_short2 __x) { return (simd_float2)(simd_int(__x) + 0x4b400000) - 0x1.8p23f; } -static simd_float3 SIMD_CFUNC simd_float(simd_short3 __x) { return (simd_float3)(simd_int(__x) + 0x4b400000) - 0x1.8p23f; } -static simd_float4 SIMD_CFUNC simd_float(simd_short4 __x) { return (simd_float4)(simd_int(__x) + 0x4b400000) - 0x1.8p23f; } -static simd_float8 SIMD_CFUNC simd_float(simd_short8 __x) { return (simd_float8)(simd_int(__x) + 0x4b400000) - 0x1.8p23f; } -static simd_float16 SIMD_CFUNC simd_float(simd_short16 __x) { return (simd_float16)(simd_int(__x) + 0x4b400000) - 0x1.8p23f; } -static simd_float2 SIMD_CFUNC simd_float(simd_ushort2 __x) { return (simd_float2)(simd_int(__x) + 0x4b400000) - 0x1.8p23f; } -static simd_float3 SIMD_CFUNC simd_float(simd_ushort3 __x) { return (simd_float3)(simd_int(__x) + 0x4b400000) - 0x1.8p23f; } -static simd_float4 SIMD_CFUNC simd_float(simd_ushort4 __x) { return (simd_float4)(simd_int(__x) + 0x4b400000) - 0x1.8p23f; } -static simd_float8 SIMD_CFUNC simd_float(simd_ushort8 __x) { return (simd_float8)(simd_int(__x) + 0x4b400000) - 0x1.8p23f; } -static simd_float16 SIMD_CFUNC simd_float(simd_ushort16 __x) { return (simd_float16)(simd_int(__x) + 0x4b400000) - 0x1.8p23f; } -static simd_float2 SIMD_CFUNC simd_float(simd_int2 __x) { return __builtin_convertvector(__x,simd_float2); } -static simd_float3 SIMD_CFUNC simd_float(simd_int3 __x) { return __builtin_convertvector(__x,simd_float3); } -static simd_float4 SIMD_CFUNC simd_float(simd_int4 __x) { return __builtin_convertvector(__x,simd_float4); } -static simd_float8 SIMD_CFUNC simd_float(simd_int8 __x) { return __builtin_convertvector(__x,simd_float8); } -static simd_float16 SIMD_CFUNC simd_float(simd_int16 __x) { return __builtin_convertvector(__x,simd_float16); } -static simd_float2 SIMD_CFUNC simd_float(simd_uint2 __x) { return __builtin_convertvector(__x,simd_float2); } -static simd_float3 SIMD_CFUNC simd_float(simd_uint3 __x) { return __builtin_convertvector(__x,simd_float3); } -static simd_float4 SIMD_CFUNC simd_float(simd_uint4 __x) { return __builtin_convertvector(__x,simd_float4); } -static simd_float8 SIMD_CFUNC simd_float(simd_uint8 __x) { return __builtin_convertvector(__x,simd_float8); } -static simd_float16 SIMD_CFUNC simd_float(simd_uint16 __x) { return __builtin_convertvector(__x,simd_float16); } -static simd_float2 SIMD_CFUNC simd_float(simd_float2 __x) { return __x; } -static simd_float3 SIMD_CFUNC simd_float(simd_float3 __x) { return __x; } -static simd_float4 SIMD_CFUNC simd_float(simd_float4 __x) { return __x; } -static simd_float8 SIMD_CFUNC simd_float(simd_float8 __x) { return __x; } -static simd_float16 SIMD_CFUNC simd_float(simd_float16 __x) { return __x; } -static simd_float2 SIMD_CFUNC simd_float(simd_long2 __x) { return __builtin_convertvector(__x,simd_float2); } -static simd_float3 SIMD_CFUNC simd_float(simd_long3 __x) { return __builtin_convertvector(__x,simd_float3); } -static simd_float4 SIMD_CFUNC simd_float(simd_long4 __x) { return __builtin_convertvector(__x,simd_float4); } -static simd_float8 SIMD_CFUNC simd_float(simd_long8 __x) { return __builtin_convertvector(__x,simd_float8); } -static simd_float2 SIMD_CFUNC simd_float(simd_ulong2 __x) { return __builtin_convertvector(__x,simd_float2); } -static simd_float3 SIMD_CFUNC simd_float(simd_ulong3 __x) { return __builtin_convertvector(__x,simd_float3); } -static simd_float4 SIMD_CFUNC simd_float(simd_ulong4 __x) { return __builtin_convertvector(__x,simd_float4); } -static simd_float8 SIMD_CFUNC simd_float(simd_ulong8 __x) { return __builtin_convertvector(__x,simd_float8); } -static simd_float2 SIMD_CFUNC simd_float(simd_double2 __x) { return __builtin_convertvector(__x,simd_float2); } -static simd_float3 SIMD_CFUNC simd_float(simd_double3 __x) { return __builtin_convertvector(__x,simd_float3); } -static simd_float4 SIMD_CFUNC simd_float(simd_double4 __x) { return __builtin_convertvector(__x,simd_float4); } -static simd_float8 SIMD_CFUNC simd_float(simd_double8 __x) { return __builtin_convertvector(__x,simd_float8); } - -static simd_long2 SIMD_CFUNC simd_long(simd_char2 __x) { return __builtin_convertvector(__x,simd_long2); } -static simd_long3 SIMD_CFUNC simd_long(simd_char3 __x) { return __builtin_convertvector(__x,simd_long3); } -static simd_long4 SIMD_CFUNC simd_long(simd_char4 __x) { return __builtin_convertvector(__x,simd_long4); } -static simd_long8 SIMD_CFUNC simd_long(simd_char8 __x) { return __builtin_convertvector(__x,simd_long8); } -static simd_long2 SIMD_CFUNC simd_long(simd_uchar2 __x) { return __builtin_convertvector(__x,simd_long2); } -static simd_long3 SIMD_CFUNC simd_long(simd_uchar3 __x) { return __builtin_convertvector(__x,simd_long3); } -static simd_long4 SIMD_CFUNC simd_long(simd_uchar4 __x) { return __builtin_convertvector(__x,simd_long4); } -static simd_long8 SIMD_CFUNC simd_long(simd_uchar8 __x) { return __builtin_convertvector(__x,simd_long8); } -static simd_long2 SIMD_CFUNC simd_long(simd_short2 __x) { return __builtin_convertvector(__x,simd_long2); } -static simd_long3 SIMD_CFUNC simd_long(simd_short3 __x) { return __builtin_convertvector(__x,simd_long3); } -static simd_long4 SIMD_CFUNC simd_long(simd_short4 __x) { return __builtin_convertvector(__x,simd_long4); } -static simd_long8 SIMD_CFUNC simd_long(simd_short8 __x) { return __builtin_convertvector(__x,simd_long8); } -static simd_long2 SIMD_CFUNC simd_long(simd_ushort2 __x) { return __builtin_convertvector(__x,simd_long2); } -static simd_long3 SIMD_CFUNC simd_long(simd_ushort3 __x) { return __builtin_convertvector(__x,simd_long3); } -static simd_long4 SIMD_CFUNC simd_long(simd_ushort4 __x) { return __builtin_convertvector(__x,simd_long4); } -static simd_long8 SIMD_CFUNC simd_long(simd_ushort8 __x) { return __builtin_convertvector(__x,simd_long8); } -static simd_long2 SIMD_CFUNC simd_long(simd_int2 __x) { return __builtin_convertvector(__x,simd_long2); } -static simd_long3 SIMD_CFUNC simd_long(simd_int3 __x) { return __builtin_convertvector(__x,simd_long3); } -static simd_long4 SIMD_CFUNC simd_long(simd_int4 __x) { return __builtin_convertvector(__x,simd_long4); } -static simd_long8 SIMD_CFUNC simd_long(simd_int8 __x) { return __builtin_convertvector(__x,simd_long8); } -static simd_long2 SIMD_CFUNC simd_long(simd_uint2 __x) { return __builtin_convertvector(__x,simd_long2); } -static simd_long3 SIMD_CFUNC simd_long(simd_uint3 __x) { return __builtin_convertvector(__x,simd_long3); } -static simd_long4 SIMD_CFUNC simd_long(simd_uint4 __x) { return __builtin_convertvector(__x,simd_long4); } -static simd_long8 SIMD_CFUNC simd_long(simd_uint8 __x) { return __builtin_convertvector(__x,simd_long8); } -static simd_long2 SIMD_CFUNC simd_long(simd_float2 __x) { return __builtin_convertvector(__x,simd_long2); } -static simd_long3 SIMD_CFUNC simd_long(simd_float3 __x) { return __builtin_convertvector(__x,simd_long3); } -static simd_long4 SIMD_CFUNC simd_long(simd_float4 __x) { return __builtin_convertvector(__x,simd_long4); } -static simd_long8 SIMD_CFUNC simd_long(simd_float8 __x) { return __builtin_convertvector(__x,simd_long8); } -static simd_long2 SIMD_CFUNC simd_long(simd_long2 __x) { return __x; } -static simd_long3 SIMD_CFUNC simd_long(simd_long3 __x) { return __x; } -static simd_long4 SIMD_CFUNC simd_long(simd_long4 __x) { return __x; } -static simd_long8 SIMD_CFUNC simd_long(simd_long8 __x) { return __x; } -static simd_long2 SIMD_CFUNC simd_long(simd_ulong2 __x) { return (simd_long2)__x; } -static simd_long3 SIMD_CFUNC simd_long(simd_ulong3 __x) { return (simd_long3)__x; } -static simd_long4 SIMD_CFUNC simd_long(simd_ulong4 __x) { return (simd_long4)__x; } -static simd_long8 SIMD_CFUNC simd_long(simd_ulong8 __x) { return (simd_long8)__x; } -static simd_long2 SIMD_CFUNC simd_long(simd_double2 __x) { return __builtin_convertvector(__x,simd_long2); } -static simd_long3 SIMD_CFUNC simd_long(simd_double3 __x) { return __builtin_convertvector(__x,simd_long3); } -static simd_long4 SIMD_CFUNC simd_long(simd_double4 __x) { return __builtin_convertvector(__x,simd_long4); } -static simd_long8 SIMD_CFUNC simd_long(simd_double8 __x) { return __builtin_convertvector(__x,simd_long8); } - -static simd_long2 SIMD_CFUNC simd_long_sat(simd_char2 __x) { return simd_long(__x); } -static simd_long3 SIMD_CFUNC simd_long_sat(simd_char3 __x) { return simd_long(__x); } -static simd_long4 SIMD_CFUNC simd_long_sat(simd_char4 __x) { return simd_long(__x); } -static simd_long8 SIMD_CFUNC simd_long_sat(simd_char8 __x) { return simd_long(__x); } -static simd_long2 SIMD_CFUNC simd_long_sat(simd_short2 __x) { return simd_long(__x); } -static simd_long3 SIMD_CFUNC simd_long_sat(simd_short3 __x) { return simd_long(__x); } -static simd_long4 SIMD_CFUNC simd_long_sat(simd_short4 __x) { return simd_long(__x); } -static simd_long8 SIMD_CFUNC simd_long_sat(simd_short8 __x) { return simd_long(__x); } -static simd_long2 SIMD_CFUNC simd_long_sat(simd_int2 __x) { return simd_long(__x); } -static simd_long3 SIMD_CFUNC simd_long_sat(simd_int3 __x) { return simd_long(__x); } -static simd_long4 SIMD_CFUNC simd_long_sat(simd_int4 __x) { return simd_long(__x); } -static simd_long8 SIMD_CFUNC simd_long_sat(simd_int8 __x) { return simd_long(__x); } -static simd_long2 SIMD_CFUNC simd_long_sat(simd_float2 __x) { return simd_bitselect(simd_long(simd_max(__x,-0x1.0p63f)), 0x7fffffffffffffff, simd_long(__x >= 0x1.0p63f)); } -static simd_long3 SIMD_CFUNC simd_long_sat(simd_float3 __x) { return simd_bitselect(simd_long(simd_max(__x,-0x1.0p63f)), 0x7fffffffffffffff, simd_long(__x >= 0x1.0p63f)); } -static simd_long4 SIMD_CFUNC simd_long_sat(simd_float4 __x) { return simd_bitselect(simd_long(simd_max(__x,-0x1.0p63f)), 0x7fffffffffffffff, simd_long(__x >= 0x1.0p63f)); } -static simd_long8 SIMD_CFUNC simd_long_sat(simd_float8 __x) { return simd_bitselect(simd_long(simd_max(__x,-0x1.0p63f)), 0x7fffffffffffffff, simd_long(__x >= 0x1.0p63f)); } -static simd_long2 SIMD_CFUNC simd_long_sat(simd_long2 __x) { return __x; } -static simd_long3 SIMD_CFUNC simd_long_sat(simd_long3 __x) { return __x; } -static simd_long4 SIMD_CFUNC simd_long_sat(simd_long4 __x) { return __x; } -static simd_long8 SIMD_CFUNC simd_long_sat(simd_long8 __x) { return __x; } -static simd_long2 SIMD_CFUNC simd_long_sat(simd_double2 __x) { return simd_bitselect(simd_long(simd_max(__x,-0x1.0p63)), 0x7fffffffffffffff, __x >= 0x1.0p63); } -static simd_long3 SIMD_CFUNC simd_long_sat(simd_double3 __x) { return simd_bitselect(simd_long(simd_max(__x,-0x1.0p63)), 0x7fffffffffffffff, __x >= 0x1.0p63); } -static simd_long4 SIMD_CFUNC simd_long_sat(simd_double4 __x) { return simd_bitselect(simd_long(simd_max(__x,-0x1.0p63)), 0x7fffffffffffffff, __x >= 0x1.0p63); } -static simd_long8 SIMD_CFUNC simd_long_sat(simd_double8 __x) { return simd_bitselect(simd_long(simd_max(__x,-0x1.0p63)), 0x7fffffffffffffff, __x >= 0x1.0p63); } -static simd_long2 SIMD_CFUNC simd_long_sat(simd_uchar2 __x) { return simd_long(__x); } -static simd_long3 SIMD_CFUNC simd_long_sat(simd_uchar3 __x) { return simd_long(__x); } -static simd_long4 SIMD_CFUNC simd_long_sat(simd_uchar4 __x) { return simd_long(__x); } -static simd_long8 SIMD_CFUNC simd_long_sat(simd_uchar8 __x) { return simd_long(__x); } -static simd_long2 SIMD_CFUNC simd_long_sat(simd_ushort2 __x) { return simd_long(__x); } -static simd_long3 SIMD_CFUNC simd_long_sat(simd_ushort3 __x) { return simd_long(__x); } -static simd_long4 SIMD_CFUNC simd_long_sat(simd_ushort4 __x) { return simd_long(__x); } -static simd_long8 SIMD_CFUNC simd_long_sat(simd_ushort8 __x) { return simd_long(__x); } -static simd_long2 SIMD_CFUNC simd_long_sat(simd_uint2 __x) { return simd_long(__x); } -static simd_long3 SIMD_CFUNC simd_long_sat(simd_uint3 __x) { return simd_long(__x); } -static simd_long4 SIMD_CFUNC simd_long_sat(simd_uint4 __x) { return simd_long(__x); } -static simd_long8 SIMD_CFUNC simd_long_sat(simd_uint8 __x) { return simd_long(__x); } -static simd_long2 SIMD_CFUNC simd_long_sat(simd_ulong2 __x) { return simd_long(simd_min(__x,0x7fffffffffffffff)); } -static simd_long3 SIMD_CFUNC simd_long_sat(simd_ulong3 __x) { return simd_long(simd_min(__x,0x7fffffffffffffff)); } -static simd_long4 SIMD_CFUNC simd_long_sat(simd_ulong4 __x) { return simd_long(simd_min(__x,0x7fffffffffffffff)); } -static simd_long8 SIMD_CFUNC simd_long_sat(simd_ulong8 __x) { return simd_long(simd_min(__x,0x7fffffffffffffff)); } - -static simd_ulong2 SIMD_CFUNC simd_ulong(simd_char2 __x) { return simd_ulong(simd_long(__x)); } -static simd_ulong3 SIMD_CFUNC simd_ulong(simd_char3 __x) { return simd_ulong(simd_long(__x)); } -static simd_ulong4 SIMD_CFUNC simd_ulong(simd_char4 __x) { return simd_ulong(simd_long(__x)); } -static simd_ulong8 SIMD_CFUNC simd_ulong(simd_char8 __x) { return simd_ulong(simd_long(__x)); } -static simd_ulong2 SIMD_CFUNC simd_ulong(simd_uchar2 __x) { return simd_ulong(simd_long(__x)); } -static simd_ulong3 SIMD_CFUNC simd_ulong(simd_uchar3 __x) { return simd_ulong(simd_long(__x)); } -static simd_ulong4 SIMD_CFUNC simd_ulong(simd_uchar4 __x) { return simd_ulong(simd_long(__x)); } -static simd_ulong8 SIMD_CFUNC simd_ulong(simd_uchar8 __x) { return simd_ulong(simd_long(__x)); } -static simd_ulong2 SIMD_CFUNC simd_ulong(simd_short2 __x) { return simd_ulong(simd_long(__x)); } -static simd_ulong3 SIMD_CFUNC simd_ulong(simd_short3 __x) { return simd_ulong(simd_long(__x)); } -static simd_ulong4 SIMD_CFUNC simd_ulong(simd_short4 __x) { return simd_ulong(simd_long(__x)); } -static simd_ulong8 SIMD_CFUNC simd_ulong(simd_short8 __x) { return simd_ulong(simd_long(__x)); } -static simd_ulong2 SIMD_CFUNC simd_ulong(simd_ushort2 __x) { return simd_ulong(simd_long(__x)); } -static simd_ulong3 SIMD_CFUNC simd_ulong(simd_ushort3 __x) { return simd_ulong(simd_long(__x)); } -static simd_ulong4 SIMD_CFUNC simd_ulong(simd_ushort4 __x) { return simd_ulong(simd_long(__x)); } -static simd_ulong8 SIMD_CFUNC simd_ulong(simd_ushort8 __x) { return simd_ulong(simd_long(__x)); } -static simd_ulong2 SIMD_CFUNC simd_ulong(simd_int2 __x) { return simd_ulong(simd_long(__x)); } -static simd_ulong3 SIMD_CFUNC simd_ulong(simd_int3 __x) { return simd_ulong(simd_long(__x)); } -static simd_ulong4 SIMD_CFUNC simd_ulong(simd_int4 __x) { return simd_ulong(simd_long(__x)); } -static simd_ulong8 SIMD_CFUNC simd_ulong(simd_int8 __x) { return simd_ulong(simd_long(__x)); } -static simd_ulong2 SIMD_CFUNC simd_ulong(simd_uint2 __x) { return simd_ulong(simd_long(__x)); } -static simd_ulong3 SIMD_CFUNC simd_ulong(simd_uint3 __x) { return simd_ulong(simd_long(__x)); } -static simd_ulong4 SIMD_CFUNC simd_ulong(simd_uint4 __x) { return simd_ulong(simd_long(__x)); } -static simd_ulong8 SIMD_CFUNC simd_ulong(simd_uint8 __x) { return simd_ulong(simd_long(__x)); } -static simd_ulong2 SIMD_CFUNC simd_ulong(simd_float2 __x) { simd_int2 __big = __x >= 0x1.0p63f; return simd_ulong(simd_long(__x - simd_bitselect((simd_float2)0,0x1.0p63f,__big))) + simd_bitselect((simd_ulong2)0,0x8000000000000000,simd_long(__big)); } -static simd_ulong3 SIMD_CFUNC simd_ulong(simd_float3 __x) { simd_int3 __big = __x >= 0x1.0p63f; return simd_ulong(simd_long(__x - simd_bitselect((simd_float3)0,0x1.0p63f,__big))) + simd_bitselect((simd_ulong3)0,0x8000000000000000,simd_long(__big)); } -static simd_ulong4 SIMD_CFUNC simd_ulong(simd_float4 __x) { simd_int4 __big = __x >= 0x1.0p63f; return simd_ulong(simd_long(__x - simd_bitselect((simd_float4)0,0x1.0p63f,__big))) + simd_bitselect((simd_ulong4)0,0x8000000000000000,simd_long(__big)); } -static simd_ulong8 SIMD_CFUNC simd_ulong(simd_float8 __x) { simd_int8 __big = __x >= 0x1.0p63f; return simd_ulong(simd_long(__x - simd_bitselect((simd_float8)0,0x1.0p63f,__big))) + simd_bitselect((simd_ulong8)0,0x8000000000000000,simd_long(__big)); } -static simd_ulong2 SIMD_CFUNC simd_ulong(simd_long2 __x) { return (simd_ulong2)__x; } -static simd_ulong3 SIMD_CFUNC simd_ulong(simd_long3 __x) { return (simd_ulong3)__x; } -static simd_ulong4 SIMD_CFUNC simd_ulong(simd_long4 __x) { return (simd_ulong4)__x; } -static simd_ulong8 SIMD_CFUNC simd_ulong(simd_long8 __x) { return (simd_ulong8)__x; } -static simd_ulong2 SIMD_CFUNC simd_ulong(simd_ulong2 __x) { return __x; } -static simd_ulong3 SIMD_CFUNC simd_ulong(simd_ulong3 __x) { return __x; } -static simd_ulong4 SIMD_CFUNC simd_ulong(simd_ulong4 __x) { return __x; } -static simd_ulong8 SIMD_CFUNC simd_ulong(simd_ulong8 __x) { return __x; } -static simd_ulong2 SIMD_CFUNC simd_ulong(simd_double2 __x) { simd_long2 __big = __x >= 0x1.0p63; return simd_ulong(simd_long(__x - simd_bitselect((simd_double2)0,0x1.0p63,__big))) + simd_bitselect((simd_ulong2)0,0x8000000000000000,__big); } -static simd_ulong3 SIMD_CFUNC simd_ulong(simd_double3 __x) { simd_long3 __big = __x >= 0x1.0p63; return simd_ulong(simd_long(__x - simd_bitselect((simd_double3)0,0x1.0p63,__big))) + simd_bitselect((simd_ulong3)0,0x8000000000000000,__big); } -static simd_ulong4 SIMD_CFUNC simd_ulong(simd_double4 __x) { simd_long4 __big = __x >= 0x1.0p63; return simd_ulong(simd_long(__x - simd_bitselect((simd_double4)0,0x1.0p63,__big))) + simd_bitselect((simd_ulong4)0,0x8000000000000000,__big); } -static simd_ulong8 SIMD_CFUNC simd_ulong(simd_double8 __x) { simd_long8 __big = __x >= 0x1.0p63; return simd_ulong(simd_long(__x - simd_bitselect((simd_double8)0,0x1.0p63,__big))) + simd_bitselect((simd_ulong8)0,0x8000000000000000,__big); } - -static simd_ulong2 SIMD_CFUNC simd_ulong_sat(simd_char2 __x) { return simd_ulong(simd_max(__x,0)); } -static simd_ulong3 SIMD_CFUNC simd_ulong_sat(simd_char3 __x) { return simd_ulong(simd_max(__x,0)); } -static simd_ulong4 SIMD_CFUNC simd_ulong_sat(simd_char4 __x) { return simd_ulong(simd_max(__x,0)); } -static simd_ulong8 SIMD_CFUNC simd_ulong_sat(simd_char8 __x) { return simd_ulong(simd_max(__x,0)); } -static simd_ulong2 SIMD_CFUNC simd_ulong_sat(simd_short2 __x) { return simd_ulong(simd_max(__x,0)); } -static simd_ulong3 SIMD_CFUNC simd_ulong_sat(simd_short3 __x) { return simd_ulong(simd_max(__x,0)); } -static simd_ulong4 SIMD_CFUNC simd_ulong_sat(simd_short4 __x) { return simd_ulong(simd_max(__x,0)); } -static simd_ulong8 SIMD_CFUNC simd_ulong_sat(simd_short8 __x) { return simd_ulong(simd_max(__x,0)); } -static simd_ulong2 SIMD_CFUNC simd_ulong_sat(simd_int2 __x) { return simd_ulong(simd_max(__x,0)); } -static simd_ulong3 SIMD_CFUNC simd_ulong_sat(simd_int3 __x) { return simd_ulong(simd_max(__x,0)); } -static simd_ulong4 SIMD_CFUNC simd_ulong_sat(simd_int4 __x) { return simd_ulong(simd_max(__x,0)); } -static simd_ulong8 SIMD_CFUNC simd_ulong_sat(simd_int8 __x) { return simd_ulong(simd_max(__x,0)); } -static simd_ulong2 SIMD_CFUNC simd_ulong_sat(simd_float2 __x) { return simd_bitselect(simd_ulong(simd_max(__x,0.f)), 0xffffffffffffffff, simd_long(__x >= 0x1.0p64f)); } -static simd_ulong3 SIMD_CFUNC simd_ulong_sat(simd_float3 __x) { return simd_bitselect(simd_ulong(simd_max(__x,0.f)), 0xffffffffffffffff, simd_long(__x >= 0x1.0p64f)); } -static simd_ulong4 SIMD_CFUNC simd_ulong_sat(simd_float4 __x) { return simd_bitselect(simd_ulong(simd_max(__x,0.f)), 0xffffffffffffffff, simd_long(__x >= 0x1.0p64f)); } -static simd_ulong8 SIMD_CFUNC simd_ulong_sat(simd_float8 __x) { return simd_bitselect(simd_ulong(simd_max(__x,0.f)), 0xffffffffffffffff, simd_long(__x >= 0x1.0p64f)); } -static simd_ulong2 SIMD_CFUNC simd_ulong_sat(simd_long2 __x) { return simd_ulong(simd_max(__x,0)); } -static simd_ulong3 SIMD_CFUNC simd_ulong_sat(simd_long3 __x) { return simd_ulong(simd_max(__x,0)); } -static simd_ulong4 SIMD_CFUNC simd_ulong_sat(simd_long4 __x) { return simd_ulong(simd_max(__x,0)); } -static simd_ulong8 SIMD_CFUNC simd_ulong_sat(simd_long8 __x) { return simd_ulong(simd_max(__x,0)); } -static simd_ulong2 SIMD_CFUNC simd_ulong_sat(simd_double2 __x) { return simd_bitselect(simd_ulong(simd_max(__x,0.0)), 0xffffffffffffffff, __x >= 0x1.0p64); } -static simd_ulong3 SIMD_CFUNC simd_ulong_sat(simd_double3 __x) { return simd_bitselect(simd_ulong(simd_max(__x,0.0)), 0xffffffffffffffff, __x >= 0x1.0p64); } -static simd_ulong4 SIMD_CFUNC simd_ulong_sat(simd_double4 __x) { return simd_bitselect(simd_ulong(simd_max(__x,0.0)), 0xffffffffffffffff, __x >= 0x1.0p64); } -static simd_ulong8 SIMD_CFUNC simd_ulong_sat(simd_double8 __x) { return simd_bitselect(simd_ulong(simd_max(__x,0.0)), 0xffffffffffffffff, __x >= 0x1.0p64); } -static simd_ulong2 SIMD_CFUNC simd_ulong_sat(simd_uchar2 __x) { return simd_ulong(__x); } -static simd_ulong3 SIMD_CFUNC simd_ulong_sat(simd_uchar3 __x) { return simd_ulong(__x); } -static simd_ulong4 SIMD_CFUNC simd_ulong_sat(simd_uchar4 __x) { return simd_ulong(__x); } -static simd_ulong8 SIMD_CFUNC simd_ulong_sat(simd_uchar8 __x) { return simd_ulong(__x); } -static simd_ulong2 SIMD_CFUNC simd_ulong_sat(simd_ushort2 __x) { return simd_ulong(__x); } -static simd_ulong3 SIMD_CFUNC simd_ulong_sat(simd_ushort3 __x) { return simd_ulong(__x); } -static simd_ulong4 SIMD_CFUNC simd_ulong_sat(simd_ushort4 __x) { return simd_ulong(__x); } -static simd_ulong8 SIMD_CFUNC simd_ulong_sat(simd_ushort8 __x) { return simd_ulong(__x); } -static simd_ulong2 SIMD_CFUNC simd_ulong_sat(simd_uint2 __x) { return simd_ulong(__x); } -static simd_ulong3 SIMD_CFUNC simd_ulong_sat(simd_uint3 __x) { return simd_ulong(__x); } -static simd_ulong4 SIMD_CFUNC simd_ulong_sat(simd_uint4 __x) { return simd_ulong(__x); } -static simd_ulong8 SIMD_CFUNC simd_ulong_sat(simd_uint8 __x) { return simd_ulong(__x); } -static simd_ulong2 SIMD_CFUNC simd_ulong_sat(simd_ulong2 __x) { return __x; } -static simd_ulong3 SIMD_CFUNC simd_ulong_sat(simd_ulong3 __x) { return __x; } -static simd_ulong4 SIMD_CFUNC simd_ulong_sat(simd_ulong4 __x) { return __x; } -static simd_ulong8 SIMD_CFUNC simd_ulong_sat(simd_ulong8 __x) { return __x; } - -static simd_double2 SIMD_CFUNC simd_double(simd_char2 __x) { return simd_double(simd_int(__x)); } -static simd_double3 SIMD_CFUNC simd_double(simd_char3 __x) { return simd_double(simd_int(__x)); } -static simd_double4 SIMD_CFUNC simd_double(simd_char4 __x) { return simd_double(simd_int(__x)); } -static simd_double8 SIMD_CFUNC simd_double(simd_char8 __x) { return simd_double(simd_int(__x)); } -static simd_double2 SIMD_CFUNC simd_double(simd_uchar2 __x) { return simd_double(simd_int(__x)); } -static simd_double3 SIMD_CFUNC simd_double(simd_uchar3 __x) { return simd_double(simd_int(__x)); } -static simd_double4 SIMD_CFUNC simd_double(simd_uchar4 __x) { return simd_double(simd_int(__x)); } -static simd_double8 SIMD_CFUNC simd_double(simd_uchar8 __x) { return simd_double(simd_int(__x)); } -static simd_double2 SIMD_CFUNC simd_double(simd_short2 __x) { return simd_double(simd_int(__x)); } -static simd_double3 SIMD_CFUNC simd_double(simd_short3 __x) { return simd_double(simd_int(__x)); } -static simd_double4 SIMD_CFUNC simd_double(simd_short4 __x) { return simd_double(simd_int(__x)); } -static simd_double8 SIMD_CFUNC simd_double(simd_short8 __x) { return simd_double(simd_int(__x)); } -static simd_double2 SIMD_CFUNC simd_double(simd_ushort2 __x) { return simd_double(simd_int(__x)); } -static simd_double3 SIMD_CFUNC simd_double(simd_ushort3 __x) { return simd_double(simd_int(__x)); } -static simd_double4 SIMD_CFUNC simd_double(simd_ushort4 __x) { return simd_double(simd_int(__x)); } -static simd_double8 SIMD_CFUNC simd_double(simd_ushort8 __x) { return simd_double(simd_int(__x)); } -static simd_double2 SIMD_CFUNC simd_double(simd_int2 __x) { return __builtin_convertvector(__x, simd_double2); } -static simd_double3 SIMD_CFUNC simd_double(simd_int3 __x) { return __builtin_convertvector(__x, simd_double3); } -static simd_double4 SIMD_CFUNC simd_double(simd_int4 __x) { return __builtin_convertvector(__x, simd_double4); } -static simd_double8 SIMD_CFUNC simd_double(simd_int8 __x) { return __builtin_convertvector(__x, simd_double8); } -static simd_double2 SIMD_CFUNC simd_double(simd_uint2 __x) { return __builtin_convertvector(__x, simd_double2); } -static simd_double3 SIMD_CFUNC simd_double(simd_uint3 __x) { return __builtin_convertvector(__x, simd_double3); } -static simd_double4 SIMD_CFUNC simd_double(simd_uint4 __x) { return __builtin_convertvector(__x, simd_double4); } -static simd_double8 SIMD_CFUNC simd_double(simd_uint8 __x) { return __builtin_convertvector(__x, simd_double8); } -static simd_double2 SIMD_CFUNC simd_double(simd_float2 __x) { return __builtin_convertvector(__x, simd_double2); } -static simd_double3 SIMD_CFUNC simd_double(simd_float3 __x) { return __builtin_convertvector(__x, simd_double3); } -static simd_double4 SIMD_CFUNC simd_double(simd_float4 __x) { return __builtin_convertvector(__x, simd_double4); } -static simd_double8 SIMD_CFUNC simd_double(simd_float8 __x) { return __builtin_convertvector(__x, simd_double8); } -static simd_double2 SIMD_CFUNC simd_double(simd_long2 __x) { return __builtin_convertvector(__x, simd_double2); } -static simd_double3 SIMD_CFUNC simd_double(simd_long3 __x) { return __builtin_convertvector(__x, simd_double3); } -static simd_double4 SIMD_CFUNC simd_double(simd_long4 __x) { return __builtin_convertvector(__x, simd_double4); } -static simd_double8 SIMD_CFUNC simd_double(simd_long8 __x) { return __builtin_convertvector(__x, simd_double8); } -static simd_double2 SIMD_CFUNC simd_double(simd_ulong2 __x) { return __builtin_convertvector(__x, simd_double2); } -static simd_double3 SIMD_CFUNC simd_double(simd_ulong3 __x) { return __builtin_convertvector(__x, simd_double3); } -static simd_double4 SIMD_CFUNC simd_double(simd_ulong4 __x) { return __builtin_convertvector(__x, simd_double4); } -static simd_double8 SIMD_CFUNC simd_double(simd_ulong8 __x) { return __builtin_convertvector(__x, simd_double8); } -static simd_double2 SIMD_CFUNC simd_double(simd_double2 __x) { return __builtin_convertvector(__x, simd_double2); } -static simd_double3 SIMD_CFUNC simd_double(simd_double3 __x) { return __builtin_convertvector(__x, simd_double3); } -static simd_double4 SIMD_CFUNC simd_double(simd_double4 __x) { return __builtin_convertvector(__x, simd_double4); } -static simd_double8 SIMD_CFUNC simd_double(simd_double8 __x) { return __builtin_convertvector(__x, simd_double8); } - -#ifdef __cplusplus -} -#endif -#endif // SIMD_COMPILER_HAS_REQUIRED_FEATURES -#endif // __SIMD_CONVERSION_HEADER__ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/simd/logic.h b/lib/libc/include/x86_64-macos-gnu/simd/logic.h deleted file mode 100644 index 38bd9bf58c..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/simd/logic.h +++ /dev/null @@ -1,1315 +0,0 @@ -/*! @header - * The interfaces declared in this header provide logical and bitwise - * operations on vectors. Some of these function operate elementwise, - * and some produce a scalar result that depends on all lanes of the input. - * - * For functions returning a boolean value, the return type in C and - * Objective-C is _Bool; for C++ it is bool. - * - * Function Result - * ------------------------------------------------------------------ - * simd_all(comparison) True if and only if the comparison is true - * in every vector lane. e.g.: - * - * if (simd_all(x == 0.0f)) { - * // executed if every lane of x - * // contains zero. - * } - * - * The precise function of simd_all is to - * return the high-order bit of the result - * of a horizontal bitwise AND of all vector - * lanes. - * - * simd_any(comparison) True if and only if the comparison is true - * in at least one vector lane. e.g.: - * - * if (simd_any(x < 0.0f)) { - * // executed if any lane of x - * // contains a negative value. - * } - * - * The precise function of simd_all is to - * return the high-order bit of the result - * of a horizontal bitwise OR of all vector - * lanes. - * - * simd_select(x,y,mask) For each lane in the result, selects the - * corresponding element of x if the high- - * order bit of the corresponding element of - * mask is 0, and the corresponding element - * of y otherwise. - * - * simd_bitselect(x,y,mask) For each bit in the result, selects the - * corresponding bit of x if the corresponding - * bit of mask is clear, and the corresponding - * of y otherwise. - * - * In C++, these functions are available under the simd:: namespace: - * - * C++ Function Equivalent C Function - * -------------------------------------------------------------------- - * simd::all(comparison) simd_all(comparison) - * simd::any(comparison) simd_any(comparison) - * simd::select(x,y,mask) simd_select(x,y,mask) - * simd::bitselect(x,y,mask) simd_bitselect(x,y,mask) - * - * @copyright 2014-2017 Apple, Inc. All rights reserved. - * @unsorted */ - -#ifndef SIMD_LOGIC_HEADER -#define SIMD_LOGIC_HEADER - -#include -#if SIMD_COMPILER_HAS_REQUIRED_FEATURES -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_char2 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_char3 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_char4 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_char8 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_char16 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_char32 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_char64 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_uchar2 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_uchar3 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_uchar4 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_uchar8 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_uchar16 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_uchar32 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_uchar64 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_short2 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_short3 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_short4 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_short8 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_short16 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_short32 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_ushort2 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_ushort3 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_ushort4 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_ushort8 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_ushort16 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_ushort32 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_int2 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_int3 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_int4 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_int8 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_int16 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_uint2 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_uint3 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_uint4 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_uint8 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_uint16 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_long2 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_long3 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_long4 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_long8 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_ulong2 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_ulong3 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_ulong4 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_any(simd_ulong8 x); -/*! @abstract True if and only if the high-order bit of any lane of the - * vector is set. - * @discussion Deprecated. Use simd_any instead. */ -#define vector_any simd_any - -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_char2 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_char3 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_char4 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_char8 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_char16 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_char32 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_char64 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_uchar2 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_uchar3 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_uchar4 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_uchar8 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_uchar16 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_uchar32 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_uchar64 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_short2 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_short3 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_short4 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_short8 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_short16 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_short32 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_ushort2 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_ushort3 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_ushort4 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_ushort8 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_ushort16 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_ushort32 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_int2 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_int3 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_int4 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_int8 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_int16 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_uint2 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_uint3 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_uint4 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_uint8 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_uint16 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_long2 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_long3 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_long4 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_long8 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_ulong2 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_ulong3 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_ulong4 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. */ -static inline SIMD_CFUNC simd_bool simd_all(simd_ulong8 x); -/*! @abstract True if and only if the high-order bit of every lane of the - * vector is set. - * @discussion Deprecated. Use simd_all instead. */ -#define vector_all simd_all - -/*! @abstract For each lane in the result, selects the corresponding element - * of x or y according to whether the high-order bit of the corresponding - * lane of mask is 0 or 1, respectively. */ -static inline SIMD_CFUNC simd_float2 simd_select(simd_float2 x, simd_float2 y, simd_int2 mask); -/*! @abstract For each lane in the result, selects the corresponding element - * of x or y according to whether the high-order bit of the corresponding - * lane of mask is 0 or 1, respectively. */ -static inline SIMD_CFUNC simd_float3 simd_select(simd_float3 x, simd_float3 y, simd_int3 mask); -/*! @abstract For each lane in the result, selects the corresponding element - * of x or y according to whether the high-order bit of the corresponding - * lane of mask is 0 or 1, respectively. */ -static inline SIMD_CFUNC simd_float4 simd_select(simd_float4 x, simd_float4 y, simd_int4 mask); -/*! @abstract For each lane in the result, selects the corresponding element - * of x or y according to whether the high-order bit of the corresponding - * lane of mask is 0 or 1, respectively. */ -static inline SIMD_CFUNC simd_float8 simd_select(simd_float8 x, simd_float8 y, simd_int8 mask); -/*! @abstract For each lane in the result, selects the corresponding element - * of x or y according to whether the high-order bit of the corresponding - * lane of mask is 0 or 1, respectively. */ -static inline SIMD_CFUNC simd_float16 simd_select(simd_float16 x, simd_float16 y, simd_int16 mask); -/*! @abstract For each lane in the result, selects the corresponding element - * of x or y according to whether the high-order bit of the corresponding - * lane of mask is 0 or 1, respectively. */ -static inline SIMD_CFUNC simd_double2 simd_select(simd_double2 x, simd_double2 y, simd_long2 mask); -/*! @abstract For each lane in the result, selects the corresponding element - * of x or y according to whether the high-order bit of the corresponding - * lane of mask is 0 or 1, respectively. */ -static inline SIMD_CFUNC simd_double3 simd_select(simd_double3 x, simd_double3 y, simd_long3 mask); -/*! @abstract For each lane in the result, selects the corresponding element - * of x or y according to whether the high-order bit of the corresponding - * lane of mask is 0 or 1, respectively. */ -static inline SIMD_CFUNC simd_double4 simd_select(simd_double4 x, simd_double4 y, simd_long4 mask); -/*! @abstract For each lane in the result, selects the corresponding element - * of x or y according to whether the high-order bit of the corresponding - * lane of mask is 0 or 1, respectively. */ -static inline SIMD_CFUNC simd_double8 simd_select(simd_double8 x, simd_double8 y, simd_long8 mask); -/*! @abstract For each lane in the result, selects the corresponding element - * of x or y according to whether the high-order bit of the corresponding - * lane of mask is 0 or 1, respectively. - * @discussion Deprecated. Use simd_select instead. */ -#define vector_select simd_select - -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_char2 simd_bitselect(simd_char2 x, simd_char2 y, simd_char2 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_char3 simd_bitselect(simd_char3 x, simd_char3 y, simd_char3 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_char4 simd_bitselect(simd_char4 x, simd_char4 y, simd_char4 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_char8 simd_bitselect(simd_char8 x, simd_char8 y, simd_char8 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_char16 simd_bitselect(simd_char16 x, simd_char16 y, simd_char16 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_char32 simd_bitselect(simd_char32 x, simd_char32 y, simd_char32 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_char64 simd_bitselect(simd_char64 x, simd_char64 y, simd_char64 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_uchar2 simd_bitselect(simd_uchar2 x, simd_uchar2 y, simd_char2 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_uchar3 simd_bitselect(simd_uchar3 x, simd_uchar3 y, simd_char3 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_uchar4 simd_bitselect(simd_uchar4 x, simd_uchar4 y, simd_char4 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_uchar8 simd_bitselect(simd_uchar8 x, simd_uchar8 y, simd_char8 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_uchar16 simd_bitselect(simd_uchar16 x, simd_uchar16 y, simd_char16 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_uchar32 simd_bitselect(simd_uchar32 x, simd_uchar32 y, simd_char32 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_uchar64 simd_bitselect(simd_uchar64 x, simd_uchar64 y, simd_char64 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_short2 simd_bitselect(simd_short2 x, simd_short2 y, simd_short2 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_short3 simd_bitselect(simd_short3 x, simd_short3 y, simd_short3 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_short4 simd_bitselect(simd_short4 x, simd_short4 y, simd_short4 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_short8 simd_bitselect(simd_short8 x, simd_short8 y, simd_short8 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_short16 simd_bitselect(simd_short16 x, simd_short16 y, simd_short16 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_short32 simd_bitselect(simd_short32 x, simd_short32 y, simd_short32 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_ushort2 simd_bitselect(simd_ushort2 x, simd_ushort2 y, simd_short2 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_ushort3 simd_bitselect(simd_ushort3 x, simd_ushort3 y, simd_short3 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_ushort4 simd_bitselect(simd_ushort4 x, simd_ushort4 y, simd_short4 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_ushort8 simd_bitselect(simd_ushort8 x, simd_ushort8 y, simd_short8 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_ushort16 simd_bitselect(simd_ushort16 x, simd_ushort16 y, simd_short16 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_ushort32 simd_bitselect(simd_ushort32 x, simd_ushort32 y, simd_short32 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_int2 simd_bitselect(simd_int2 x, simd_int2 y, simd_int2 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_int3 simd_bitselect(simd_int3 x, simd_int3 y, simd_int3 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_int4 simd_bitselect(simd_int4 x, simd_int4 y, simd_int4 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_int8 simd_bitselect(simd_int8 x, simd_int8 y, simd_int8 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_int16 simd_bitselect(simd_int16 x, simd_int16 y, simd_int16 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_uint2 simd_bitselect(simd_uint2 x, simd_uint2 y, simd_int2 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_uint3 simd_bitselect(simd_uint3 x, simd_uint3 y, simd_int3 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_uint4 simd_bitselect(simd_uint4 x, simd_uint4 y, simd_int4 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_uint8 simd_bitselect(simd_uint8 x, simd_uint8 y, simd_int8 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_uint16 simd_bitselect(simd_uint16 x, simd_uint16 y, simd_int16 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_float2 simd_bitselect(simd_float2 x, simd_float2 y, simd_int2 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_float3 simd_bitselect(simd_float3 x, simd_float3 y, simd_int3 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_float4 simd_bitselect(simd_float4 x, simd_float4 y, simd_int4 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_float8 simd_bitselect(simd_float8 x, simd_float8 y, simd_int8 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_float16 simd_bitselect(simd_float16 x, simd_float16 y, simd_int16 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_long2 simd_bitselect(simd_long2 x, simd_long2 y, simd_long2 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_long3 simd_bitselect(simd_long3 x, simd_long3 y, simd_long3 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_long4 simd_bitselect(simd_long4 x, simd_long4 y, simd_long4 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_long8 simd_bitselect(simd_long8 x, simd_long8 y, simd_long8 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_ulong2 simd_bitselect(simd_ulong2 x, simd_ulong2 y, simd_long2 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_ulong3 simd_bitselect(simd_ulong3 x, simd_ulong3 y, simd_long3 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_ulong4 simd_bitselect(simd_ulong4 x, simd_ulong4 y, simd_long4 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_ulong8 simd_bitselect(simd_ulong8 x, simd_ulong8 y, simd_long8 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_double2 simd_bitselect(simd_double2 x, simd_double2 y, simd_long2 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_double3 simd_bitselect(simd_double3 x, simd_double3 y, simd_long3 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_double4 simd_bitselect(simd_double4 x, simd_double4 y, simd_long4 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ -static inline SIMD_CFUNC simd_double8 simd_bitselect(simd_double8 x, simd_double8 y, simd_long8 mask); -/*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. - * @discussion Deprecated. Use simd_bitselect instead. */ -#define vector_bitselect simd_bitselect - -#ifdef __cplusplus -} /* extern "C" */ - -namespace simd { - /*! @abstract True if and only if the high-order bit of every lane is set. */ - template static SIMD_CPPFUNC simd_bool all(const inttypeN predicate) { return ::simd_all(predicate); } - /*! @abstract True if and only if the high-order bit of any lane is set. */ - template static SIMD_CPPFUNC simd_bool any(const inttypeN predicate) { return ::simd_any(predicate); } - /*! @abstract Each lane of the result is selected from the corresponding lane - * of x or y according to whether the high-order bit of the corresponding - * lane of mask is 0 or 1, respectively. */ - template static SIMD_CPPFUNC fptypeN select(const fptypeN x, const fptypeN y, const inttypeN predicate) { return ::simd_select(x,y,predicate); } - /*! @abstract For each bit in the result, selects the corresponding bit of x - * or y according to whether the corresponding bit of mask is 0 or 1, - * respectively. */ - template static SIMD_CPPFUNC typeN bitselect(const typeN x, const typeN y, const inttypeN mask) { return ::simd_bitselect(x,y,mask); } -} - -extern "C" { -#endif /* __cplusplus */ - -#pragma mark - Implementations - -static inline SIMD_CFUNC simd_bool simd_any(simd_char2 x) { -#if defined __SSE2__ - return (_mm_movemask_epi8(simd_make_char16_undef(x)) & 0x3); -#elif defined __arm64__ - return simd_any(x.xyxy); -#else - union { uint16_t i; simd_char2 v; } u = { .v = x }; - return (u.i & 0x8080); -#endif -} -static inline SIMD_CFUNC simd_bool simd_any(simd_char3 x) { -#if defined __SSE2__ - return (_mm_movemask_epi8(simd_make_char16_undef(x)) & 0x7); -#elif defined __arm64__ - return simd_any(x.xyzz); -#else - union { uint32_t i; simd_char3 v; } u = { .v = x }; - return (u.i & 0x808080); -#endif -} -static inline SIMD_CFUNC simd_bool simd_any(simd_char4 x) { -#if defined __SSE2__ - return (_mm_movemask_epi8(simd_make_char16_undef(x)) & 0xf); -#elif defined __arm64__ - return simd_any(x.xyzwxyzw); -#else - union { uint32_t i; simd_char4 v; } u = { .v = x }; - return (u.i & 0x80808080); -#endif -} -static inline SIMD_CFUNC simd_bool simd_any(simd_char8 x) { -#if defined __SSE2__ - return (_mm_movemask_epi8(simd_make_char16_undef(x)) & 0xff); -#elif defined __arm64__ - return vmaxv_u8(x) & 0x80; -#else - union { uint64_t i; simd_char8 v; } u = { .v = x }; - return (u.i & 0x8080808080808080); -#endif -} -static inline SIMD_CFUNC simd_bool simd_any(simd_char16 x) { -#if defined __SSE2__ - return _mm_movemask_epi8(x); -#elif defined __arm64__ - return vmaxvq_u8(x) & 0x80; -#else - return simd_any(x.lo | x.hi); -#endif -} -static inline SIMD_CFUNC simd_bool simd_any(simd_char32 x) { -#if defined __AVX2__ - return _mm256_movemask_epi8(x); -#else - return simd_any(x.lo | x.hi); -#endif -} -static inline SIMD_CFUNC simd_bool simd_any(simd_char64 x) { - return simd_any(x.lo | x.hi); -} -static inline SIMD_CFUNC simd_bool simd_any(simd_uchar2 x) { - return simd_any((simd_char2)x); -} -static inline SIMD_CFUNC simd_bool simd_any(simd_uchar3 x) { - return simd_any((simd_char3)x); -} -static inline SIMD_CFUNC simd_bool simd_any(simd_uchar4 x) { - return simd_any((simd_char4)x); -} -static inline SIMD_CFUNC simd_bool simd_any(simd_uchar8 x) { - return simd_any((simd_char8)x); -} -static inline SIMD_CFUNC simd_bool simd_any(simd_uchar16 x) { - return simd_any((simd_char16)x); -} -static inline SIMD_CFUNC simd_bool simd_any(simd_uchar32 x) { - return simd_any((simd_char32)x); -} -static inline SIMD_CFUNC simd_bool simd_any(simd_uchar64 x) { - return simd_any((simd_char64)x); -} -static inline SIMD_CFUNC simd_bool simd_any(simd_short2 x) { -#if defined __SSE2__ - return (_mm_movemask_epi8(simd_make_short8_undef(x)) & 0xa); -#elif defined __arm64__ - return simd_any(x.xyxy); -#else - union { uint32_t i; simd_short2 v; } u = { .v = x }; - return (u.i & 0x80008000); -#endif -} -static inline SIMD_CFUNC simd_bool simd_any(simd_short3 x) { -#if defined __SSE2__ - return (_mm_movemask_epi8(simd_make_short8_undef(x)) & 0x2a); -#elif defined __arm64__ - return simd_any(x.xyzz); -#else - union { uint64_t i; simd_short3 v; } u = { .v = x }; - return (u.i & 0x800080008000); -#endif -} -static inline SIMD_CFUNC simd_bool simd_any(simd_short4 x) { -#if defined __SSE2__ - return (_mm_movemask_epi8(simd_make_short8_undef(x)) & 0xaa); -#elif defined __arm64__ - return vmaxv_u16(x) & 0x8000; -#else - union { uint64_t i; simd_short4 v; } u = { .v = x }; - return (u.i & 0x8000800080008000); -#endif -} -static inline SIMD_CFUNC simd_bool simd_any(simd_short8 x) { -#if defined __SSE2__ - return (_mm_movemask_epi8(x) & 0xaaaa); -#elif defined __arm64__ - return vmaxvq_u16(x) & 0x8000; -#else - return simd_any(x.lo | x.hi); -#endif -} -static inline SIMD_CFUNC simd_bool simd_any(simd_short16 x) { -#if defined __AVX2__ - return (_mm256_movemask_epi8(x) & 0xaaaaaaaa); -#else - return simd_any(x.lo | x.hi); -#endif -} -static inline SIMD_CFUNC simd_bool simd_any(simd_short32 x) { - return simd_any(x.lo | x.hi); -} -static inline SIMD_CFUNC simd_bool simd_any(simd_ushort2 x) { - return simd_any((simd_short2)x); -} -static inline SIMD_CFUNC simd_bool simd_any(simd_ushort3 x) { - return simd_any((simd_short3)x); -} -static inline SIMD_CFUNC simd_bool simd_any(simd_ushort4 x) { - return simd_any((simd_short4)x); -} -static inline SIMD_CFUNC simd_bool simd_any(simd_ushort8 x) { - return simd_any((simd_short8)x); -} -static inline SIMD_CFUNC simd_bool simd_any(simd_ushort16 x) { - return simd_any((simd_short16)x); -} -static inline SIMD_CFUNC simd_bool simd_any(simd_ushort32 x) { - return simd_any((simd_short32)x); -} -static inline SIMD_CFUNC simd_bool simd_any(simd_int2 x) { -#if defined __SSE2__ - return (_mm_movemask_ps(simd_make_int4_undef(x)) & 0x3); -#elif defined __arm64__ - return vmaxv_u32(x) & 0x80000000; -#else - union { uint64_t i; simd_int2 v; } u = { .v = x }; - return (u.i & 0x8000000080000000); -#endif -} -static inline SIMD_CFUNC simd_bool simd_any(simd_int3 x) { -#if defined __SSE2__ - return (_mm_movemask_ps(simd_make_int4_undef(x)) & 0x7); -#elif defined __arm64__ - return simd_any(x.xyzz); -#else - return (x.x | x.y | x.z) & 0x80000000; -#endif -} -static inline SIMD_CFUNC simd_bool simd_any(simd_int4 x) { -#if defined __SSE2__ - return _mm_movemask_ps(x); -#elif defined __arm64__ - return vmaxvq_u32(x) & 0x80000000; -#else - return simd_any(x.lo | x.hi); -#endif -} -static inline SIMD_CFUNC simd_bool simd_any(simd_int8 x) { -#if defined __AVX__ - return _mm256_movemask_ps(x); -#else - return simd_any(x.lo | x.hi); -#endif -} -static inline SIMD_CFUNC simd_bool simd_any(simd_int16 x) { - return simd_any(x.lo | x.hi); -} -static inline SIMD_CFUNC simd_bool simd_any(simd_uint2 x) { - return simd_any((simd_int2)x); -} -static inline SIMD_CFUNC simd_bool simd_any(simd_uint3 x) { - return simd_any((simd_int3)x); -} -static inline SIMD_CFUNC simd_bool simd_any(simd_uint4 x) { - return simd_any((simd_int4)x); -} -static inline SIMD_CFUNC simd_bool simd_any(simd_uint8 x) { - return simd_any((simd_int8)x); -} -static inline SIMD_CFUNC simd_bool simd_any(simd_uint16 x) { - return simd_any((simd_int16)x); -} -static inline SIMD_CFUNC simd_bool simd_any(simd_long2 x) { -#if defined __SSE2__ - return _mm_movemask_pd(x); -#elif defined __arm64__ - return (x.x | x.y) & 0x8000000000000000U; -#else - return (x.x | x.y) & 0x8000000000000000U; -#endif -} -static inline SIMD_CFUNC simd_bool simd_any(simd_long3 x) { -#if defined __AVX__ - return (_mm256_movemask_pd(simd_make_long4_undef(x)) & 0x7); -#else - return (x.x | x.y | x.z) & 0x8000000000000000U; -#endif -} -static inline SIMD_CFUNC simd_bool simd_any(simd_long4 x) { -#if defined __AVX__ - return _mm256_movemask_pd(x); -#else - return simd_any(x.lo | x.hi); -#endif -} -static inline SIMD_CFUNC simd_bool simd_any(simd_long8 x) { - return simd_any(x.lo | x.hi); -} -static inline SIMD_CFUNC simd_bool simd_any(simd_ulong2 x) { - return simd_any((simd_long2)x); -} -static inline SIMD_CFUNC simd_bool simd_any(simd_ulong3 x) { - return simd_any((simd_long3)x); -} -static inline SIMD_CFUNC simd_bool simd_any(simd_ulong4 x) { - return simd_any((simd_long4)x); -} -static inline SIMD_CFUNC simd_bool simd_any(simd_ulong8 x) { - return simd_any((simd_long8)x); -} - -static inline SIMD_CFUNC simd_bool simd_all(simd_char2 x) { -#if defined __SSE2__ - return (_mm_movemask_epi8(simd_make_char16_undef(x)) & 0x3) == 0x3; -#elif defined __arm64__ - return simd_all(x.xyxy); -#else - union { uint16_t i; simd_char2 v; } u = { .v = x }; - return (u.i & 0x8080) == 0x8080; -#endif -} -static inline SIMD_CFUNC simd_bool simd_all(simd_char3 x) { -#if defined __SSE2__ - return (_mm_movemask_epi8(simd_make_char16_undef(x)) & 0x7) == 0x7; -#elif defined __arm64__ - return simd_all(x.xyzz); -#else - union { uint32_t i; simd_char3 v; } u = { .v = x }; - return (u.i & 0x808080) == 0x808080; -#endif -} -static inline SIMD_CFUNC simd_bool simd_all(simd_char4 x) { -#if defined __SSE2__ - return (_mm_movemask_epi8(simd_make_char16_undef(x)) & 0xf) == 0xf; -#elif defined __arm64__ - return simd_all(x.xyzwxyzw); -#else - union { uint32_t i; simd_char4 v; } u = { .v = x }; - return (u.i & 0x80808080) == 0x80808080; -#endif -} -static inline SIMD_CFUNC simd_bool simd_all(simd_char8 x) { -#if defined __SSE2__ - return (_mm_movemask_epi8(simd_make_char16_undef(x)) & 0xff) == 0xff; -#elif defined __arm64__ - return vminv_u8(x) & 0x80; -#else - union { uint64_t i; simd_char8 v; } u = { .v = x }; - return (u.i & 0x8080808080808080) == 0x8080808080808080; -#endif -} -static inline SIMD_CFUNC simd_bool simd_all(simd_char16 x) { -#if defined __SSE2__ - return _mm_movemask_epi8(x) == 0xffff; -#elif defined __arm64__ - return vminvq_u8(x) & 0x80; -#else - return simd_all(x.lo & x.hi); -#endif -} -static inline SIMD_CFUNC simd_bool simd_all(simd_char32 x) { -#if defined __AVX2__ - return _mm256_movemask_epi8(x) == 0xffffffff; -#else - return simd_all(x.lo & x.hi); -#endif -} -static inline SIMD_CFUNC simd_bool simd_all(simd_char64 x) { - return simd_all(x.lo & x.hi); -} -static inline SIMD_CFUNC simd_bool simd_all(simd_uchar2 x) { - return simd_all((simd_char2)x); -} -static inline SIMD_CFUNC simd_bool simd_all(simd_uchar3 x) { - return simd_all((simd_char3)x); -} -static inline SIMD_CFUNC simd_bool simd_all(simd_uchar4 x) { - return simd_all((simd_char4)x); -} -static inline SIMD_CFUNC simd_bool simd_all(simd_uchar8 x) { - return simd_all((simd_char8)x); -} -static inline SIMD_CFUNC simd_bool simd_all(simd_uchar16 x) { - return simd_all((simd_char16)x); -} -static inline SIMD_CFUNC simd_bool simd_all(simd_uchar32 x) { - return simd_all((simd_char32)x); -} -static inline SIMD_CFUNC simd_bool simd_all(simd_uchar64 x) { - return simd_all((simd_char64)x); -} -static inline SIMD_CFUNC simd_bool simd_all(simd_short2 x) { -#if defined __SSE2__ - return (_mm_movemask_epi8(simd_make_short8_undef(x)) & 0xa) == 0xa; -#elif defined __arm64__ - return simd_all(x.xyxy); -#else - union { uint32_t i; simd_short2 v; } u = { .v = x }; - return (u.i & 0x80008000) == 0x80008000; -#endif -} -static inline SIMD_CFUNC simd_bool simd_all(simd_short3 x) { -#if defined __SSE2__ - return (_mm_movemask_epi8(simd_make_short8_undef(x)) & 0x2a) == 0x2a; -#elif defined __arm64__ - return simd_all(x.xyzz); -#else - union { uint64_t i; simd_short3 v; } u = { .v = x }; - return (u.i & 0x800080008000) == 0x800080008000; -#endif -} -static inline SIMD_CFUNC simd_bool simd_all(simd_short4 x) { -#if defined __SSE2__ - return (_mm_movemask_epi8(simd_make_short8_undef(x)) & 0xaa) == 0xaa; -#elif defined __arm64__ - return vminv_u16(x) & 0x8000; -#else - union { uint64_t i; simd_short4 v; } u = { .v = x }; - return (u.i & 0x8000800080008000) == 0x8000800080008000; -#endif -} -static inline SIMD_CFUNC simd_bool simd_all(simd_short8 x) { -#if defined __SSE2__ - return (_mm_movemask_epi8(x) & 0xaaaa) == 0xaaaa; -#elif defined __arm64__ - return vminvq_u16(x) & 0x8000; -#else - return simd_all(x.lo & x.hi); -#endif -} -static inline SIMD_CFUNC simd_bool simd_all(simd_short16 x) { -#if defined __AVX2__ - return (_mm256_movemask_epi8(x) & 0xaaaaaaaa) == 0xaaaaaaaa; -#else - return simd_all(x.lo & x.hi); -#endif -} -static inline SIMD_CFUNC simd_bool simd_all(simd_short32 x) { - return simd_all(x.lo & x.hi); -} -static inline SIMD_CFUNC simd_bool simd_all(simd_ushort2 x) { - return simd_all((simd_short2)x); -} -static inline SIMD_CFUNC simd_bool simd_all(simd_ushort3 x) { - return simd_all((simd_short3)x); -} -static inline SIMD_CFUNC simd_bool simd_all(simd_ushort4 x) { - return simd_all((simd_short4)x); -} -static inline SIMD_CFUNC simd_bool simd_all(simd_ushort8 x) { - return simd_all((simd_short8)x); -} -static inline SIMD_CFUNC simd_bool simd_all(simd_ushort16 x) { - return simd_all((simd_short16)x); -} -static inline SIMD_CFUNC simd_bool simd_all(simd_ushort32 x) { - return simd_all((simd_short32)x); -} -static inline SIMD_CFUNC simd_bool simd_all(simd_int2 x) { -#if defined __SSE2__ - return (_mm_movemask_ps(simd_make_int4_undef(x)) & 0x3) == 0x3; -#elif defined __arm64__ - return vminv_u32(x) & 0x80000000; -#else - union { uint64_t i; simd_int2 v; } u = { .v = x }; - return (u.i & 0x8000000080000000) == 0x8000000080000000; -#endif -} -static inline SIMD_CFUNC simd_bool simd_all(simd_int3 x) { -#if defined __SSE2__ - return (_mm_movemask_ps(simd_make_int4_undef(x)) & 0x7) == 0x7; -#elif defined __arm64__ - return simd_all(x.xyzz); -#else - return (x.x & x.y & x.z) & 0x80000000; -#endif -} -static inline SIMD_CFUNC simd_bool simd_all(simd_int4 x) { -#if defined __SSE2__ - return _mm_movemask_ps(x) == 0xf; -#elif defined __arm64__ - return vminvq_u32(x) & 0x80000000; -#else - return simd_all(x.lo & x.hi); -#endif -} -static inline SIMD_CFUNC simd_bool simd_all(simd_int8 x) { -#if defined __AVX__ - return _mm256_movemask_ps(x) == 0xff; -#else - return simd_all(x.lo & x.hi); -#endif -} -static inline SIMD_CFUNC simd_bool simd_all(simd_int16 x) { - return simd_all(x.lo & x.hi); -} -static inline SIMD_CFUNC simd_bool simd_all(simd_uint2 x) { - return simd_all((simd_int2)x); -} -static inline SIMD_CFUNC simd_bool simd_all(simd_uint3 x) { - return simd_all((simd_int3)x); -} -static inline SIMD_CFUNC simd_bool simd_all(simd_uint4 x) { - return simd_all((simd_int4)x); -} -static inline SIMD_CFUNC simd_bool simd_all(simd_uint8 x) { - return simd_all((simd_int8)x); -} -static inline SIMD_CFUNC simd_bool simd_all(simd_uint16 x) { - return simd_all((simd_int16)x); -} -static inline SIMD_CFUNC simd_bool simd_all(simd_long2 x) { -#if defined __SSE2__ - return _mm_movemask_pd(x) == 0x3; -#elif defined __arm64__ - return (x.x & x.y) & 0x8000000000000000U; -#else - return (x.x & x.y) & 0x8000000000000000U; -#endif -} -static inline SIMD_CFUNC simd_bool simd_all(simd_long3 x) { -#if defined __AVX__ - return (_mm256_movemask_pd(simd_make_long4_undef(x)) & 0x7) == 0x7; -#else - return (x.x & x.y & x.z) & 0x8000000000000000U; -#endif -} -static inline SIMD_CFUNC simd_bool simd_all(simd_long4 x) { -#if defined __AVX__ - return _mm256_movemask_pd(x) == 0xf; -#else - return simd_all(x.lo & x.hi); -#endif -} -static inline SIMD_CFUNC simd_bool simd_all(simd_long8 x) { - return simd_all(x.lo & x.hi); -} -static inline SIMD_CFUNC simd_bool simd_all(simd_ulong2 x) { - return simd_all((simd_long2)x); -} -static inline SIMD_CFUNC simd_bool simd_all(simd_ulong3 x) { - return simd_all((simd_long3)x); -} -static inline SIMD_CFUNC simd_bool simd_all(simd_ulong4 x) { - return simd_all((simd_long4)x); -} -static inline SIMD_CFUNC simd_bool simd_all(simd_ulong8 x) { - return simd_all((simd_long8)x); -} - -static inline SIMD_CFUNC simd_float2 simd_select(simd_float2 x, simd_float2 y, simd_int2 mask) { - return simd_make_float2(simd_select(simd_make_float4_undef(x), simd_make_float4_undef(y), simd_make_int4_undef(mask))); -} -static inline SIMD_CFUNC simd_float3 simd_select(simd_float3 x, simd_float3 y, simd_int3 mask) { - return simd_make_float3(simd_select(simd_make_float4_undef(x), simd_make_float4_undef(y), simd_make_int4_undef(mask))); -} -static inline SIMD_CFUNC simd_float4 simd_select(simd_float4 x, simd_float4 y, simd_int4 mask) { -#if defined __SSE4_1__ - return _mm_blendv_ps(x, y, mask); -#else - return simd_bitselect(x, y, mask >> 31); -#endif -} -static inline SIMD_CFUNC simd_float8 simd_select(simd_float8 x, simd_float8 y, simd_int8 mask) { -#if defined __AVX__ - return _mm256_blendv_ps(x, y, mask); -#else - return simd_bitselect(x, y, mask >> 31); -#endif -} -static inline SIMD_CFUNC simd_float16 simd_select(simd_float16 x, simd_float16 y, simd_int16 mask) { - return simd_bitselect(x, y, mask >> 31); -} -static inline SIMD_CFUNC simd_double2 simd_select(simd_double2 x, simd_double2 y, simd_long2 mask) { -#if defined __SSE4_1__ - return _mm_blendv_pd(x, y, mask); -#else - return simd_bitselect(x, y, mask >> 63); -#endif -} -static inline SIMD_CFUNC simd_double3 simd_select(simd_double3 x, simd_double3 y, simd_long3 mask) { - return simd_make_double3(simd_select(simd_make_double4_undef(x), simd_make_double4_undef(y), simd_make_long4_undef(mask))); -} -static inline SIMD_CFUNC simd_double4 simd_select(simd_double4 x, simd_double4 y, simd_long4 mask) { -#if defined __AVX__ - return _mm256_blendv_pd(x, y, mask); -#else - return simd_bitselect(x, y, mask >> 63); -#endif -} -static inline SIMD_CFUNC simd_double8 simd_select(simd_double8 x, simd_double8 y, simd_long8 mask) { - return simd_bitselect(x, y, mask >> 63); -} - -static inline SIMD_CFUNC simd_char2 simd_bitselect(simd_char2 x, simd_char2 y, simd_char2 mask) { - return (x & ~mask) | (y & mask); -} -static inline SIMD_CFUNC simd_char3 simd_bitselect(simd_char3 x, simd_char3 y, simd_char3 mask) { - return (x & ~mask) | (y & mask); -} -static inline SIMD_CFUNC simd_char4 simd_bitselect(simd_char4 x, simd_char4 y, simd_char4 mask) { - return (x & ~mask) | (y & mask); -} -static inline SIMD_CFUNC simd_char8 simd_bitselect(simd_char8 x, simd_char8 y, simd_char8 mask) { - return (x & ~mask) | (y & mask); -} -static inline SIMD_CFUNC simd_char16 simd_bitselect(simd_char16 x, simd_char16 y, simd_char16 mask) { - return (x & ~mask) | (y & mask); -} -static inline SIMD_CFUNC simd_char32 simd_bitselect(simd_char32 x, simd_char32 y, simd_char32 mask) { - return (x & ~mask) | (y & mask); -} -static inline SIMD_CFUNC simd_char64 simd_bitselect(simd_char64 x, simd_char64 y, simd_char64 mask) { - return (x & ~mask) | (y & mask); -} -static inline SIMD_CFUNC simd_uchar2 simd_bitselect(simd_uchar2 x, simd_uchar2 y, simd_char2 mask) { - return (simd_uchar2)simd_bitselect((simd_char2)x, (simd_char2)y, mask); -} -static inline SIMD_CFUNC simd_uchar3 simd_bitselect(simd_uchar3 x, simd_uchar3 y, simd_char3 mask) { - return (simd_uchar3)simd_bitselect((simd_char3)x, (simd_char3)y, mask); -} -static inline SIMD_CFUNC simd_uchar4 simd_bitselect(simd_uchar4 x, simd_uchar4 y, simd_char4 mask) { - return (simd_uchar4)simd_bitselect((simd_char4)x, (simd_char4)y, mask); -} -static inline SIMD_CFUNC simd_uchar8 simd_bitselect(simd_uchar8 x, simd_uchar8 y, simd_char8 mask) { - return (simd_uchar8)simd_bitselect((simd_char8)x, (simd_char8)y, mask); -} -static inline SIMD_CFUNC simd_uchar16 simd_bitselect(simd_uchar16 x, simd_uchar16 y, simd_char16 mask) { - return (simd_uchar16)simd_bitselect((simd_char16)x, (simd_char16)y, mask); -} -static inline SIMD_CFUNC simd_uchar32 simd_bitselect(simd_uchar32 x, simd_uchar32 y, simd_char32 mask) { - return (simd_uchar32)simd_bitselect((simd_char32)x, (simd_char32)y, mask); -} -static inline SIMD_CFUNC simd_uchar64 simd_bitselect(simd_uchar64 x, simd_uchar64 y, simd_char64 mask) { - return (simd_uchar64)simd_bitselect((simd_char64)x, (simd_char64)y, mask); -} -static inline SIMD_CFUNC simd_short2 simd_bitselect(simd_short2 x, simd_short2 y, simd_short2 mask) { - return (x & ~mask) | (y & mask); -} -static inline SIMD_CFUNC simd_short3 simd_bitselect(simd_short3 x, simd_short3 y, simd_short3 mask) { - return (x & ~mask) | (y & mask); -} -static inline SIMD_CFUNC simd_short4 simd_bitselect(simd_short4 x, simd_short4 y, simd_short4 mask) { - return (x & ~mask) | (y & mask); -} -static inline SIMD_CFUNC simd_short8 simd_bitselect(simd_short8 x, simd_short8 y, simd_short8 mask) { - return (x & ~mask) | (y & mask); -} -static inline SIMD_CFUNC simd_short16 simd_bitselect(simd_short16 x, simd_short16 y, simd_short16 mask) { - return (x & ~mask) | (y & mask); -} -static inline SIMD_CFUNC simd_short32 simd_bitselect(simd_short32 x, simd_short32 y, simd_short32 mask) { - return (x & ~mask) | (y & mask); -} -static inline SIMD_CFUNC simd_ushort2 simd_bitselect(simd_ushort2 x, simd_ushort2 y, simd_short2 mask) { - return (simd_ushort2)simd_bitselect((simd_short2)x, (simd_short2)y, mask); -} -static inline SIMD_CFUNC simd_ushort3 simd_bitselect(simd_ushort3 x, simd_ushort3 y, simd_short3 mask) { - return (simd_ushort3)simd_bitselect((simd_short3)x, (simd_short3)y, mask); -} -static inline SIMD_CFUNC simd_ushort4 simd_bitselect(simd_ushort4 x, simd_ushort4 y, simd_short4 mask) { - return (simd_ushort4)simd_bitselect((simd_short4)x, (simd_short4)y, mask); -} -static inline SIMD_CFUNC simd_ushort8 simd_bitselect(simd_ushort8 x, simd_ushort8 y, simd_short8 mask) { - return (simd_ushort8)simd_bitselect((simd_short8)x, (simd_short8)y, mask); -} -static inline SIMD_CFUNC simd_ushort16 simd_bitselect(simd_ushort16 x, simd_ushort16 y, simd_short16 mask) { - return (simd_ushort16)simd_bitselect((simd_short16)x, (simd_short16)y, mask); -} -static inline SIMD_CFUNC simd_ushort32 simd_bitselect(simd_ushort32 x, simd_ushort32 y, simd_short32 mask) { - return (simd_ushort32)simd_bitselect((simd_short32)x, (simd_short32)y, mask); -} -static inline SIMD_CFUNC simd_int2 simd_bitselect(simd_int2 x, simd_int2 y, simd_int2 mask) { - return (x & ~mask) | (y & mask); -} -static inline SIMD_CFUNC simd_int3 simd_bitselect(simd_int3 x, simd_int3 y, simd_int3 mask) { - return (x & ~mask) | (y & mask); -} -static inline SIMD_CFUNC simd_int4 simd_bitselect(simd_int4 x, simd_int4 y, simd_int4 mask) { - return (x & ~mask) | (y & mask); -} -static inline SIMD_CFUNC simd_int8 simd_bitselect(simd_int8 x, simd_int8 y, simd_int8 mask) { - return (x & ~mask) | (y & mask); -} -static inline SIMD_CFUNC simd_int16 simd_bitselect(simd_int16 x, simd_int16 y, simd_int16 mask) { - return (x & ~mask) | (y & mask); -} -static inline SIMD_CFUNC simd_uint2 simd_bitselect(simd_uint2 x, simd_uint2 y, simd_int2 mask) { - return (simd_uint2)simd_bitselect((simd_int2)x, (simd_int2)y, mask); -} -static inline SIMD_CFUNC simd_uint3 simd_bitselect(simd_uint3 x, simd_uint3 y, simd_int3 mask) { - return (simd_uint3)simd_bitselect((simd_int3)x, (simd_int3)y, mask); -} -static inline SIMD_CFUNC simd_uint4 simd_bitselect(simd_uint4 x, simd_uint4 y, simd_int4 mask) { - return (simd_uint4)simd_bitselect((simd_int4)x, (simd_int4)y, mask); -} -static inline SIMD_CFUNC simd_uint8 simd_bitselect(simd_uint8 x, simd_uint8 y, simd_int8 mask) { - return (simd_uint8)simd_bitselect((simd_int8)x, (simd_int8)y, mask); -} -static inline SIMD_CFUNC simd_uint16 simd_bitselect(simd_uint16 x, simd_uint16 y, simd_int16 mask) { - return (simd_uint16)simd_bitselect((simd_int16)x, (simd_int16)y, mask); -} -static inline SIMD_CFUNC simd_float2 simd_bitselect(simd_float2 x, simd_float2 y, simd_int2 mask) { - return (simd_float2)simd_bitselect((simd_int2)x, (simd_int2)y, mask); -} -static inline SIMD_CFUNC simd_float3 simd_bitselect(simd_float3 x, simd_float3 y, simd_int3 mask) { - return (simd_float3)simd_bitselect((simd_int3)x, (simd_int3)y, mask); -} -static inline SIMD_CFUNC simd_float4 simd_bitselect(simd_float4 x, simd_float4 y, simd_int4 mask) { - return (simd_float4)simd_bitselect((simd_int4)x, (simd_int4)y, mask); -} -static inline SIMD_CFUNC simd_float8 simd_bitselect(simd_float8 x, simd_float8 y, simd_int8 mask) { - return (simd_float8)simd_bitselect((simd_int8)x, (simd_int8)y, mask); -} -static inline SIMD_CFUNC simd_float16 simd_bitselect(simd_float16 x, simd_float16 y, simd_int16 mask) { - return (simd_float16)simd_bitselect((simd_int16)x, (simd_int16)y, mask); -} -static inline SIMD_CFUNC simd_long2 simd_bitselect(simd_long2 x, simd_long2 y, simd_long2 mask) { - return (x & ~mask) | (y & mask); -} -static inline SIMD_CFUNC simd_long3 simd_bitselect(simd_long3 x, simd_long3 y, simd_long3 mask) { - return (x & ~mask) | (y & mask); -} -static inline SIMD_CFUNC simd_long4 simd_bitselect(simd_long4 x, simd_long4 y, simd_long4 mask) { - return (x & ~mask) | (y & mask); -} -static inline SIMD_CFUNC simd_long8 simd_bitselect(simd_long8 x, simd_long8 y, simd_long8 mask) { - return (x & ~mask) | (y & mask); -} -static inline SIMD_CFUNC simd_ulong2 simd_bitselect(simd_ulong2 x, simd_ulong2 y, simd_long2 mask) { - return (simd_ulong2)simd_bitselect((simd_long2)x, (simd_long2)y, mask); -} -static inline SIMD_CFUNC simd_ulong3 simd_bitselect(simd_ulong3 x, simd_ulong3 y, simd_long3 mask) { - return (simd_ulong3)simd_bitselect((simd_long3)x, (simd_long3)y, mask); -} -static inline SIMD_CFUNC simd_ulong4 simd_bitselect(simd_ulong4 x, simd_ulong4 y, simd_long4 mask) { - return (simd_ulong4)simd_bitselect((simd_long4)x, (simd_long4)y, mask); -} -static inline SIMD_CFUNC simd_ulong8 simd_bitselect(simd_ulong8 x, simd_ulong8 y, simd_long8 mask) { - return (simd_ulong8)simd_bitselect((simd_long8)x, (simd_long8)y, mask); -} -static inline SIMD_CFUNC simd_double2 simd_bitselect(simd_double2 x, simd_double2 y, simd_long2 mask) { - return (simd_double2)simd_bitselect((simd_long2)x, (simd_long2)y, mask); -} -static inline SIMD_CFUNC simd_double3 simd_bitselect(simd_double3 x, simd_double3 y, simd_long3 mask) { - return (simd_double3)simd_bitselect((simd_long3)x, (simd_long3)y, mask); -} -static inline SIMD_CFUNC simd_double4 simd_bitselect(simd_double4 x, simd_double4 y, simd_long4 mask) { - return (simd_double4)simd_bitselect((simd_long4)x, (simd_long4)y, mask); -} -static inline SIMD_CFUNC simd_double8 simd_bitselect(simd_double8 x, simd_double8 y, simd_long8 mask) { - return (simd_double8)simd_bitselect((simd_long8)x, (simd_long8)y, mask); -} - -#ifdef __cplusplus -} -#endif -#endif /* SIMD_COMPILER_HAS_REQUIRED_FEATURES */ -#endif /* __SIMD_LOGIC_HEADER__ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/simd/math.h b/lib/libc/include/x86_64-macos-gnu/simd/math.h deleted file mode 100644 index 5e2b31cae2..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/simd/math.h +++ /dev/null @@ -1,5379 +0,0 @@ -/*! @header - * The interfaces declared in this header provide elementwise math operations - * on vectors; each lane of the result vector depends only on the data in the - * corresponding lane of the argument(s) to the function. - * - * You should not use the C functions declared in this header directly (these - * are functions with names like `__tg_cos(x)`). These are merely - * implementation details of overloading; instead of calling - * `__tg_cos(x)`, call `cos(x)`. If you are writing C++, use `simd::cos(x)`. - * - * Note that while these vector functions are relatively recent additions, - * scalar fallback is provided for all of them, so they are available even - * when targeting older OS versions. - * - * The following functions are available: - * - * C name C++ name Notes - * ---------------------------------------------------------------------- - * acos(x) simd::acos(x) - * asin(x) simd::asin(x) - * atan(x) simd::atan(x) - * atan2(y,x) simd::atan2(y,x) The argument order matches the scalar - * atan2 function, which gives the angle - * of a line with slope y/x. - * cos(x) simd::cos(x) - * sin(x) simd::sin(x) - * tan(x) simd::tan(x) - * - * cospi(x) simd::cospi(x) Returns cos(pi*x), sin(pi*x), tan(pi*x) - * sinpi(x) simd::sinpi(x) more efficiently and accurately than - * tanpi(x) simd::tanpi(x) would otherwise be possible - * - * acosh(x) simd::acosh(x) - * asinh(x) simd::asinh(x) - * atanh(x) simd::atanh(x) - * - * cosh(x) simd::cosh(x) - * sinh(x) simd::sinh(x) - * tanh(x) simd::tanh(x) - * - * exp(x) simd::exp(x) - * exp2(x) simd::exp2(x) - * exp10(x) simd::exp10(x) More efficient that pow(10,x). - * expm1(x) simd::expm1(x) exp(x)-1, accurate even for tiny x. - * - * log(x) simd::log(x) - * log2(x) simd::log2(x) - * log10(x) simd::log10(x) - * log1p(x) simd::log1p(x) log(1+x), accurate even for tiny x. - * - * fabs(x) simd::fabs(x) - * cbrt(x) simd::cbrt(x) - * sqrt(x) simd::sqrt(x) - * pow(x,y) simd::pow(x,y) - * copysign(x,y) simd::copysign(x,y) - * hypot(x,y) simd::hypot(x,y) sqrt(x*x + y*y), computed without - * overflow.1 - * erf(x) simd::erf(x) - * erfc(x) simd::erfc(x) - * tgamma(x) simd::tgamma(x) - * - * fmod(x,y) simd::fmod(x,y) - * remainder(x,y) simd::remainder(x,y) - * - * ceil(x) simd::ceil(x) - * floor(x) simd::floor(x) - * rint(x) simd::rint(x) - * round(x) simd::round(x) - * trunc(x) simd::trunc(x) - * - * fdim(x,y) simd::fdim(x,y) - * fmax(x,y) simd::fmax(x,y) When one argument to fmin or fmax is - * fmin(x,y) simd::fmin(x,y) constant, use it as the *second* (y) - * argument to get better codegen on some - * architectures. E.g., write fmin(x,2) - * instead of fmin(2,x). - * fma(x,y,z) simd::fma(x,y,z) Fast on arm64 and when targeting AVX2 - * and later; may be quite expensive on - * older hardware. - * simd_muladd(x,y,z) simd::muladd(x,y,z) - * - * @copyright 2014-2017 Apple, Inc. All rights reserved. - * @unsorted */ - -#ifndef SIMD_MATH_HEADER -#define SIMD_MATH_HEADER - -#include -#if SIMD_COMPILER_HAS_REQUIRED_FEATURES -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif -/*! @abstract Do not call this function; instead use `acos` in C and - * Objective-C, and `simd::acos` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_acos(simd_float2 x); -/*! @abstract Do not call this function; instead use `acos` in C and - * Objective-C, and `simd::acos` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_acos(simd_float3 x); -/*! @abstract Do not call this function; instead use `acos` in C and - * Objective-C, and `simd::acos` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_acos(simd_float4 x); -/*! @abstract Do not call this function; instead use `acos` in C and - * Objective-C, and `simd::acos` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_acos(simd_float8 x); -/*! @abstract Do not call this function; instead use `acos` in C and - * Objective-C, and `simd::acos` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_acos(simd_float16 x); -/*! @abstract Do not call this function; instead use `acos` in C and - * Objective-C, and `simd::acos` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_acos(simd_double2 x); -/*! @abstract Do not call this function; instead use `acos` in C and - * Objective-C, and `simd::acos` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_acos(simd_double3 x); -/*! @abstract Do not call this function; instead use `acos` in C and - * Objective-C, and `simd::acos` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_acos(simd_double4 x); -/*! @abstract Do not call this function; instead use `acos` in C and - * Objective-C, and `simd::acos` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_acos(simd_double8 x); - -/*! @abstract Do not call this function; instead use `asin` in C and - * Objective-C, and `simd::asin` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_asin(simd_float2 x); -/*! @abstract Do not call this function; instead use `asin` in C and - * Objective-C, and `simd::asin` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_asin(simd_float3 x); -/*! @abstract Do not call this function; instead use `asin` in C and - * Objective-C, and `simd::asin` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_asin(simd_float4 x); -/*! @abstract Do not call this function; instead use `asin` in C and - * Objective-C, and `simd::asin` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_asin(simd_float8 x); -/*! @abstract Do not call this function; instead use `asin` in C and - * Objective-C, and `simd::asin` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_asin(simd_float16 x); -/*! @abstract Do not call this function; instead use `asin` in C and - * Objective-C, and `simd::asin` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_asin(simd_double2 x); -/*! @abstract Do not call this function; instead use `asin` in C and - * Objective-C, and `simd::asin` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_asin(simd_double3 x); -/*! @abstract Do not call this function; instead use `asin` in C and - * Objective-C, and `simd::asin` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_asin(simd_double4 x); -/*! @abstract Do not call this function; instead use `asin` in C and - * Objective-C, and `simd::asin` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_asin(simd_double8 x); - -/*! @abstract Do not call this function; instead use `atan` in C and - * Objective-C, and `simd::atan` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_atan(simd_float2 x); -/*! @abstract Do not call this function; instead use `atan` in C and - * Objective-C, and `simd::atan` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_atan(simd_float3 x); -/*! @abstract Do not call this function; instead use `atan` in C and - * Objective-C, and `simd::atan` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_atan(simd_float4 x); -/*! @abstract Do not call this function; instead use `atan` in C and - * Objective-C, and `simd::atan` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_atan(simd_float8 x); -/*! @abstract Do not call this function; instead use `atan` in C and - * Objective-C, and `simd::atan` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_atan(simd_float16 x); -/*! @abstract Do not call this function; instead use `atan` in C and - * Objective-C, and `simd::atan` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_atan(simd_double2 x); -/*! @abstract Do not call this function; instead use `atan` in C and - * Objective-C, and `simd::atan` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_atan(simd_double3 x); -/*! @abstract Do not call this function; instead use `atan` in C and - * Objective-C, and `simd::atan` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_atan(simd_double4 x); -/*! @abstract Do not call this function; instead use `atan` in C and - * Objective-C, and `simd::atan` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_atan(simd_double8 x); - -/*! @abstract Do not call this function; instead use `cos` in C and - * Objective-C, and `simd::cos` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_cos(simd_float2 x); -/*! @abstract Do not call this function; instead use `cos` in C and - * Objective-C, and `simd::cos` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_cos(simd_float3 x); -/*! @abstract Do not call this function; instead use `cos` in C and - * Objective-C, and `simd::cos` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_cos(simd_float4 x); -/*! @abstract Do not call this function; instead use `cos` in C and - * Objective-C, and `simd::cos` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_cos(simd_float8 x); -/*! @abstract Do not call this function; instead use `cos` in C and - * Objective-C, and `simd::cos` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_cos(simd_float16 x); -/*! @abstract Do not call this function; instead use `cos` in C and - * Objective-C, and `simd::cos` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_cos(simd_double2 x); -/*! @abstract Do not call this function; instead use `cos` in C and - * Objective-C, and `simd::cos` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_cos(simd_double3 x); -/*! @abstract Do not call this function; instead use `cos` in C and - * Objective-C, and `simd::cos` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_cos(simd_double4 x); -/*! @abstract Do not call this function; instead use `cos` in C and - * Objective-C, and `simd::cos` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_cos(simd_double8 x); - -/*! @abstract Do not call this function; instead use `sin` in C and - * Objective-C, and `simd::sin` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_sin(simd_float2 x); -/*! @abstract Do not call this function; instead use `sin` in C and - * Objective-C, and `simd::sin` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_sin(simd_float3 x); -/*! @abstract Do not call this function; instead use `sin` in C and - * Objective-C, and `simd::sin` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_sin(simd_float4 x); -/*! @abstract Do not call this function; instead use `sin` in C and - * Objective-C, and `simd::sin` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_sin(simd_float8 x); -/*! @abstract Do not call this function; instead use `sin` in C and - * Objective-C, and `simd::sin` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_sin(simd_float16 x); -/*! @abstract Do not call this function; instead use `sin` in C and - * Objective-C, and `simd::sin` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_sin(simd_double2 x); -/*! @abstract Do not call this function; instead use `sin` in C and - * Objective-C, and `simd::sin` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_sin(simd_double3 x); -/*! @abstract Do not call this function; instead use `sin` in C and - * Objective-C, and `simd::sin` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_sin(simd_double4 x); -/*! @abstract Do not call this function; instead use `sin` in C and - * Objective-C, and `simd::sin` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_sin(simd_double8 x); - -/*! @abstract Do not call this function; instead use `tan` in C and - * Objective-C, and `simd::tan` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_tan(simd_float2 x); -/*! @abstract Do not call this function; instead use `tan` in C and - * Objective-C, and `simd::tan` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_tan(simd_float3 x); -/*! @abstract Do not call this function; instead use `tan` in C and - * Objective-C, and `simd::tan` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_tan(simd_float4 x); -/*! @abstract Do not call this function; instead use `tan` in C and - * Objective-C, and `simd::tan` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_tan(simd_float8 x); -/*! @abstract Do not call this function; instead use `tan` in C and - * Objective-C, and `simd::tan` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_tan(simd_float16 x); -/*! @abstract Do not call this function; instead use `tan` in C and - * Objective-C, and `simd::tan` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_tan(simd_double2 x); -/*! @abstract Do not call this function; instead use `tan` in C and - * Objective-C, and `simd::tan` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_tan(simd_double3 x); -/*! @abstract Do not call this function; instead use `tan` in C and - * Objective-C, and `simd::tan` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_tan(simd_double4 x); -/*! @abstract Do not call this function; instead use `tan` in C and - * Objective-C, and `simd::tan` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_tan(simd_double8 x); - -#if SIMD_LIBRARY_VERSION >= 1 -/*! @abstract Do not call this function; instead use `cospi` in C and - * Objective-C, and `simd::cospi` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_cospi(simd_float2 x); -/*! @abstract Do not call this function; instead use `cospi` in C and - * Objective-C, and `simd::cospi` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_cospi(simd_float3 x); -/*! @abstract Do not call this function; instead use `cospi` in C and - * Objective-C, and `simd::cospi` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_cospi(simd_float4 x); -/*! @abstract Do not call this function; instead use `cospi` in C and - * Objective-C, and `simd::cospi` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_cospi(simd_float8 x); -/*! @abstract Do not call this function; instead use `cospi` in C and - * Objective-C, and `simd::cospi` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_cospi(simd_float16 x); -/*! @abstract Do not call this function; instead use `cospi` in C and - * Objective-C, and `simd::cospi` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_cospi(simd_double2 x); -/*! @abstract Do not call this function; instead use `cospi` in C and - * Objective-C, and `simd::cospi` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_cospi(simd_double3 x); -/*! @abstract Do not call this function; instead use `cospi` in C and - * Objective-C, and `simd::cospi` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_cospi(simd_double4 x); -/*! @abstract Do not call this function; instead use `cospi` in C and - * Objective-C, and `simd::cospi` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_cospi(simd_double8 x); -#endif - -#if SIMD_LIBRARY_VERSION >= 1 -/*! @abstract Do not call this function; instead use `sinpi` in C and - * Objective-C, and `simd::sinpi` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_sinpi(simd_float2 x); -/*! @abstract Do not call this function; instead use `sinpi` in C and - * Objective-C, and `simd::sinpi` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_sinpi(simd_float3 x); -/*! @abstract Do not call this function; instead use `sinpi` in C and - * Objective-C, and `simd::sinpi` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_sinpi(simd_float4 x); -/*! @abstract Do not call this function; instead use `sinpi` in C and - * Objective-C, and `simd::sinpi` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_sinpi(simd_float8 x); -/*! @abstract Do not call this function; instead use `sinpi` in C and - * Objective-C, and `simd::sinpi` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_sinpi(simd_float16 x); -/*! @abstract Do not call this function; instead use `sinpi` in C and - * Objective-C, and `simd::sinpi` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_sinpi(simd_double2 x); -/*! @abstract Do not call this function; instead use `sinpi` in C and - * Objective-C, and `simd::sinpi` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_sinpi(simd_double3 x); -/*! @abstract Do not call this function; instead use `sinpi` in C and - * Objective-C, and `simd::sinpi` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_sinpi(simd_double4 x); -/*! @abstract Do not call this function; instead use `sinpi` in C and - * Objective-C, and `simd::sinpi` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_sinpi(simd_double8 x); -#endif - -#if SIMD_LIBRARY_VERSION >= 1 -/*! @abstract Do not call this function; instead use `tanpi` in C and - * Objective-C, and `simd::tanpi` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_tanpi(simd_float2 x); -/*! @abstract Do not call this function; instead use `tanpi` in C and - * Objective-C, and `simd::tanpi` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_tanpi(simd_float3 x); -/*! @abstract Do not call this function; instead use `tanpi` in C and - * Objective-C, and `simd::tanpi` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_tanpi(simd_float4 x); -/*! @abstract Do not call this function; instead use `tanpi` in C and - * Objective-C, and `simd::tanpi` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_tanpi(simd_float8 x); -/*! @abstract Do not call this function; instead use `tanpi` in C and - * Objective-C, and `simd::tanpi` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_tanpi(simd_float16 x); -/*! @abstract Do not call this function; instead use `tanpi` in C and - * Objective-C, and `simd::tanpi` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_tanpi(simd_double2 x); -/*! @abstract Do not call this function; instead use `tanpi` in C and - * Objective-C, and `simd::tanpi` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_tanpi(simd_double3 x); -/*! @abstract Do not call this function; instead use `tanpi` in C and - * Objective-C, and `simd::tanpi` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_tanpi(simd_double4 x); -/*! @abstract Do not call this function; instead use `tanpi` in C and - * Objective-C, and `simd::tanpi` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_tanpi(simd_double8 x); -#endif - -/*! @abstract Do not call this function; instead use `acosh` in C and - * Objective-C, and `simd::acosh` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_acosh(simd_float2 x); -/*! @abstract Do not call this function; instead use `acosh` in C and - * Objective-C, and `simd::acosh` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_acosh(simd_float3 x); -/*! @abstract Do not call this function; instead use `acosh` in C and - * Objective-C, and `simd::acosh` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_acosh(simd_float4 x); -/*! @abstract Do not call this function; instead use `acosh` in C and - * Objective-C, and `simd::acosh` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_acosh(simd_float8 x); -/*! @abstract Do not call this function; instead use `acosh` in C and - * Objective-C, and `simd::acosh` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_acosh(simd_float16 x); -/*! @abstract Do not call this function; instead use `acosh` in C and - * Objective-C, and `simd::acosh` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_acosh(simd_double2 x); -/*! @abstract Do not call this function; instead use `acosh` in C and - * Objective-C, and `simd::acosh` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_acosh(simd_double3 x); -/*! @abstract Do not call this function; instead use `acosh` in C and - * Objective-C, and `simd::acosh` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_acosh(simd_double4 x); -/*! @abstract Do not call this function; instead use `acosh` in C and - * Objective-C, and `simd::acosh` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_acosh(simd_double8 x); - -/*! @abstract Do not call this function; instead use `asinh` in C and - * Objective-C, and `simd::asinh` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_asinh(simd_float2 x); -/*! @abstract Do not call this function; instead use `asinh` in C and - * Objective-C, and `simd::asinh` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_asinh(simd_float3 x); -/*! @abstract Do not call this function; instead use `asinh` in C and - * Objective-C, and `simd::asinh` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_asinh(simd_float4 x); -/*! @abstract Do not call this function; instead use `asinh` in C and - * Objective-C, and `simd::asinh` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_asinh(simd_float8 x); -/*! @abstract Do not call this function; instead use `asinh` in C and - * Objective-C, and `simd::asinh` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_asinh(simd_float16 x); -/*! @abstract Do not call this function; instead use `asinh` in C and - * Objective-C, and `simd::asinh` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_asinh(simd_double2 x); -/*! @abstract Do not call this function; instead use `asinh` in C and - * Objective-C, and `simd::asinh` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_asinh(simd_double3 x); -/*! @abstract Do not call this function; instead use `asinh` in C and - * Objective-C, and `simd::asinh` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_asinh(simd_double4 x); -/*! @abstract Do not call this function; instead use `asinh` in C and - * Objective-C, and `simd::asinh` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_asinh(simd_double8 x); - -/*! @abstract Do not call this function; instead use `atanh` in C and - * Objective-C, and `simd::atanh` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_atanh(simd_float2 x); -/*! @abstract Do not call this function; instead use `atanh` in C and - * Objective-C, and `simd::atanh` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_atanh(simd_float3 x); -/*! @abstract Do not call this function; instead use `atanh` in C and - * Objective-C, and `simd::atanh` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_atanh(simd_float4 x); -/*! @abstract Do not call this function; instead use `atanh` in C and - * Objective-C, and `simd::atanh` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_atanh(simd_float8 x); -/*! @abstract Do not call this function; instead use `atanh` in C and - * Objective-C, and `simd::atanh` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_atanh(simd_float16 x); -/*! @abstract Do not call this function; instead use `atanh` in C and - * Objective-C, and `simd::atanh` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_atanh(simd_double2 x); -/*! @abstract Do not call this function; instead use `atanh` in C and - * Objective-C, and `simd::atanh` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_atanh(simd_double3 x); -/*! @abstract Do not call this function; instead use `atanh` in C and - * Objective-C, and `simd::atanh` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_atanh(simd_double4 x); -/*! @abstract Do not call this function; instead use `atanh` in C and - * Objective-C, and `simd::atanh` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_atanh(simd_double8 x); - -/*! @abstract Do not call this function; instead use `cosh` in C and - * Objective-C, and `simd::cosh` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_cosh(simd_float2 x); -/*! @abstract Do not call this function; instead use `cosh` in C and - * Objective-C, and `simd::cosh` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_cosh(simd_float3 x); -/*! @abstract Do not call this function; instead use `cosh` in C and - * Objective-C, and `simd::cosh` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_cosh(simd_float4 x); -/*! @abstract Do not call this function; instead use `cosh` in C and - * Objective-C, and `simd::cosh` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_cosh(simd_float8 x); -/*! @abstract Do not call this function; instead use `cosh` in C and - * Objective-C, and `simd::cosh` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_cosh(simd_float16 x); -/*! @abstract Do not call this function; instead use `cosh` in C and - * Objective-C, and `simd::cosh` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_cosh(simd_double2 x); -/*! @abstract Do not call this function; instead use `cosh` in C and - * Objective-C, and `simd::cosh` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_cosh(simd_double3 x); -/*! @abstract Do not call this function; instead use `cosh` in C and - * Objective-C, and `simd::cosh` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_cosh(simd_double4 x); -/*! @abstract Do not call this function; instead use `cosh` in C and - * Objective-C, and `simd::cosh` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_cosh(simd_double8 x); - -/*! @abstract Do not call this function; instead use `sinh` in C and - * Objective-C, and `simd::sinh` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_sinh(simd_float2 x); -/*! @abstract Do not call this function; instead use `sinh` in C and - * Objective-C, and `simd::sinh` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_sinh(simd_float3 x); -/*! @abstract Do not call this function; instead use `sinh` in C and - * Objective-C, and `simd::sinh` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_sinh(simd_float4 x); -/*! @abstract Do not call this function; instead use `sinh` in C and - * Objective-C, and `simd::sinh` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_sinh(simd_float8 x); -/*! @abstract Do not call this function; instead use `sinh` in C and - * Objective-C, and `simd::sinh` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_sinh(simd_float16 x); -/*! @abstract Do not call this function; instead use `sinh` in C and - * Objective-C, and `simd::sinh` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_sinh(simd_double2 x); -/*! @abstract Do not call this function; instead use `sinh` in C and - * Objective-C, and `simd::sinh` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_sinh(simd_double3 x); -/*! @abstract Do not call this function; instead use `sinh` in C and - * Objective-C, and `simd::sinh` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_sinh(simd_double4 x); -/*! @abstract Do not call this function; instead use `sinh` in C and - * Objective-C, and `simd::sinh` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_sinh(simd_double8 x); - -/*! @abstract Do not call this function; instead use `tanh` in C and - * Objective-C, and `simd::tanh` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_tanh(simd_float2 x); -/*! @abstract Do not call this function; instead use `tanh` in C and - * Objective-C, and `simd::tanh` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_tanh(simd_float3 x); -/*! @abstract Do not call this function; instead use `tanh` in C and - * Objective-C, and `simd::tanh` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_tanh(simd_float4 x); -/*! @abstract Do not call this function; instead use `tanh` in C and - * Objective-C, and `simd::tanh` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_tanh(simd_float8 x); -/*! @abstract Do not call this function; instead use `tanh` in C and - * Objective-C, and `simd::tanh` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_tanh(simd_float16 x); -/*! @abstract Do not call this function; instead use `tanh` in C and - * Objective-C, and `simd::tanh` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_tanh(simd_double2 x); -/*! @abstract Do not call this function; instead use `tanh` in C and - * Objective-C, and `simd::tanh` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_tanh(simd_double3 x); -/*! @abstract Do not call this function; instead use `tanh` in C and - * Objective-C, and `simd::tanh` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_tanh(simd_double4 x); -/*! @abstract Do not call this function; instead use `tanh` in C and - * Objective-C, and `simd::tanh` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_tanh(simd_double8 x); - -/*! @abstract Do not call this function; instead use `exp` in C and - * Objective-C, and `simd::exp` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_exp(simd_float2 x); -/*! @abstract Do not call this function; instead use `exp` in C and - * Objective-C, and `simd::exp` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_exp(simd_float3 x); -/*! @abstract Do not call this function; instead use `exp` in C and - * Objective-C, and `simd::exp` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_exp(simd_float4 x); -/*! @abstract Do not call this function; instead use `exp` in C and - * Objective-C, and `simd::exp` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_exp(simd_float8 x); -/*! @abstract Do not call this function; instead use `exp` in C and - * Objective-C, and `simd::exp` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_exp(simd_float16 x); -/*! @abstract Do not call this function; instead use `exp` in C and - * Objective-C, and `simd::exp` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_exp(simd_double2 x); -/*! @abstract Do not call this function; instead use `exp` in C and - * Objective-C, and `simd::exp` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_exp(simd_double3 x); -/*! @abstract Do not call this function; instead use `exp` in C and - * Objective-C, and `simd::exp` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_exp(simd_double4 x); -/*! @abstract Do not call this function; instead use `exp` in C and - * Objective-C, and `simd::exp` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_exp(simd_double8 x); - -/*! @abstract Do not call this function; instead use `exp2` in C and - * Objective-C, and `simd::exp2` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_exp2(simd_float2 x); -/*! @abstract Do not call this function; instead use `exp2` in C and - * Objective-C, and `simd::exp2` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_exp2(simd_float3 x); -/*! @abstract Do not call this function; instead use `exp2` in C and - * Objective-C, and `simd::exp2` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_exp2(simd_float4 x); -/*! @abstract Do not call this function; instead use `exp2` in C and - * Objective-C, and `simd::exp2` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_exp2(simd_float8 x); -/*! @abstract Do not call this function; instead use `exp2` in C and - * Objective-C, and `simd::exp2` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_exp2(simd_float16 x); -/*! @abstract Do not call this function; instead use `exp2` in C and - * Objective-C, and `simd::exp2` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_exp2(simd_double2 x); -/*! @abstract Do not call this function; instead use `exp2` in C and - * Objective-C, and `simd::exp2` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_exp2(simd_double3 x); -/*! @abstract Do not call this function; instead use `exp2` in C and - * Objective-C, and `simd::exp2` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_exp2(simd_double4 x); -/*! @abstract Do not call this function; instead use `exp2` in C and - * Objective-C, and `simd::exp2` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_exp2(simd_double8 x); - -#if SIMD_LIBRARY_VERSION >= 1 -/*! @abstract Do not call this function; instead use `exp10` in C and - * Objective-C, and `simd::exp10` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_exp10(simd_float2 x); -/*! @abstract Do not call this function; instead use `exp10` in C and - * Objective-C, and `simd::exp10` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_exp10(simd_float3 x); -/*! @abstract Do not call this function; instead use `exp10` in C and - * Objective-C, and `simd::exp10` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_exp10(simd_float4 x); -/*! @abstract Do not call this function; instead use `exp10` in C and - * Objective-C, and `simd::exp10` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_exp10(simd_float8 x); -/*! @abstract Do not call this function; instead use `exp10` in C and - * Objective-C, and `simd::exp10` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_exp10(simd_float16 x); -/*! @abstract Do not call this function; instead use `exp10` in C and - * Objective-C, and `simd::exp10` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_exp10(simd_double2 x); -/*! @abstract Do not call this function; instead use `exp10` in C and - * Objective-C, and `simd::exp10` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_exp10(simd_double3 x); -/*! @abstract Do not call this function; instead use `exp10` in C and - * Objective-C, and `simd::exp10` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_exp10(simd_double4 x); -/*! @abstract Do not call this function; instead use `exp10` in C and - * Objective-C, and `simd::exp10` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_exp10(simd_double8 x); -#endif - -/*! @abstract Do not call this function; instead use `expm1` in C and - * Objective-C, and `simd::expm1` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_expm1(simd_float2 x); -/*! @abstract Do not call this function; instead use `expm1` in C and - * Objective-C, and `simd::expm1` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_expm1(simd_float3 x); -/*! @abstract Do not call this function; instead use `expm1` in C and - * Objective-C, and `simd::expm1` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_expm1(simd_float4 x); -/*! @abstract Do not call this function; instead use `expm1` in C and - * Objective-C, and `simd::expm1` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_expm1(simd_float8 x); -/*! @abstract Do not call this function; instead use `expm1` in C and - * Objective-C, and `simd::expm1` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_expm1(simd_float16 x); -/*! @abstract Do not call this function; instead use `expm1` in C and - * Objective-C, and `simd::expm1` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_expm1(simd_double2 x); -/*! @abstract Do not call this function; instead use `expm1` in C and - * Objective-C, and `simd::expm1` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_expm1(simd_double3 x); -/*! @abstract Do not call this function; instead use `expm1` in C and - * Objective-C, and `simd::expm1` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_expm1(simd_double4 x); -/*! @abstract Do not call this function; instead use `expm1` in C and - * Objective-C, and `simd::expm1` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_expm1(simd_double8 x); - -/*! @abstract Do not call this function; instead use `log` in C and - * Objective-C, and `simd::log` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_log(simd_float2 x); -/*! @abstract Do not call this function; instead use `log` in C and - * Objective-C, and `simd::log` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_log(simd_float3 x); -/*! @abstract Do not call this function; instead use `log` in C and - * Objective-C, and `simd::log` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_log(simd_float4 x); -/*! @abstract Do not call this function; instead use `log` in C and - * Objective-C, and `simd::log` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_log(simd_float8 x); -/*! @abstract Do not call this function; instead use `log` in C and - * Objective-C, and `simd::log` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_log(simd_float16 x); -/*! @abstract Do not call this function; instead use `log` in C and - * Objective-C, and `simd::log` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_log(simd_double2 x); -/*! @abstract Do not call this function; instead use `log` in C and - * Objective-C, and `simd::log` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_log(simd_double3 x); -/*! @abstract Do not call this function; instead use `log` in C and - * Objective-C, and `simd::log` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_log(simd_double4 x); -/*! @abstract Do not call this function; instead use `log` in C and - * Objective-C, and `simd::log` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_log(simd_double8 x); - -/*! @abstract Do not call this function; instead use `log2` in C and - * Objective-C, and `simd::log2` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_log2(simd_float2 x); -/*! @abstract Do not call this function; instead use `log2` in C and - * Objective-C, and `simd::log2` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_log2(simd_float3 x); -/*! @abstract Do not call this function; instead use `log2` in C and - * Objective-C, and `simd::log2` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_log2(simd_float4 x); -/*! @abstract Do not call this function; instead use `log2` in C and - * Objective-C, and `simd::log2` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_log2(simd_float8 x); -/*! @abstract Do not call this function; instead use `log2` in C and - * Objective-C, and `simd::log2` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_log2(simd_float16 x); -/*! @abstract Do not call this function; instead use `log2` in C and - * Objective-C, and `simd::log2` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_log2(simd_double2 x); -/*! @abstract Do not call this function; instead use `log2` in C and - * Objective-C, and `simd::log2` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_log2(simd_double3 x); -/*! @abstract Do not call this function; instead use `log2` in C and - * Objective-C, and `simd::log2` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_log2(simd_double4 x); -/*! @abstract Do not call this function; instead use `log2` in C and - * Objective-C, and `simd::log2` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_log2(simd_double8 x); - -/*! @abstract Do not call this function; instead use `log10` in C and - * Objective-C, and `simd::log10` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_log10(simd_float2 x); -/*! @abstract Do not call this function; instead use `log10` in C and - * Objective-C, and `simd::log10` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_log10(simd_float3 x); -/*! @abstract Do not call this function; instead use `log10` in C and - * Objective-C, and `simd::log10` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_log10(simd_float4 x); -/*! @abstract Do not call this function; instead use `log10` in C and - * Objective-C, and `simd::log10` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_log10(simd_float8 x); -/*! @abstract Do not call this function; instead use `log10` in C and - * Objective-C, and `simd::log10` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_log10(simd_float16 x); -/*! @abstract Do not call this function; instead use `log10` in C and - * Objective-C, and `simd::log10` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_log10(simd_double2 x); -/*! @abstract Do not call this function; instead use `log10` in C and - * Objective-C, and `simd::log10` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_log10(simd_double3 x); -/*! @abstract Do not call this function; instead use `log10` in C and - * Objective-C, and `simd::log10` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_log10(simd_double4 x); -/*! @abstract Do not call this function; instead use `log10` in C and - * Objective-C, and `simd::log10` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_log10(simd_double8 x); - -/*! @abstract Do not call this function; instead use `log1p` in C and - * Objective-C, and `simd::log1p` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_log1p(simd_float2 x); -/*! @abstract Do not call this function; instead use `log1p` in C and - * Objective-C, and `simd::log1p` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_log1p(simd_float3 x); -/*! @abstract Do not call this function; instead use `log1p` in C and - * Objective-C, and `simd::log1p` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_log1p(simd_float4 x); -/*! @abstract Do not call this function; instead use `log1p` in C and - * Objective-C, and `simd::log1p` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_log1p(simd_float8 x); -/*! @abstract Do not call this function; instead use `log1p` in C and - * Objective-C, and `simd::log1p` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_log1p(simd_float16 x); -/*! @abstract Do not call this function; instead use `log1p` in C and - * Objective-C, and `simd::log1p` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_log1p(simd_double2 x); -/*! @abstract Do not call this function; instead use `log1p` in C and - * Objective-C, and `simd::log1p` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_log1p(simd_double3 x); -/*! @abstract Do not call this function; instead use `log1p` in C and - * Objective-C, and `simd::log1p` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_log1p(simd_double4 x); -/*! @abstract Do not call this function; instead use `log1p` in C and - * Objective-C, and `simd::log1p` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_log1p(simd_double8 x); - -/*! @abstract Do not call this function; instead use `fabs` in C and - * Objective-C, and `simd::fabs` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_fabs(simd_float2 x); -/*! @abstract Do not call this function; instead use `fabs` in C and - * Objective-C, and `simd::fabs` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_fabs(simd_float3 x); -/*! @abstract Do not call this function; instead use `fabs` in C and - * Objective-C, and `simd::fabs` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_fabs(simd_float4 x); -/*! @abstract Do not call this function; instead use `fabs` in C and - * Objective-C, and `simd::fabs` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_fabs(simd_float8 x); -/*! @abstract Do not call this function; instead use `fabs` in C and - * Objective-C, and `simd::fabs` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_fabs(simd_float16 x); -/*! @abstract Do not call this function; instead use `fabs` in C and - * Objective-C, and `simd::fabs` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_fabs(simd_double2 x); -/*! @abstract Do not call this function; instead use `fabs` in C and - * Objective-C, and `simd::fabs` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_fabs(simd_double3 x); -/*! @abstract Do not call this function; instead use `fabs` in C and - * Objective-C, and `simd::fabs` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_fabs(simd_double4 x); -/*! @abstract Do not call this function; instead use `fabs` in C and - * Objective-C, and `simd::fabs` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_fabs(simd_double8 x); - -/*! @abstract Do not call this function; instead use `cbrt` in C and - * Objective-C, and `simd::cbrt` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_cbrt(simd_float2 x); -/*! @abstract Do not call this function; instead use `cbrt` in C and - * Objective-C, and `simd::cbrt` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_cbrt(simd_float3 x); -/*! @abstract Do not call this function; instead use `cbrt` in C and - * Objective-C, and `simd::cbrt` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_cbrt(simd_float4 x); -/*! @abstract Do not call this function; instead use `cbrt` in C and - * Objective-C, and `simd::cbrt` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_cbrt(simd_float8 x); -/*! @abstract Do not call this function; instead use `cbrt` in C and - * Objective-C, and `simd::cbrt` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_cbrt(simd_float16 x); -/*! @abstract Do not call this function; instead use `cbrt` in C and - * Objective-C, and `simd::cbrt` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_cbrt(simd_double2 x); -/*! @abstract Do not call this function; instead use `cbrt` in C and - * Objective-C, and `simd::cbrt` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_cbrt(simd_double3 x); -/*! @abstract Do not call this function; instead use `cbrt` in C and - * Objective-C, and `simd::cbrt` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_cbrt(simd_double4 x); -/*! @abstract Do not call this function; instead use `cbrt` in C and - * Objective-C, and `simd::cbrt` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_cbrt(simd_double8 x); - -/*! @abstract Do not call this function; instead use `sqrt` in C and - * Objective-C, and `simd::sqrt` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_sqrt(simd_float2 x); -/*! @abstract Do not call this function; instead use `sqrt` in C and - * Objective-C, and `simd::sqrt` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_sqrt(simd_float3 x); -/*! @abstract Do not call this function; instead use `sqrt` in C and - * Objective-C, and `simd::sqrt` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_sqrt(simd_float4 x); -/*! @abstract Do not call this function; instead use `sqrt` in C and - * Objective-C, and `simd::sqrt` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_sqrt(simd_float8 x); -/*! @abstract Do not call this function; instead use `sqrt` in C and - * Objective-C, and `simd::sqrt` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_sqrt(simd_float16 x); -/*! @abstract Do not call this function; instead use `sqrt` in C and - * Objective-C, and `simd::sqrt` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_sqrt(simd_double2 x); -/*! @abstract Do not call this function; instead use `sqrt` in C and - * Objective-C, and `simd::sqrt` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_sqrt(simd_double3 x); -/*! @abstract Do not call this function; instead use `sqrt` in C and - * Objective-C, and `simd::sqrt` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_sqrt(simd_double4 x); -/*! @abstract Do not call this function; instead use `sqrt` in C and - * Objective-C, and `simd::sqrt` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_sqrt(simd_double8 x); - -/*! @abstract Do not call this function; instead use `erf` in C and - * Objective-C, and `simd::erf` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_erf(simd_float2 x); -/*! @abstract Do not call this function; instead use `erf` in C and - * Objective-C, and `simd::erf` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_erf(simd_float3 x); -/*! @abstract Do not call this function; instead use `erf` in C and - * Objective-C, and `simd::erf` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_erf(simd_float4 x); -/*! @abstract Do not call this function; instead use `erf` in C and - * Objective-C, and `simd::erf` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_erf(simd_float8 x); -/*! @abstract Do not call this function; instead use `erf` in C and - * Objective-C, and `simd::erf` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_erf(simd_float16 x); -/*! @abstract Do not call this function; instead use `erf` in C and - * Objective-C, and `simd::erf` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_erf(simd_double2 x); -/*! @abstract Do not call this function; instead use `erf` in C and - * Objective-C, and `simd::erf` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_erf(simd_double3 x); -/*! @abstract Do not call this function; instead use `erf` in C and - * Objective-C, and `simd::erf` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_erf(simd_double4 x); -/*! @abstract Do not call this function; instead use `erf` in C and - * Objective-C, and `simd::erf` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_erf(simd_double8 x); - -/*! @abstract Do not call this function; instead use `erfc` in C and - * Objective-C, and `simd::erfc` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_erfc(simd_float2 x); -/*! @abstract Do not call this function; instead use `erfc` in C and - * Objective-C, and `simd::erfc` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_erfc(simd_float3 x); -/*! @abstract Do not call this function; instead use `erfc` in C and - * Objective-C, and `simd::erfc` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_erfc(simd_float4 x); -/*! @abstract Do not call this function; instead use `erfc` in C and - * Objective-C, and `simd::erfc` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_erfc(simd_float8 x); -/*! @abstract Do not call this function; instead use `erfc` in C and - * Objective-C, and `simd::erfc` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_erfc(simd_float16 x); -/*! @abstract Do not call this function; instead use `erfc` in C and - * Objective-C, and `simd::erfc` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_erfc(simd_double2 x); -/*! @abstract Do not call this function; instead use `erfc` in C and - * Objective-C, and `simd::erfc` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_erfc(simd_double3 x); -/*! @abstract Do not call this function; instead use `erfc` in C and - * Objective-C, and `simd::erfc` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_erfc(simd_double4 x); -/*! @abstract Do not call this function; instead use `erfc` in C and - * Objective-C, and `simd::erfc` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_erfc(simd_double8 x); - -/*! @abstract Do not call this function; instead use `tgamma` in C and - * Objective-C, and `simd::tgamma` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_tgamma(simd_float2 x); -/*! @abstract Do not call this function; instead use `tgamma` in C and - * Objective-C, and `simd::tgamma` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_tgamma(simd_float3 x); -/*! @abstract Do not call this function; instead use `tgamma` in C and - * Objective-C, and `simd::tgamma` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_tgamma(simd_float4 x); -/*! @abstract Do not call this function; instead use `tgamma` in C and - * Objective-C, and `simd::tgamma` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_tgamma(simd_float8 x); -/*! @abstract Do not call this function; instead use `tgamma` in C and - * Objective-C, and `simd::tgamma` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_tgamma(simd_float16 x); -/*! @abstract Do not call this function; instead use `tgamma` in C and - * Objective-C, and `simd::tgamma` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_tgamma(simd_double2 x); -/*! @abstract Do not call this function; instead use `tgamma` in C and - * Objective-C, and `simd::tgamma` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_tgamma(simd_double3 x); -/*! @abstract Do not call this function; instead use `tgamma` in C and - * Objective-C, and `simd::tgamma` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_tgamma(simd_double4 x); -/*! @abstract Do not call this function; instead use `tgamma` in C and - * Objective-C, and `simd::tgamma` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_tgamma(simd_double8 x); - -/*! @abstract Do not call this function; instead use `ceil` in C and - * Objective-C, and `simd::ceil` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_ceil(simd_float2 x); -/*! @abstract Do not call this function; instead use `ceil` in C and - * Objective-C, and `simd::ceil` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_ceil(simd_float3 x); -/*! @abstract Do not call this function; instead use `ceil` in C and - * Objective-C, and `simd::ceil` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_ceil(simd_float4 x); -/*! @abstract Do not call this function; instead use `ceil` in C and - * Objective-C, and `simd::ceil` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_ceil(simd_float8 x); -/*! @abstract Do not call this function; instead use `ceil` in C and - * Objective-C, and `simd::ceil` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_ceil(simd_float16 x); -/*! @abstract Do not call this function; instead use `ceil` in C and - * Objective-C, and `simd::ceil` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_ceil(simd_double2 x); -/*! @abstract Do not call this function; instead use `ceil` in C and - * Objective-C, and `simd::ceil` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_ceil(simd_double3 x); -/*! @abstract Do not call this function; instead use `ceil` in C and - * Objective-C, and `simd::ceil` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_ceil(simd_double4 x); -/*! @abstract Do not call this function; instead use `ceil` in C and - * Objective-C, and `simd::ceil` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_ceil(simd_double8 x); - -/*! @abstract Do not call this function; instead use `floor` in C and - * Objective-C, and `simd::floor` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_floor(simd_float2 x); -/*! @abstract Do not call this function; instead use `floor` in C and - * Objective-C, and `simd::floor` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_floor(simd_float3 x); -/*! @abstract Do not call this function; instead use `floor` in C and - * Objective-C, and `simd::floor` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_floor(simd_float4 x); -/*! @abstract Do not call this function; instead use `floor` in C and - * Objective-C, and `simd::floor` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_floor(simd_float8 x); -/*! @abstract Do not call this function; instead use `floor` in C and - * Objective-C, and `simd::floor` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_floor(simd_float16 x); -/*! @abstract Do not call this function; instead use `floor` in C and - * Objective-C, and `simd::floor` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_floor(simd_double2 x); -/*! @abstract Do not call this function; instead use `floor` in C and - * Objective-C, and `simd::floor` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_floor(simd_double3 x); -/*! @abstract Do not call this function; instead use `floor` in C and - * Objective-C, and `simd::floor` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_floor(simd_double4 x); -/*! @abstract Do not call this function; instead use `floor` in C and - * Objective-C, and `simd::floor` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_floor(simd_double8 x); - -/*! @abstract Do not call this function; instead use `rint` in C and - * Objective-C, and `simd::rint` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_rint(simd_float2 x); -/*! @abstract Do not call this function; instead use `rint` in C and - * Objective-C, and `simd::rint` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_rint(simd_float3 x); -/*! @abstract Do not call this function; instead use `rint` in C and - * Objective-C, and `simd::rint` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_rint(simd_float4 x); -/*! @abstract Do not call this function; instead use `rint` in C and - * Objective-C, and `simd::rint` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_rint(simd_float8 x); -/*! @abstract Do not call this function; instead use `rint` in C and - * Objective-C, and `simd::rint` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_rint(simd_float16 x); -/*! @abstract Do not call this function; instead use `rint` in C and - * Objective-C, and `simd::rint` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_rint(simd_double2 x); -/*! @abstract Do not call this function; instead use `rint` in C and - * Objective-C, and `simd::rint` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_rint(simd_double3 x); -/*! @abstract Do not call this function; instead use `rint` in C and - * Objective-C, and `simd::rint` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_rint(simd_double4 x); -/*! @abstract Do not call this function; instead use `rint` in C and - * Objective-C, and `simd::rint` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_rint(simd_double8 x); - -/*! @abstract Do not call this function; instead use `round` in C and - * Objective-C, and `simd::round` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_round(simd_float2 x); -/*! @abstract Do not call this function; instead use `round` in C and - * Objective-C, and `simd::round` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_round(simd_float3 x); -/*! @abstract Do not call this function; instead use `round` in C and - * Objective-C, and `simd::round` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_round(simd_float4 x); -/*! @abstract Do not call this function; instead use `round` in C and - * Objective-C, and `simd::round` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_round(simd_float8 x); -/*! @abstract Do not call this function; instead use `round` in C and - * Objective-C, and `simd::round` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_round(simd_float16 x); -/*! @abstract Do not call this function; instead use `round` in C and - * Objective-C, and `simd::round` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_round(simd_double2 x); -/*! @abstract Do not call this function; instead use `round` in C and - * Objective-C, and `simd::round` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_round(simd_double3 x); -/*! @abstract Do not call this function; instead use `round` in C and - * Objective-C, and `simd::round` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_round(simd_double4 x); -/*! @abstract Do not call this function; instead use `round` in C and - * Objective-C, and `simd::round` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_round(simd_double8 x); - -/*! @abstract Do not call this function; instead use `trunc` in C and - * Objective-C, and `simd::trunc` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_trunc(simd_float2 x); -/*! @abstract Do not call this function; instead use `trunc` in C and - * Objective-C, and `simd::trunc` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_trunc(simd_float3 x); -/*! @abstract Do not call this function; instead use `trunc` in C and - * Objective-C, and `simd::trunc` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_trunc(simd_float4 x); -/*! @abstract Do not call this function; instead use `trunc` in C and - * Objective-C, and `simd::trunc` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_trunc(simd_float8 x); -/*! @abstract Do not call this function; instead use `trunc` in C and - * Objective-C, and `simd::trunc` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_trunc(simd_float16 x); -/*! @abstract Do not call this function; instead use `trunc` in C and - * Objective-C, and `simd::trunc` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_trunc(simd_double2 x); -/*! @abstract Do not call this function; instead use `trunc` in C and - * Objective-C, and `simd::trunc` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_trunc(simd_double3 x); -/*! @abstract Do not call this function; instead use `trunc` in C and - * Objective-C, and `simd::trunc` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_trunc(simd_double4 x); -/*! @abstract Do not call this function; instead use `trunc` in C and - * Objective-C, and `simd::trunc` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_trunc(simd_double8 x); - - -/*! @abstract Do not call this function; instead use `atan2` in C and - * Objective-C, and `simd::atan2` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_atan2(simd_float2 y, simd_float2 x); -/*! @abstract Do not call this function; instead use `atan2` in C and - * Objective-C, and `simd::atan2` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_atan2(simd_float3 y, simd_float3 x); -/*! @abstract Do not call this function; instead use `atan2` in C and - * Objective-C, and `simd::atan2` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_atan2(simd_float4 y, simd_float4 x); -/*! @abstract Do not call this function; instead use `atan2` in C and - * Objective-C, and `simd::atan2` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_atan2(simd_float8 y, simd_float8 x); -/*! @abstract Do not call this function; instead use `atan2` in C and - * Objective-C, and `simd::atan2` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_atan2(simd_float16 y, simd_float16 x); -/*! @abstract Do not call this function; instead use `atan2` in C and - * Objective-C, and `simd::atan2` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_atan2(simd_double2 y, simd_double2 x); -/*! @abstract Do not call this function; instead use `atan2` in C and - * Objective-C, and `simd::atan2` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_atan2(simd_double3 y, simd_double3 x); -/*! @abstract Do not call this function; instead use `atan2` in C and - * Objective-C, and `simd::atan2` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_atan2(simd_double4 y, simd_double4 x); -/*! @abstract Do not call this function; instead use `atan2` in C and - * Objective-C, and `simd::atan2` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_atan2(simd_double8 y, simd_double8 x); - -/*! @abstract Do not call this function; instead use `hypot` in C and - * Objective-C, and `simd::hypot` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_hypot(simd_float2 x, simd_float2 y); -/*! @abstract Do not call this function; instead use `hypot` in C and - * Objective-C, and `simd::hypot` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_hypot(simd_float3 x, simd_float3 y); -/*! @abstract Do not call this function; instead use `hypot` in C and - * Objective-C, and `simd::hypot` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_hypot(simd_float4 x, simd_float4 y); -/*! @abstract Do not call this function; instead use `hypot` in C and - * Objective-C, and `simd::hypot` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_hypot(simd_float8 x, simd_float8 y); -/*! @abstract Do not call this function; instead use `hypot` in C and - * Objective-C, and `simd::hypot` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_hypot(simd_float16 x, simd_float16 y); -/*! @abstract Do not call this function; instead use `hypot` in C and - * Objective-C, and `simd::hypot` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_hypot(simd_double2 x, simd_double2 y); -/*! @abstract Do not call this function; instead use `hypot` in C and - * Objective-C, and `simd::hypot` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_hypot(simd_double3 x, simd_double3 y); -/*! @abstract Do not call this function; instead use `hypot` in C and - * Objective-C, and `simd::hypot` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_hypot(simd_double4 x, simd_double4 y); -/*! @abstract Do not call this function; instead use `hypot` in C and - * Objective-C, and `simd::hypot` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_hypot(simd_double8 x, simd_double8 y); - -/*! @abstract Do not call this function; instead use `pow` in C and - * Objective-C, and `simd::pow` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_pow(simd_float2 x, simd_float2 y); -/*! @abstract Do not call this function; instead use `pow` in C and - * Objective-C, and `simd::pow` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_pow(simd_float3 x, simd_float3 y); -/*! @abstract Do not call this function; instead use `pow` in C and - * Objective-C, and `simd::pow` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_pow(simd_float4 x, simd_float4 y); -/*! @abstract Do not call this function; instead use `pow` in C and - * Objective-C, and `simd::pow` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_pow(simd_float8 x, simd_float8 y); -/*! @abstract Do not call this function; instead use `pow` in C and - * Objective-C, and `simd::pow` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_pow(simd_float16 x, simd_float16 y); -/*! @abstract Do not call this function; instead use `pow` in C and - * Objective-C, and `simd::pow` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_pow(simd_double2 x, simd_double2 y); -/*! @abstract Do not call this function; instead use `pow` in C and - * Objective-C, and `simd::pow` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_pow(simd_double3 x, simd_double3 y); -/*! @abstract Do not call this function; instead use `pow` in C and - * Objective-C, and `simd::pow` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_pow(simd_double4 x, simd_double4 y); -/*! @abstract Do not call this function; instead use `pow` in C and - * Objective-C, and `simd::pow` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_pow(simd_double8 x, simd_double8 y); - -/*! @abstract Do not call this function; instead use `fmod` in C and - * Objective-C, and `simd::fmod` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_fmod(simd_float2 x, simd_float2 y); -/*! @abstract Do not call this function; instead use `fmod` in C and - * Objective-C, and `simd::fmod` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_fmod(simd_float3 x, simd_float3 y); -/*! @abstract Do not call this function; instead use `fmod` in C and - * Objective-C, and `simd::fmod` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_fmod(simd_float4 x, simd_float4 y); -/*! @abstract Do not call this function; instead use `fmod` in C and - * Objective-C, and `simd::fmod` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_fmod(simd_float8 x, simd_float8 y); -/*! @abstract Do not call this function; instead use `fmod` in C and - * Objective-C, and `simd::fmod` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_fmod(simd_float16 x, simd_float16 y); -/*! @abstract Do not call this function; instead use `fmod` in C and - * Objective-C, and `simd::fmod` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_fmod(simd_double2 x, simd_double2 y); -/*! @abstract Do not call this function; instead use `fmod` in C and - * Objective-C, and `simd::fmod` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_fmod(simd_double3 x, simd_double3 y); -/*! @abstract Do not call this function; instead use `fmod` in C and - * Objective-C, and `simd::fmod` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_fmod(simd_double4 x, simd_double4 y); -/*! @abstract Do not call this function; instead use `fmod` in C and - * Objective-C, and `simd::fmod` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_fmod(simd_double8 x, simd_double8 y); - -/*! @abstract Do not call this function; instead use `remainder` in C and - * Objective-C, and `simd::remainder` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_remainder(simd_float2 x, simd_float2 y); -/*! @abstract Do not call this function; instead use `remainder` in C and - * Objective-C, and `simd::remainder` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_remainder(simd_float3 x, simd_float3 y); -/*! @abstract Do not call this function; instead use `remainder` in C and - * Objective-C, and `simd::remainder` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_remainder(simd_float4 x, simd_float4 y); -/*! @abstract Do not call this function; instead use `remainder` in C and - * Objective-C, and `simd::remainder` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_remainder(simd_float8 x, simd_float8 y); -/*! @abstract Do not call this function; instead use `remainder` in C and - * Objective-C, and `simd::remainder` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_remainder(simd_float16 x, simd_float16 y); -/*! @abstract Do not call this function; instead use `remainder` in C and - * Objective-C, and `simd::remainder` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_remainder(simd_double2 x, simd_double2 y); -/*! @abstract Do not call this function; instead use `remainder` in C and - * Objective-C, and `simd::remainder` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_remainder(simd_double3 x, simd_double3 y); -/*! @abstract Do not call this function; instead use `remainder` in C and - * Objective-C, and `simd::remainder` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_remainder(simd_double4 x, simd_double4 y); -/*! @abstract Do not call this function; instead use `remainder` in C and - * Objective-C, and `simd::remainder` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_remainder(simd_double8 x, simd_double8 y); - -/*! @abstract Do not call this function; instead use `copysign` in C and - * Objective-C, and `simd::copysign` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_copysign(simd_float2 x, simd_float2 y); -/*! @abstract Do not call this function; instead use `copysign` in C and - * Objective-C, and `simd::copysign` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_copysign(simd_float3 x, simd_float3 y); -/*! @abstract Do not call this function; instead use `copysign` in C and - * Objective-C, and `simd::copysign` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_copysign(simd_float4 x, simd_float4 y); -/*! @abstract Do not call this function; instead use `copysign` in C and - * Objective-C, and `simd::copysign` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_copysign(simd_float8 x, simd_float8 y); -/*! @abstract Do not call this function; instead use `copysign` in C and - * Objective-C, and `simd::copysign` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_copysign(simd_float16 x, simd_float16 y); -/*! @abstract Do not call this function; instead use `copysign` in C and - * Objective-C, and `simd::copysign` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_copysign(simd_double2 x, simd_double2 y); -/*! @abstract Do not call this function; instead use `copysign` in C and - * Objective-C, and `simd::copysign` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_copysign(simd_double3 x, simd_double3 y); -/*! @abstract Do not call this function; instead use `copysign` in C and - * Objective-C, and `simd::copysign` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_copysign(simd_double4 x, simd_double4 y); -/*! @abstract Do not call this function; instead use `copysign` in C and - * Objective-C, and `simd::copysign` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_copysign(simd_double8 x, simd_double8 y); - -/*! @abstract Do not call this function; instead use `nextafter` in C and - * Objective-C, and `simd::nextafter` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_nextafter(simd_float2 x, simd_float2 y); -/*! @abstract Do not call this function; instead use `nextafter` in C and - * Objective-C, and `simd::nextafter` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_nextafter(simd_float3 x, simd_float3 y); -/*! @abstract Do not call this function; instead use `nextafter` in C and - * Objective-C, and `simd::nextafter` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_nextafter(simd_float4 x, simd_float4 y); -/*! @abstract Do not call this function; instead use `nextafter` in C and - * Objective-C, and `simd::nextafter` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_nextafter(simd_float8 x, simd_float8 y); -/*! @abstract Do not call this function; instead use `nextafter` in C and - * Objective-C, and `simd::nextafter` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_nextafter(simd_float16 x, simd_float16 y); -/*! @abstract Do not call this function; instead use `nextafter` in C and - * Objective-C, and `simd::nextafter` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_nextafter(simd_double2 x, simd_double2 y); -/*! @abstract Do not call this function; instead use `nextafter` in C and - * Objective-C, and `simd::nextafter` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_nextafter(simd_double3 x, simd_double3 y); -/*! @abstract Do not call this function; instead use `nextafter` in C and - * Objective-C, and `simd::nextafter` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_nextafter(simd_double4 x, simd_double4 y); -/*! @abstract Do not call this function; instead use `nextafter` in C and - * Objective-C, and `simd::nextafter` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_nextafter(simd_double8 x, simd_double8 y); - -/*! @abstract Do not call this function; instead use `fdim` in C and - * Objective-C, and `simd::fdim` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_fdim(simd_float2 x, simd_float2 y); -/*! @abstract Do not call this function; instead use `fdim` in C and - * Objective-C, and `simd::fdim` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_fdim(simd_float3 x, simd_float3 y); -/*! @abstract Do not call this function; instead use `fdim` in C and - * Objective-C, and `simd::fdim` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_fdim(simd_float4 x, simd_float4 y); -/*! @abstract Do not call this function; instead use `fdim` in C and - * Objective-C, and `simd::fdim` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_fdim(simd_float8 x, simd_float8 y); -/*! @abstract Do not call this function; instead use `fdim` in C and - * Objective-C, and `simd::fdim` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_fdim(simd_float16 x, simd_float16 y); -/*! @abstract Do not call this function; instead use `fdim` in C and - * Objective-C, and `simd::fdim` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_fdim(simd_double2 x, simd_double2 y); -/*! @abstract Do not call this function; instead use `fdim` in C and - * Objective-C, and `simd::fdim` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_fdim(simd_double3 x, simd_double3 y); -/*! @abstract Do not call this function; instead use `fdim` in C and - * Objective-C, and `simd::fdim` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_fdim(simd_double4 x, simd_double4 y); -/*! @abstract Do not call this function; instead use `fdim` in C and - * Objective-C, and `simd::fdim` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_fdim(simd_double8 x, simd_double8 y); - -/*! @abstract Do not call this function; instead use `fmax` in C and - * Objective-C, and `simd::fmax` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_fmax(simd_float2 x, simd_float2 y); -/*! @abstract Do not call this function; instead use `fmax` in C and - * Objective-C, and `simd::fmax` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_fmax(simd_float3 x, simd_float3 y); -/*! @abstract Do not call this function; instead use `fmax` in C and - * Objective-C, and `simd::fmax` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_fmax(simd_float4 x, simd_float4 y); -/*! @abstract Do not call this function; instead use `fmax` in C and - * Objective-C, and `simd::fmax` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_fmax(simd_float8 x, simd_float8 y); -/*! @abstract Do not call this function; instead use `fmax` in C and - * Objective-C, and `simd::fmax` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_fmax(simd_float16 x, simd_float16 y); -/*! @abstract Do not call this function; instead use `fmax` in C and - * Objective-C, and `simd::fmax` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_fmax(simd_double2 x, simd_double2 y); -/*! @abstract Do not call this function; instead use `fmax` in C and - * Objective-C, and `simd::fmax` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_fmax(simd_double3 x, simd_double3 y); -/*! @abstract Do not call this function; instead use `fmax` in C and - * Objective-C, and `simd::fmax` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_fmax(simd_double4 x, simd_double4 y); -/*! @abstract Do not call this function; instead use `fmax` in C and - * Objective-C, and `simd::fmax` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_fmax(simd_double8 x, simd_double8 y); - -/*! @abstract Do not call this function; instead use `fmin` in C and - * Objective-C, and `simd::fmin` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_fmin(simd_float2 x, simd_float2 y); -/*! @abstract Do not call this function; instead use `fmin` in C and - * Objective-C, and `simd::fmin` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_fmin(simd_float3 x, simd_float3 y); -/*! @abstract Do not call this function; instead use `fmin` in C and - * Objective-C, and `simd::fmin` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_fmin(simd_float4 x, simd_float4 y); -/*! @abstract Do not call this function; instead use `fmin` in C and - * Objective-C, and `simd::fmin` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_fmin(simd_float8 x, simd_float8 y); -/*! @abstract Do not call this function; instead use `fmin` in C and - * Objective-C, and `simd::fmin` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_fmin(simd_float16 x, simd_float16 y); -/*! @abstract Do not call this function; instead use `fmin` in C and - * Objective-C, and `simd::fmin` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_fmin(simd_double2 x, simd_double2 y); -/*! @abstract Do not call this function; instead use `fmin` in C and - * Objective-C, and `simd::fmin` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_fmin(simd_double3 x, simd_double3 y); -/*! @abstract Do not call this function; instead use `fmin` in C and - * Objective-C, and `simd::fmin` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_fmin(simd_double4 x, simd_double4 y); -/*! @abstract Do not call this function; instead use `fmin` in C and - * Objective-C, and `simd::fmin` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_fmin(simd_double8 x, simd_double8 y); - - -/*! @abstract Do not call this function; instead use `fma` in C and Objective-C, - * and `simd::fma` in C++. */ -static inline SIMD_CFUNC simd_float2 __tg_fma(simd_float2 x, simd_float2 y, simd_float2 z); -/*! @abstract Do not call this function; instead use `fma` in C and Objective-C, - * and `simd::fma` in C++. */ -static inline SIMD_CFUNC simd_float3 __tg_fma(simd_float3 x, simd_float3 y, simd_float3 z); -/*! @abstract Do not call this function; instead use `fma` in C and Objective-C, - * and `simd::fma` in C++. */ -static inline SIMD_CFUNC simd_float4 __tg_fma(simd_float4 x, simd_float4 y, simd_float4 z); -/*! @abstract Do not call this function; instead use `fma` in C and Objective-C, - * and `simd::fma` in C++. */ -static inline SIMD_CFUNC simd_float8 __tg_fma(simd_float8 x, simd_float8 y, simd_float8 z); -/*! @abstract Do not call this function; instead use `fma` in C and Objective-C, - * and `simd::fma` in C++. */ -static inline SIMD_CFUNC simd_float16 __tg_fma(simd_float16 x, simd_float16 y, simd_float16 z); -/*! @abstract Do not call this function; instead use `fma` in C and Objective-C, - * and `simd::fma` in C++. */ -static inline SIMD_CFUNC simd_double2 __tg_fma(simd_double2 x, simd_double2 y, simd_double2 z); -/*! @abstract Do not call this function; instead use `fma` in C and Objective-C, - * and `simd::fma` in C++. */ -static inline SIMD_CFUNC simd_double3 __tg_fma(simd_double3 x, simd_double3 y, simd_double3 z); -/*! @abstract Do not call this function; instead use `fma` in C and Objective-C, - * and `simd::fma` in C++. */ -static inline SIMD_CFUNC simd_double4 __tg_fma(simd_double4 x, simd_double4 y, simd_double4 z); -/*! @abstract Do not call this function; instead use `fma` in C and Objective-C, - * and `simd::fma` in C++. */ -static inline SIMD_CFUNC simd_double8 __tg_fma(simd_double8 x, simd_double8 y, simd_double8 z); - -/*! @abstract Computes accum + x*y by the most efficient means available; - * either a fused multiply add or separate multiply and add instructions. */ -static inline SIMD_CFUNC float simd_muladd(float x, float y, float z); -/*! @abstract Computes accum + x*y by the most efficient means available; - * either a fused multiply add or separate multiply and add instructions. */ -static inline SIMD_CFUNC simd_float2 simd_muladd(simd_float2 x, simd_float2 y, simd_float2 z); -/*! @abstract Computes accum + x*y by the most efficient means available; - * either a fused multiply add or separate multiply and add instructions. */ -static inline SIMD_CFUNC simd_float3 simd_muladd(simd_float3 x, simd_float3 y, simd_float3 z); -/*! @abstract Computes accum + x*y by the most efficient means available; - * either a fused multiply add or separate multiply and add instructions. */ -static inline SIMD_CFUNC simd_float4 simd_muladd(simd_float4 x, simd_float4 y, simd_float4 z); -/*! @abstract Computes accum + x*y by the most efficient means available; - * either a fused multiply add or separate multiply and add instructions. */ -static inline SIMD_CFUNC simd_float8 simd_muladd(simd_float8 x, simd_float8 y, simd_float8 z); -/*! @abstract Computes accum + x*y by the most efficient means available; - * either a fused multiply add or separate multiply and add instructions. */ -static inline SIMD_CFUNC simd_float16 simd_muladd(simd_float16 x, simd_float16 y, simd_float16 z); -/*! @abstract Computes accum + x*y by the most efficient means available; - * either a fused multiply add or separate multiply and add instructions. */ -static inline SIMD_CFUNC double simd_muladd(double x, double y, double z); -/*! @abstract Computes accum + x*y by the most efficient means available; - * either a fused multiply add or separate multiply and add instructions. */ -static inline SIMD_CFUNC simd_double2 simd_muladd(simd_double2 x, simd_double2 y, simd_double2 z); -/*! @abstract Computes accum + x*y by the most efficient means available; - * either a fused multiply add or separate multiply and add instructions. */ -static inline SIMD_CFUNC simd_double3 simd_muladd(simd_double3 x, simd_double3 y, simd_double3 z); -/*! @abstract Computes accum + x*y by the most efficient means available; - * either a fused multiply add or separate multiply and add instructions. */ -static inline SIMD_CFUNC simd_double4 simd_muladd(simd_double4 x, simd_double4 y, simd_double4 z); -/*! @abstract Computes accum + x*y by the most efficient means available; - * either a fused multiply add or separate multiply and add instructions. */ -static inline SIMD_CFUNC simd_double8 simd_muladd(simd_double8 x, simd_double8 y, simd_double8 z); - -#ifdef __cplusplus -} /* extern "C" */ - -#include -/*! @abstract Do not call this function directly; use simd::acos instead. */ -static SIMD_CPPFUNC float __tg_acos(float x) { return ::acos(x); } -/*! @abstract Do not call this function directly; use simd::acos instead. */ -static SIMD_CPPFUNC double __tg_acos(double x) { return ::acos(x); } -/*! @abstract Do not call this function directly; use simd::asin instead. */ -static SIMD_CPPFUNC float __tg_asin(float x) { return ::asin(x); } -/*! @abstract Do not call this function directly; use simd::asin instead. */ -static SIMD_CPPFUNC double __tg_asin(double x) { return ::asin(x); } -/*! @abstract Do not call this function directly; use simd::atan instead. */ -static SIMD_CPPFUNC float __tg_atan(float x) { return ::atan(x); } -/*! @abstract Do not call this function directly; use simd::atan instead. */ -static SIMD_CPPFUNC double __tg_atan(double x) { return ::atan(x); } -/*! @abstract Do not call this function directly; use simd::cos instead. */ -static SIMD_CPPFUNC float __tg_cos(float x) { return ::cos(x); } -/*! @abstract Do not call this function directly; use simd::cos instead. */ -static SIMD_CPPFUNC double __tg_cos(double x) { return ::cos(x); } -/*! @abstract Do not call this function directly; use simd::sin instead. */ -static SIMD_CPPFUNC float __tg_sin(float x) { return ::sin(x); } -/*! @abstract Do not call this function directly; use simd::sin instead. */ -static SIMD_CPPFUNC double __tg_sin(double x) { return ::sin(x); } -/*! @abstract Do not call this function directly; use simd::tan instead. */ -static SIMD_CPPFUNC float __tg_tan(float x) { return ::tan(x); } -/*! @abstract Do not call this function directly; use simd::tan instead. */ -static SIMD_CPPFUNC double __tg_tan(double x) { return ::tan(x); } -/*! @abstract Do not call this function directly; use simd::cospi instead. */ -static SIMD_CPPFUNC float __tg_cospi(float x) { return ::__cospi(x); } -/*! @abstract Do not call this function directly; use simd::cospi instead. */ -static SIMD_CPPFUNC double __tg_cospi(double x) { return ::__cospi(x); } -/*! @abstract Do not call this function directly; use simd::sinpi instead. */ -static SIMD_CPPFUNC float __tg_sinpi(float x) { return ::__sinpi(x); } -/*! @abstract Do not call this function directly; use simd::sinpi instead. */ -static SIMD_CPPFUNC double __tg_sinpi(double x) { return ::__sinpi(x); } -/*! @abstract Do not call this function directly; use simd::tanpi instead. */ -static SIMD_CPPFUNC float __tg_tanpi(float x) { return ::__tanpi(x); } -/*! @abstract Do not call this function directly; use simd::tanpi instead. */ -static SIMD_CPPFUNC double __tg_tanpi(double x) { return ::__tanpi(x); } -/*! @abstract Do not call this function directly; use simd::acosh instead. */ -static SIMD_CPPFUNC float __tg_acosh(float x) { return ::acosh(x); } -/*! @abstract Do not call this function directly; use simd::acosh instead. */ -static SIMD_CPPFUNC double __tg_acosh(double x) { return ::acosh(x); } -/*! @abstract Do not call this function directly; use simd::asinh instead. */ -static SIMD_CPPFUNC float __tg_asinh(float x) { return ::asinh(x); } -/*! @abstract Do not call this function directly; use simd::asinh instead. */ -static SIMD_CPPFUNC double __tg_asinh(double x) { return ::asinh(x); } -/*! @abstract Do not call this function directly; use simd::atanh instead. */ -static SIMD_CPPFUNC float __tg_atanh(float x) { return ::atanh(x); } -/*! @abstract Do not call this function directly; use simd::atanh instead. */ -static SIMD_CPPFUNC double __tg_atanh(double x) { return ::atanh(x); } -/*! @abstract Do not call this function directly; use simd::cosh instead. */ -static SIMD_CPPFUNC float __tg_cosh(float x) { return ::cosh(x); } -/*! @abstract Do not call this function directly; use simd::cosh instead. */ -static SIMD_CPPFUNC double __tg_cosh(double x) { return ::cosh(x); } -/*! @abstract Do not call this function directly; use simd::sinh instead. */ -static SIMD_CPPFUNC float __tg_sinh(float x) { return ::sinh(x); } -/*! @abstract Do not call this function directly; use simd::sinh instead. */ -static SIMD_CPPFUNC double __tg_sinh(double x) { return ::sinh(x); } -/*! @abstract Do not call this function directly; use simd::tanh instead. */ -static SIMD_CPPFUNC float __tg_tanh(float x) { return ::tanh(x); } -/*! @abstract Do not call this function directly; use simd::tanh instead. */ -static SIMD_CPPFUNC double __tg_tanh(double x) { return ::tanh(x); } -/*! @abstract Do not call this function directly; use simd::exp instead. */ -static SIMD_CPPFUNC float __tg_exp(float x) { return ::exp(x); } -/*! @abstract Do not call this function directly; use simd::exp instead. */ -static SIMD_CPPFUNC double __tg_exp(double x) { return ::exp(x); } -/*! @abstract Do not call this function directly; use simd::exp2 instead. */ -static SIMD_CPPFUNC float __tg_exp2(float x) { return ::exp2(x); } -/*! @abstract Do not call this function directly; use simd::exp2 instead. */ -static SIMD_CPPFUNC double __tg_exp2(double x) { return ::exp2(x); } -/*! @abstract Do not call this function directly; use simd::exp10 instead. */ -static SIMD_CPPFUNC float __tg_exp10(float x) { return ::__exp10(x); } -/*! @abstract Do not call this function directly; use simd::exp10 instead. */ -static SIMD_CPPFUNC double __tg_exp10(double x) { return ::__exp10(x); } -/*! @abstract Do not call this function directly; use simd::expm1 instead. */ -static SIMD_CPPFUNC float __tg_expm1(float x) { return ::expm1(x); } -/*! @abstract Do not call this function directly; use simd::expm1 instead. */ -static SIMD_CPPFUNC double __tg_expm1(double x) { return ::expm1(x); } -/*! @abstract Do not call this function directly; use simd::log instead. */ -static SIMD_CPPFUNC float __tg_log(float x) { return ::log(x); } -/*! @abstract Do not call this function directly; use simd::log instead. */ -static SIMD_CPPFUNC double __tg_log(double x) { return ::log(x); } -/*! @abstract Do not call this function directly; use simd::log2 instead. */ -static SIMD_CPPFUNC float __tg_log2(float x) { return ::log2(x); } -/*! @abstract Do not call this function directly; use simd::log2 instead. */ -static SIMD_CPPFUNC double __tg_log2(double x) { return ::log2(x); } -/*! @abstract Do not call this function directly; use simd::log10 instead. */ -static SIMD_CPPFUNC float __tg_log10(float x) { return ::log10(x); } -/*! @abstract Do not call this function directly; use simd::log10 instead. */ -static SIMD_CPPFUNC double __tg_log10(double x) { return ::log10(x); } -/*! @abstract Do not call this function directly; use simd::log1p instead. */ -static SIMD_CPPFUNC float __tg_log1p(float x) { return ::log1p(x); } -/*! @abstract Do not call this function directly; use simd::log1p instead. */ -static SIMD_CPPFUNC double __tg_log1p(double x) { return ::log1p(x); } -/*! @abstract Do not call this function directly; use simd::fabs instead. */ -static SIMD_CPPFUNC float __tg_fabs(float x) { return ::fabs(x); } -/*! @abstract Do not call this function directly; use simd::fabs instead. */ -static SIMD_CPPFUNC double __tg_fabs(double x) { return ::fabs(x); } -/*! @abstract Do not call this function directly; use simd::cbrt instead. */ -static SIMD_CPPFUNC float __tg_cbrt(float x) { return ::cbrt(x); } -/*! @abstract Do not call this function directly; use simd::cbrt instead. */ -static SIMD_CPPFUNC double __tg_cbrt(double x) { return ::cbrt(x); } -/*! @abstract Do not call this function directly; use simd::sqrt instead. */ -static SIMD_CPPFUNC float __tg_sqrt(float x) { return ::sqrt(x); } -/*! @abstract Do not call this function directly; use simd::sqrt instead. */ -static SIMD_CPPFUNC double __tg_sqrt(double x) { return ::sqrt(x); } -/*! @abstract Do not call this function directly; use simd::erf instead. */ -static SIMD_CPPFUNC float __tg_erf(float x) { return ::erf(x); } -/*! @abstract Do not call this function directly; use simd::erf instead. */ -static SIMD_CPPFUNC double __tg_erf(double x) { return ::erf(x); } -/*! @abstract Do not call this function directly; use simd::erfc instead. */ -static SIMD_CPPFUNC float __tg_erfc(float x) { return ::erfc(x); } -/*! @abstract Do not call this function directly; use simd::erfc instead. */ -static SIMD_CPPFUNC double __tg_erfc(double x) { return ::erfc(x); } -/*! @abstract Do not call this function directly; use simd::tgamma instead. */ -static SIMD_CPPFUNC float __tg_tgamma(float x) { return ::tgamma(x); } -/*! @abstract Do not call this function directly; use simd::tgamma instead. */ -static SIMD_CPPFUNC double __tg_tgamma(double x) { return ::tgamma(x); } -/*! @abstract Do not call this function directly; use simd::ceil instead. */ -static SIMD_CPPFUNC float __tg_ceil(float x) { return ::ceil(x); } -/*! @abstract Do not call this function directly; use simd::ceil instead. */ -static SIMD_CPPFUNC double __tg_ceil(double x) { return ::ceil(x); } -/*! @abstract Do not call this function directly; use simd::floor instead. */ -static SIMD_CPPFUNC float __tg_floor(float x) { return ::floor(x); } -/*! @abstract Do not call this function directly; use simd::floor instead. */ -static SIMD_CPPFUNC double __tg_floor(double x) { return ::floor(x); } -/*! @abstract Do not call this function directly; use simd::rint instead. */ -static SIMD_CPPFUNC float __tg_rint(float x) { return ::rint(x); } -/*! @abstract Do not call this function directly; use simd::rint instead. */ -static SIMD_CPPFUNC double __tg_rint(double x) { return ::rint(x); } -/*! @abstract Do not call this function directly; use simd::round instead. */ -static SIMD_CPPFUNC float __tg_round(float x) { return ::round(x); } -/*! @abstract Do not call this function directly; use simd::round instead. */ -static SIMD_CPPFUNC double __tg_round(double x) { return ::round(x); } -/*! @abstract Do not call this function directly; use simd::trunc instead. */ -static SIMD_CPPFUNC float __tg_trunc(float x) { return ::trunc(x); } -/*! @abstract Do not call this function directly; use simd::trunc instead. */ -static SIMD_CPPFUNC double __tg_trunc(double x) { return ::trunc(x); } -/*! @abstract Do not call this function directly; use simd::atan2 instead. */ -static SIMD_CPPFUNC float __tg_atan2(float x, float y) { return ::atan2(x, y); } -/*! @abstract Do not call this function directly; use simd::atan2 instead. */ -static SIMD_CPPFUNC double __tg_atan2(double x, float y) { return ::atan2(x, y); } -/*! @abstract Do not call this function directly; use simd::hypot instead. */ -static SIMD_CPPFUNC float __tg_hypot(float x, float y) { return ::hypot(x, y); } -/*! @abstract Do not call this function directly; use simd::hypot instead. */ -static SIMD_CPPFUNC double __tg_hypot(double x, float y) { return ::hypot(x, y); } -/*! @abstract Do not call this function directly; use simd::pow instead. */ -static SIMD_CPPFUNC float __tg_pow(float x, float y) { return ::pow(x, y); } -/*! @abstract Do not call this function directly; use simd::pow instead. */ -static SIMD_CPPFUNC double __tg_pow(double x, float y) { return ::pow(x, y); } -/*! @abstract Do not call this function directly; use simd::fmod instead. */ -static SIMD_CPPFUNC float __tg_fmod(float x, float y) { return ::fmod(x, y); } -/*! @abstract Do not call this function directly; use simd::fmod instead. */ -static SIMD_CPPFUNC double __tg_fmod(double x, float y) { return ::fmod(x, y); } -/*! @abstract Do not call this function directly; use simd::remainder - * instead. */ -static SIMD_CPPFUNC float __tg_remainder(float x, float y) { return ::remainder(x, y); } -/*! @abstract Do not call this function directly; use simd::remainder - * instead. */ -static SIMD_CPPFUNC double __tg_remainder(double x, float y) { return ::remainder(x, y); } -/*! @abstract Do not call this function directly; use simd::copysign - * instead. */ -static SIMD_CPPFUNC float __tg_copysign(float x, float y) { return ::copysign(x, y); } -/*! @abstract Do not call this function directly; use simd::copysign - * instead. */ -static SIMD_CPPFUNC double __tg_copysign(double x, float y) { return ::copysign(x, y); } -/*! @abstract Do not call this function directly; use simd::nextafter - * instead. */ -static SIMD_CPPFUNC float __tg_nextafter(float x, float y) { return ::nextafter(x, y); } -/*! @abstract Do not call this function directly; use simd::nextafter - * instead. */ -static SIMD_CPPFUNC double __tg_nextafter(double x, float y) { return ::nextafter(x, y); } -/*! @abstract Do not call this function directly; use simd::fdim instead. */ -static SIMD_CPPFUNC float __tg_fdim(float x, float y) { return ::fdim(x, y); } -/*! @abstract Do not call this function directly; use simd::fdim instead. */ -static SIMD_CPPFUNC double __tg_fdim(double x, float y) { return ::fdim(x, y); } -/*! @abstract Do not call this function directly; use simd::fmax instead. */ -static SIMD_CPPFUNC float __tg_fmax(float x, float y) { return ::fmax(x, y); } -/*! @abstract Do not call this function directly; use simd::fmax instead. */ -static SIMD_CPPFUNC double __tg_fmax(double x, float y) { return ::fmax(x, y); } -/*! @abstract Do not call this function directly; use simd::fmin instead. */ -static SIMD_CPPFUNC float __tg_fmin(float x, float y) { return ::fmin(x, y); } -/*! @abstract Do not call this function directly; use simd::fmin instead. */ -static SIMD_CPPFUNC double __tg_fmin(double x, float y) { return ::fmin(x, y); } -/*! @abstract Do not call this function directly; use simd::fma instead. */ -static SIMD_CPPFUNC float __tg_fma(float x, float y, float z) { return ::fma(x, y, z); } -/*! @abstract Do not call this function directly; use simd::fma instead. */ -static SIMD_CPPFUNC double __tg_fma(double x, double y, double z) { return ::fma(x, y, z); } - -namespace simd { -/*! @abstract Generalizes the function acos to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN acos(fptypeN x) { return ::__tg_acos(x); } - -/*! @abstract Generalizes the function asin to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN asin(fptypeN x) { return ::__tg_asin(x); } - -/*! @abstract Generalizes the function atan to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN atan(fptypeN x) { return ::__tg_atan(x); } - -/*! @abstract Generalizes the function cos to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN cos(fptypeN x) { return ::__tg_cos(x); } - -/*! @abstract Generalizes the function sin to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN sin(fptypeN x) { return ::__tg_sin(x); } - -/*! @abstract Generalizes the function tan to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN tan(fptypeN x) { return ::__tg_tan(x); } - -#if SIMD_LIBRARY_VERSION >= 1 -/*! @abstract Generalizes the function cospi to operate on vectors - * of floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN cospi(fptypeN x) { return ::__tg_cospi(x); } -#endif - -#if SIMD_LIBRARY_VERSION >= 1 -/*! @abstract Generalizes the function sinpi to operate on vectors - * of floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN sinpi(fptypeN x) { return ::__tg_sinpi(x); } -#endif - -#if SIMD_LIBRARY_VERSION >= 1 -/*! @abstract Generalizes the function tanpi to operate on vectors - * of floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN tanpi(fptypeN x) { return ::__tg_tanpi(x); } -#endif - -/*! @abstract Generalizes the function acosh to operate on vectors - * of floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN acosh(fptypeN x) { return ::__tg_acosh(x); } - -/*! @abstract Generalizes the function asinh to operate on vectors - * of floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN asinh(fptypeN x) { return ::__tg_asinh(x); } - -/*! @abstract Generalizes the function atanh to operate on vectors - * of floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN atanh(fptypeN x) { return ::__tg_atanh(x); } - -/*! @abstract Generalizes the function cosh to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN cosh(fptypeN x) { return ::__tg_cosh(x); } - -/*! @abstract Generalizes the function sinh to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN sinh(fptypeN x) { return ::__tg_sinh(x); } - -/*! @abstract Generalizes the function tanh to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN tanh(fptypeN x) { return ::__tg_tanh(x); } - -/*! @abstract Generalizes the function exp to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN exp(fptypeN x) { return ::__tg_exp(x); } - -/*! @abstract Generalizes the function exp2 to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN exp2(fptypeN x) { return ::__tg_exp2(x); } - -#if SIMD_LIBRARY_VERSION >= 1 -/*! @abstract Generalizes the function exp10 to operate on vectors - * of floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN exp10(fptypeN x) { return ::__tg_exp10(x); } -#endif - -/*! @abstract Generalizes the function expm1 to operate on vectors - * of floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN expm1(fptypeN x) { return ::__tg_expm1(x); } - -/*! @abstract Generalizes the function log to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN log(fptypeN x) { return ::__tg_log(x); } - -/*! @abstract Generalizes the function log2 to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN log2(fptypeN x) { return ::__tg_log2(x); } - -/*! @abstract Generalizes the function log10 to operate on vectors - * of floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN log10(fptypeN x) { return ::__tg_log10(x); } - -/*! @abstract Generalizes the function log1p to operate on vectors - * of floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN log1p(fptypeN x) { return ::__tg_log1p(x); } - -/*! @abstract Generalizes the function fabs to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN fabs(fptypeN x) { return ::__tg_fabs(x); } - -/*! @abstract Generalizes the function cbrt to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN cbrt(fptypeN x) { return ::__tg_cbrt(x); } - -/*! @abstract Generalizes the function sqrt to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN sqrt(fptypeN x) { return ::__tg_sqrt(x); } - -/*! @abstract Generalizes the function erf to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN erf(fptypeN x) { return ::__tg_erf(x); } - -/*! @abstract Generalizes the function erfc to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN erfc(fptypeN x) { return ::__tg_erfc(x); } - -/*! @abstract Generalizes the function tgamma to operate on vectors - * of floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN tgamma(fptypeN x) { return ::__tg_tgamma(x); } - -/*! @abstract Generalizes the function ceil to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN ceil(fptypeN x) { return ::__tg_ceil(x); } - -/*! @abstract Generalizes the function floor to operate on vectors - * of floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN floor(fptypeN x) { return ::__tg_floor(x); } - -/*! @abstract Generalizes the function rint to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN rint(fptypeN x) { return ::__tg_rint(x); } - -/*! @abstract Generalizes the function round to operate on vectors - * of floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN round(fptypeN x) { return ::__tg_round(x); } - -/*! @abstract Generalizes the function trunc to operate on vectors - * of floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN trunc(fptypeN x) { return ::__tg_trunc(x); } - -/*! @abstract Generalizes the function atan2 to operate on vectors - * of floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN atan2(fptypeN y, fptypeN x) { return ::__tg_atan2(y, x); } - -/*! @abstract Generalizes the function hypot to operate on vectors - * of floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN hypot(fptypeN x, fptypeN y) { return ::__tg_hypot(x, y); } - -/*! @abstract Generalizes the function pow to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN pow(fptypeN x, fptypeN y) { return ::__tg_pow(x, y); } - -/*! @abstract Generalizes the function fmod to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN fmod(fptypeN x, fptypeN y) { return ::__tg_fmod(x, y); } - -/*! @abstract Generalizes the function remainder to operate on - * vectors of floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN remainder(fptypeN x, fptypeN y) { return ::__tg_remainder(x, y); } - -/*! @abstract Generalizes the function copysign to operate on - * vectors of floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN copysign(fptypeN x, fptypeN y) { return ::__tg_copysign(x, y); } - -/*! @abstract Generalizes the function nextafter to operate on - * vectors of floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN nextafter(fptypeN x, fptypeN y) { return ::__tg_nextafter(x, y); } - -/*! @abstract Generalizes the function fdim to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN fdim(fptypeN x, fptypeN y) { return ::__tg_fdim(x, y); } - -/*! @abstract Generalizes the function fmax to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN fmax(fptypeN x, fptypeN y) { return ::__tg_fmax(x, y); } - -/*! @abstract Generalizes the function fmin to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN fmin(fptypeN x, fptypeN y) { return ::__tg_fmin(x, y); } - -/*! @abstract Generalizes the function fma to operate on vectors of - * floats and doubles. */ - template - static SIMD_CPPFUNC fptypeN fma(fptypeN x, fptypeN y, fptypeN z) { return ::__tg_fma(x, y, z); } - -/*! @abstract Computes x*y + z by the most efficient means available; either - * a fused multiply add or separate multiply and add. */ - template - static SIMD_CPPFUNC fptypeN muladd(fptypeN x, fptypeN y, fptypeN z) { return ::simd_muladd(x, y, z); } -}; - -extern "C" { -#else -#include -/* C and Objective-C, we need some infrastructure to piggyback on tgmath.h */ -static SIMD_OVERLOAD simd_float2 __tg_promote(simd_float2); -static SIMD_OVERLOAD simd_float3 __tg_promote(simd_float3); -static SIMD_OVERLOAD simd_float4 __tg_promote(simd_float4); -static SIMD_OVERLOAD simd_float8 __tg_promote(simd_float8); -static SIMD_OVERLOAD simd_float16 __tg_promote(simd_float16); -static SIMD_OVERLOAD simd_double2 __tg_promote(simd_double2); -static SIMD_OVERLOAD simd_double3 __tg_promote(simd_double3); -static SIMD_OVERLOAD simd_double4 __tg_promote(simd_double4); -static SIMD_OVERLOAD simd_double8 __tg_promote(simd_double8); - -/* Apple extensions to , added in macOS 10.9 and iOS 7.0 */ -#if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_9 || \ - __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0 || \ - __DRIVERKIT_VERSION_MIN_REQUIRED >= __DRIVERKIT_19_0 -static inline SIMD_CFUNC float __tg_cospi(float x) { return __cospif(x); } -static inline SIMD_CFUNC double __tg_cospi(double x) { return __cospi(x); } -#undef cospi -/*! @abstract `cospi(x)` computes `cos(pi * x)` without intermediate rounding. - * - * @discussion Both faster and more accurate than multiplying by `pi` and then - * calling `cos`. Defined for `float` and `double` as well as vectors of - * floats and doubles as provided by ``. */ -#define cospi(__x) __tg_cospi(__tg_promote1((__x))(__x)) - -static inline SIMD_CFUNC float __tg_sinpi(float x) { return __sinpif(x); } -static inline SIMD_CFUNC double __tg_sinpi(double x) { return __sinpi(x); } -#undef sinpi -/*! @abstract `sinpi(x)` computes `sin(pi * x)` without intermediate rounding. - * - * @discussion Both faster and more accurate than multiplying by `pi` and then - * calling `sin`. Defined for `float` and `double` as well as vectors - * of floats and doubles as provided by ``. */ -#define sinpi(__x) __tg_sinpi(__tg_promote1((__x))(__x)) - -static inline SIMD_CFUNC float __tg_tanpi(float x) { return __tanpif(x); } -static inline SIMD_CFUNC double __tg_tanpi(double x) { return __tanpi(x); } -#undef tanpi -/*! @abstract `tanpi(x)` computes `tan(pi * x)` without intermediate rounding. - * - * @discussion Both faster and more accurate than multiplying by `pi` and then - * calling `tan`. Defined for `float` and `double` as well as vectors of - * floats and doubles as provided by ``. */ -#define tanpi(__x) __tg_tanpi(__tg_promote1((__x))(__x)) - -static inline SIMD_CFUNC float __tg_exp10(float x) { return __exp10f(x); } -static inline SIMD_CFUNC double __tg_exp10(double x) { return __exp10(x); } -#undef exp10 -/*! @abstract `exp10(x)` computes `10**x` more efficiently and accurately - * than `pow(10, x)`. - * - * @discussion Defined for `float` and `double` as well as vectors of floats - * and doubles as provided by ``. */ -#define exp10(__x) __tg_exp10(__tg_promote1((__x))(__x)) -#endif - -#endif /* !__cplusplus */ - -#pragma mark - fabs implementation -static inline SIMD_CFUNC simd_float2 __tg_fabs(simd_float2 x) { return simd_bitselect(0.0, x, 0x7fffffff); } -static inline SIMD_CFUNC simd_float3 __tg_fabs(simd_float3 x) { return simd_bitselect(0.0, x, 0x7fffffff); } -static inline SIMD_CFUNC simd_float4 __tg_fabs(simd_float4 x) { return simd_bitselect(0.0, x, 0x7fffffff); } -static inline SIMD_CFUNC simd_float8 __tg_fabs(simd_float8 x) { return simd_bitselect(0.0, x, 0x7fffffff); } -static inline SIMD_CFUNC simd_float16 __tg_fabs(simd_float16 x) { return simd_bitselect(0.0, x, 0x7fffffff); } -static inline SIMD_CFUNC simd_double2 __tg_fabs(simd_double2 x) { return simd_bitselect(0.0, x, 0x7fffffffffffffffL); } -static inline SIMD_CFUNC simd_double3 __tg_fabs(simd_double3 x) { return simd_bitselect(0.0, x, 0x7fffffffffffffffL); } -static inline SIMD_CFUNC simd_double4 __tg_fabs(simd_double4 x) { return simd_bitselect(0.0, x, 0x7fffffffffffffffL); } -static inline SIMD_CFUNC simd_double8 __tg_fabs(simd_double8 x) { return simd_bitselect(0.0, x, 0x7fffffffffffffffL); } - -#pragma mark - fmin, fmax implementation -static SIMD_CFUNC simd_float2 __tg_fmin(simd_float2 x, simd_float2 y) { -#if defined __SSE2__ - return simd_make_float2(__tg_fmin(simd_make_float4_undef(x), simd_make_float4_undef(y))); -#elif defined __arm64__ - return vminnm_f32(x, y); -#elif defined __arm__ && __FINITE_MATH_ONLY__ - return vmin_f32(x, y); -#else - return simd_bitselect(y, x, (x <= y) | (y != y)); -#endif -} - -static SIMD_CFUNC simd_float3 __tg_fmin(simd_float3 x, simd_float3 y) { - return simd_make_float3(__tg_fmin(simd_make_float4_undef(x), simd_make_float4_undef(y))); -} - -static SIMD_CFUNC simd_float4 __tg_fmin(simd_float4 x, simd_float4 y) { -#if defined __AVX512DQ__ && defined __AVX512VL__ && !__FINITE_MATH_ONLY__ - return _mm_range_ps(x, y, 4); -#elif defined __SSE2__ && __FINITE_MATH_ONLY__ - return _mm_min_ps(x, y); -#elif defined __SSE2__ - return simd_bitselect(_mm_min_ps(x, y), x, y != y); -#elif defined __arm64__ - return vminnmq_f32(x, y); -#elif defined __arm__ && __FINITE_MATH_ONLY__ - return vminq_f32(x, y); -#else - return simd_bitselect(y, x, (x <= y) | (y != y)); -#endif -} - -static SIMD_CFUNC simd_float8 __tg_fmin(simd_float8 x, simd_float8 y) { -#if defined __AVX512DQ__ && defined __AVX512VL__ && !__FINITE_MATH_ONLY__ - return _mm256_range_ps(x, y, 4); -#elif defined __AVX__ && __FINITE_MATH_ONLY__ - return _mm256_min_ps(x, y); -#elif defined __AVX__ - return simd_bitselect(_mm256_min_ps(x, y), x, y != y); -#else - return simd_make_float8(__tg_fmin(x.lo, y.lo), __tg_fmin(x.hi, y.hi)); -#endif -} - -static SIMD_CFUNC simd_float16 __tg_fmin(simd_float16 x, simd_float16 y) { -#if defined __AVX512DQ__ && !__FINITE_MATH_ONLY__ - return _mm512_range_ps(x, y, 4); -#elif defined __AVX512F__ && __FINITE_MATH_ONLY__ - return _mm512_min_ps(x, y); -#elif defined __AVX512F__ - return simd_bitselect(_mm512_min_ps(x, y), x, y != y); -#else - return simd_make_float16(__tg_fmin(x.lo, y.lo), __tg_fmin(x.hi, y.hi)); -#endif -} - -static SIMD_CFUNC simd_double2 __tg_fmin(simd_double2 x, simd_double2 y) { -#if defined __AVX512DQ__ && defined __AVX512VL__ - return _mm_range_pd(x, y, 4); -#elif defined __SSE2__ && __FINITE_MATH_ONLY__ - return _mm_min_pd(x, y); -#elif defined __SSE2__ - return simd_bitselect(_mm_min_pd(x, y), x, y != y); -#elif defined __arm64__ - return vminnmq_f64(x, y); -#else - return simd_bitselect(y, x, (x <= y) | (y != y)); -#endif -} - -static SIMD_CFUNC simd_double3 __tg_fmin(simd_double3 x, simd_double3 y) { - return simd_make_double3(__tg_fmin(simd_make_double4_undef(x), simd_make_double4_undef(y))); -} - -static SIMD_CFUNC simd_double4 __tg_fmin(simd_double4 x, simd_double4 y) { -#if defined __AVX512DQ__ && defined __AVX512VL__ - return _mm256_range_pd(x, y, 4); -#elif defined __AVX__ && __FINITE_MATH_ONLY__ - return _mm256_min_pd(x, y); -#elif defined __AVX__ - return simd_bitselect(_mm256_min_pd(x, y), x, y != y); -#else - return simd_make_double4(__tg_fmin(x.lo, y.lo), __tg_fmin(x.hi, y.hi)); -#endif -} - -static SIMD_CFUNC simd_double8 __tg_fmin(simd_double8 x, simd_double8 y) { -#if defined __AVX512DQ__ - return _mm512_range_pd(x, y, 4); -#elif defined __AVX512F__ && __FINITE_MATH_ONLY__ - return _mm512_min_pd(x, y); -#elif defined __AVX512F__ - return simd_bitselect(_mm512_min_pd(x, y), x, y != y); -#else - return simd_make_double8(__tg_fmin(x.lo, y.lo), __tg_fmin(x.hi, y.hi)); -#endif -} - -static SIMD_CFUNC simd_float2 __tg_fmax(simd_float2 x, simd_float2 y) { -#if defined __SSE2__ - return simd_make_float2(__tg_fmax(simd_make_float4_undef(x), simd_make_float4_undef(y))); -#elif defined __arm64__ - return vmaxnm_f32(x, y); -#elif defined __arm__ && __FINITE_MATH_ONLY__ - return vmax_f32(x, y); -#else - return simd_bitselect(y, x, (x >= y) | (y != y)); -#endif -} - -static SIMD_CFUNC simd_float3 __tg_fmax(simd_float3 x, simd_float3 y) { - return simd_make_float3(__tg_fmax(simd_make_float4_undef(x), simd_make_float4_undef(y))); -} - -static SIMD_CFUNC simd_float4 __tg_fmax(simd_float4 x, simd_float4 y) { -#if defined __AVX512DQ__ && defined __AVX512VL__ && !__FINITE_MATH_ONLY__ - return _mm_range_ps(x, y, 5); -#elif defined __SSE2__ && __FINITE_MATH_ONLY__ - return _mm_max_ps(x, y); -#elif defined __SSE2__ - return simd_bitselect(_mm_max_ps(x, y), x, y != y); -#elif defined __arm64__ - return vmaxnmq_f32(x, y); -#elif defined __arm__ && __FINITE_MATH_ONLY__ - return vmaxq_f32(x, y); -#else - return simd_bitselect(y, x, (x >= y) | (y != y)); -#endif -} - -static SIMD_CFUNC simd_float8 __tg_fmax(simd_float8 x, simd_float8 y) { -#if defined __AVX512DQ__ && defined __AVX512VL__ && !__FINITE_MATH_ONLY__ - return _mm256_range_ps(x, y, 5); -#elif defined __AVX__ && __FINITE_MATH_ONLY__ - return _mm256_max_ps(x, y); -#elif defined __AVX__ - return simd_bitselect(_mm256_max_ps(x, y), x, y != y); -#else - return simd_make_float8(__tg_fmax(x.lo, y.lo), __tg_fmax(x.hi, y.hi)); -#endif -} - -static SIMD_CFUNC simd_float16 __tg_fmax(simd_float16 x, simd_float16 y) { -#if defined __AVX512DQ__ && !__FINITE_MATH_ONLY__ - return _mm512_range_ps(x, y, 5); -#elif defined __AVX512F__ && __FINITE_MATH_ONLY__ - return _mm512_max_ps(x, y); -#elif defined __AVX512F__ - return simd_bitselect(_mm512_max_ps(x, y), x, y != y); -#else - return simd_make_float16(__tg_fmax(x.lo, y.lo), __tg_fmax(x.hi, y.hi)); -#endif -} - -static SIMD_CFUNC simd_double2 __tg_fmax(simd_double2 x, simd_double2 y) { -#if defined __AVX512DQ__ && defined __AVX512VL__ - return _mm_range_pd(x, y, 5); -#elif defined __SSE2__ && __FINITE_MATH_ONLY__ - return _mm_max_pd(x, y); -#elif defined __SSE2__ - return simd_bitselect(_mm_max_pd(x, y), x, y != y); -#elif defined __arm64__ - return vmaxnmq_f64(x, y); -#else - return simd_bitselect(y, x, (x >= y) | (y != y)); -#endif -} - -static SIMD_CFUNC simd_double3 __tg_fmax(simd_double3 x, simd_double3 y) { - return simd_make_double3(__tg_fmax(simd_make_double4_undef(x), simd_make_double4_undef(y))); -} - -static SIMD_CFUNC simd_double4 __tg_fmax(simd_double4 x, simd_double4 y) { -#if defined __AVX512DQ__ && defined __AVX512VL__ - return _mm256_range_pd(x, y, 5); -#elif defined __AVX__ && __FINITE_MATH_ONLY__ - return _mm256_max_pd(x, y); -#elif defined __AVX__ - return simd_bitselect(_mm256_max_pd(x, y), x, y != y); -#else - return simd_make_double4(__tg_fmax(x.lo, y.lo), __tg_fmax(x.hi, y.hi)); -#endif -} - -static SIMD_CFUNC simd_double8 __tg_fmax(simd_double8 x, simd_double8 y) { -#if defined __AVX512DQ__ - return _mm512_range_pd(x, y, 5); -#elif defined __AVX512F__ && __FINITE_MATH_ONLY__ - return _mm512_max_pd(x, y); -#elif defined __AVX512F__ - return simd_bitselect(_mm512_max_pd(x, y), x, y != y); -#else - return simd_make_double8(__tg_fmax(x.lo, y.lo), __tg_fmax(x.hi, y.hi)); -#endif -} - -#pragma mark - copysign implementation -static inline SIMD_CFUNC simd_float2 __tg_copysign(simd_float2 x, simd_float2 y) { return simd_bitselect(y, x, 0x7fffffff); } -static inline SIMD_CFUNC simd_float3 __tg_copysign(simd_float3 x, simd_float3 y) { return simd_bitselect(y, x, 0x7fffffff); } -static inline SIMD_CFUNC simd_float4 __tg_copysign(simd_float4 x, simd_float4 y) { return simd_bitselect(y, x, 0x7fffffff); } -static inline SIMD_CFUNC simd_float8 __tg_copysign(simd_float8 x, simd_float8 y) { return simd_bitselect(y, x, 0x7fffffff); } -static inline SIMD_CFUNC simd_float16 __tg_copysign(simd_float16 x, simd_float16 y) { return simd_bitselect(y, x, 0x7fffffff); } -static inline SIMD_CFUNC simd_double2 __tg_copysign(simd_double2 x, simd_double2 y) { return simd_bitselect(y, x, 0x7fffffffffffffffL); } -static inline SIMD_CFUNC simd_double3 __tg_copysign(simd_double3 x, simd_double3 y) { return simd_bitselect(y, x, 0x7fffffffffffffffL); } -static inline SIMD_CFUNC simd_double4 __tg_copysign(simd_double4 x, simd_double4 y) { return simd_bitselect(y, x, 0x7fffffffffffffffL); } -static inline SIMD_CFUNC simd_double8 __tg_copysign(simd_double8 x, simd_double8 y) { return simd_bitselect(y, x, 0x7fffffffffffffffL); } - -#pragma mark - sqrt implementation -static SIMD_CFUNC simd_float2 __tg_sqrt(simd_float2 x) { -#if defined __SSE2__ - return simd_make_float2(__tg_sqrt(simd_make_float4_undef(x))); -#elif defined __arm64__ - return vsqrt_f32(x); -#else - return simd_make_float2(sqrt(x.x), sqrt(x.y)); -#endif -} - -static SIMD_CFUNC simd_float3 __tg_sqrt(simd_float3 x) { - return simd_make_float3(__tg_sqrt(simd_make_float4_undef(x))); -} - -static SIMD_CFUNC simd_float4 __tg_sqrt(simd_float4 x) { -#if defined __SSE2__ - return _mm_sqrt_ps(x); -#elif defined __arm64__ - return vsqrtq_f32(x); -#else - return simd_make_float4(__tg_sqrt(x.lo), __tg_sqrt(x.hi)); -#endif -} - -static SIMD_CFUNC simd_float8 __tg_sqrt(simd_float8 x) { -#if defined __AVX__ - return _mm256_sqrt_ps(x); -#else - return simd_make_float8(__tg_sqrt(x.lo), __tg_sqrt(x.hi)); -#endif -} - -static SIMD_CFUNC simd_float16 __tg_sqrt(simd_float16 x) { -#if defined __AVX512F__ - return _mm512_sqrt_ps(x); -#else - return simd_make_float16(__tg_sqrt(x.lo), __tg_sqrt(x.hi)); -#endif -} - -static SIMD_CFUNC simd_double2 __tg_sqrt(simd_double2 x) { -#if defined __SSE2__ - return _mm_sqrt_pd(x); -#elif defined __arm64__ - return vsqrtq_f64(x); -#else - return simd_make_double2(sqrt(x.x), sqrt(x.y)); -#endif -} - -static SIMD_CFUNC simd_double3 __tg_sqrt(simd_double3 x) { - return simd_make_double3(__tg_sqrt(simd_make_double4_undef(x))); -} - -static SIMD_CFUNC simd_double4 __tg_sqrt(simd_double4 x) { -#if defined __AVX__ - return _mm256_sqrt_pd(x); -#else - return simd_make_double4(__tg_sqrt(x.lo), __tg_sqrt(x.hi)); -#endif -} - -static SIMD_CFUNC simd_double8 __tg_sqrt(simd_double8 x) { -#if defined __AVX512F__ - return _mm512_sqrt_pd(x); -#else - return simd_make_double8(__tg_sqrt(x.lo), __tg_sqrt(x.hi)); -#endif -} - -#pragma mark - ceil, floor, rint, trunc implementation -static SIMD_CFUNC simd_float2 __tg_ceil(simd_float2 x) { -#if defined __arm64__ - return vrndp_f32(x); -#else - return simd_make_float2(__tg_ceil(simd_make_float4_undef(x))); -#endif -} - -static SIMD_CFUNC simd_float3 __tg_ceil(simd_float3 x) { - return simd_make_float3(__tg_ceil(simd_make_float4_undef(x))); -} - -#if defined __arm__ && SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_ceil_f4(simd_float4 x); -#endif - -static SIMD_CFUNC simd_float4 __tg_ceil(simd_float4 x) { -#if defined __SSE4_1__ - return _mm_round_ps(x, _MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC); -#elif defined __arm64__ - return vrndpq_f32(x); -#elif defined __arm__ && SIMD_LIBRARY_VERSION >= 3 - return _simd_ceil_f4(x); -#else - simd_float4 truncated = __tg_trunc(x); - simd_float4 adjust = simd_bitselect((simd_float4)0, 1, truncated < x); - return __tg_copysign(truncated + adjust, x); -#endif -} - -static SIMD_CFUNC simd_float8 __tg_ceil(simd_float8 x) { -#if defined __AVX__ - return _mm256_round_ps(x, _MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC); -#else - return simd_make_float8(__tg_ceil(x.lo), __tg_ceil(x.hi)); -#endif -} - -static SIMD_CFUNC simd_float16 __tg_ceil(simd_float16 x) { -#if defined __AVX512F__ - return _mm512_roundscale_ps(x, _MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC); -#else - return simd_make_float16(__tg_ceil(x.lo), __tg_ceil(x.hi)); -#endif -} - -#if defined __arm__ && SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_ceil_d2(simd_double2 x); -#endif - -static SIMD_CFUNC simd_double2 __tg_ceil(simd_double2 x) { -#if defined __SSE4_1__ - return _mm_round_pd(x, _MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC); -#elif defined __arm64__ - return vrndpq_f64(x); -#elif defined __arm__ && SIMD_LIBRARY_VERSION >= 3 - return _simd_ceil_d2(x); -#else - simd_double2 truncated = __tg_trunc(x); - simd_double2 adjust = simd_bitselect((simd_double2)0, 1, truncated < x); - return __tg_copysign(truncated + adjust, x); -#endif -} - -static SIMD_CFUNC simd_double3 __tg_ceil(simd_double3 x) { - return simd_make_double3(__tg_ceil(simd_make_double4_undef(x))); -} - -static SIMD_CFUNC simd_double4 __tg_ceil(simd_double4 x) { -#if defined __AVX__ - return _mm256_round_pd(x, _MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC); -#else - return simd_make_double4(__tg_ceil(x.lo), __tg_ceil(x.hi)); -#endif -} - -static SIMD_CFUNC simd_double8 __tg_ceil(simd_double8 x) { -#if defined __AVX512F__ - return _mm512_roundscale_pd(x, _MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC); -#else - return simd_make_double8(__tg_ceil(x.lo), __tg_ceil(x.hi)); -#endif -} - -static SIMD_CFUNC simd_float2 __tg_floor(simd_float2 x) { -#if defined __arm64__ - return vrndm_f32(x); -#else - return simd_make_float2(__tg_floor(simd_make_float4_undef(x))); -#endif -} - -static SIMD_CFUNC simd_float3 __tg_floor(simd_float3 x) { - return simd_make_float3(__tg_floor(simd_make_float4_undef(x))); -} - -#if defined __arm__ && SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_floor_f4(simd_float4 x); -#endif - -static SIMD_CFUNC simd_float4 __tg_floor(simd_float4 x) { -#if defined __SSE4_1__ - return _mm_round_ps(x, _MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC); -#elif defined __arm64__ - return vrndmq_f32(x); -#elif defined __arm__ && SIMD_LIBRARY_VERSION >= 3 - return _simd_floor_f4(x); -#else - simd_float4 truncated = __tg_trunc(x); - simd_float4 adjust = simd_bitselect((simd_float4)0, 1, truncated > x); - return truncated - adjust; -#endif -} - -static SIMD_CFUNC simd_float8 __tg_floor(simd_float8 x) { -#if defined __AVX__ - return _mm256_round_ps(x, _MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC); -#else - return simd_make_float8(__tg_floor(x.lo), __tg_floor(x.hi)); -#endif -} - -static SIMD_CFUNC simd_float16 __tg_floor(simd_float16 x) { -#if defined __AVX512F__ - return _mm512_roundscale_ps(x, _MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC); -#else - return simd_make_float16(__tg_floor(x.lo), __tg_floor(x.hi)); -#endif -} - -#if defined __arm__ && SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_floor_d2(simd_double2 x); -#endif - -static SIMD_CFUNC simd_double2 __tg_floor(simd_double2 x) { -#if defined __SSE4_1__ - return _mm_round_pd(x, _MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC); -#elif defined __arm64__ - return vrndmq_f64(x); -#elif defined __arm__ && SIMD_LIBRARY_VERSION >= 3 - return _simd_floor_d2(x); -#else - simd_double2 truncated = __tg_trunc(x); - simd_double2 adjust = simd_bitselect((simd_double2)0, 1, truncated > x); - return truncated - adjust; -#endif -} - -static SIMD_CFUNC simd_double3 __tg_floor(simd_double3 x) { - return simd_make_double3(__tg_floor(simd_make_double4_undef(x))); -} - -static SIMD_CFUNC simd_double4 __tg_floor(simd_double4 x) { -#if defined __AVX__ - return _mm256_round_pd(x, _MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC); -#else - return simd_make_double4(__tg_floor(x.lo), __tg_floor(x.hi)); -#endif -} - -static SIMD_CFUNC simd_double8 __tg_floor(simd_double8 x) { -#if defined __AVX512F__ - return _mm512_roundscale_pd(x, _MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC); -#else - return simd_make_double8(__tg_floor(x.lo), __tg_floor(x.hi)); -#endif -} - -static SIMD_CFUNC simd_float2 __tg_rint(simd_float2 x) { -#if defined __arm64__ - return vrndx_f32(x); -#else - return simd_make_float2(__tg_rint(simd_make_float4_undef(x))); -#endif -} - -static SIMD_CFUNC simd_float3 __tg_rint(simd_float3 x) { - return simd_make_float3(__tg_rint(simd_make_float4_undef(x))); -} - -#if defined __arm__ && SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_rint_f4(simd_float4 x); -#endif - -static SIMD_CFUNC simd_float4 __tg_rint(simd_float4 x) { -#if defined __SSE4_1__ - return _mm_round_ps(x, _MM_FROUND_RINT); -#elif defined __arm64__ - return vrndxq_f32(x); -#elif defined __arm__ && SIMD_LIBRARY_VERSION >= 3 - return _simd_rint_f4(x); -#else - simd_float4 magic = __tg_copysign(0x1.0p23, x); - simd_int4 x_is_small = __tg_fabs(x) < 0x1.0p23; - return simd_bitselect(x, (x + magic) - magic, x_is_small & 0x7fffffff); -#endif -} - -static SIMD_CFUNC simd_float8 __tg_rint(simd_float8 x) { -#if defined __AVX__ - return _mm256_round_ps(x, _MM_FROUND_RINT); -#else - return simd_make_float8(__tg_rint(x.lo), __tg_rint(x.hi)); -#endif -} - -static SIMD_CFUNC simd_float16 __tg_rint(simd_float16 x) { -#if defined __AVX512F__ - return _mm512_roundscale_ps(x, _MM_FROUND_RINT); -#else - return simd_make_float16(__tg_rint(x.lo), __tg_rint(x.hi)); -#endif -} - -#if defined __arm__ && SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_rint_d2(simd_double2 x); -#endif - -static SIMD_CFUNC simd_double2 __tg_rint(simd_double2 x) { -#if defined __SSE4_1__ - return _mm_round_pd(x, _MM_FROUND_RINT); -#elif defined __arm64__ - return vrndxq_f64(x); -#elif defined __arm__ && SIMD_LIBRARY_VERSION >= 3 - return _simd_rint_d2(x); -#else - simd_double2 magic = __tg_copysign(0x1.0p52, x); - simd_long2 x_is_small = __tg_fabs(x) < 0x1.0p52; - return simd_bitselect(x, (x + magic) - magic, x_is_small & 0x7fffffffffffffff); -#endif -} - -static SIMD_CFUNC simd_double3 __tg_rint(simd_double3 x) { - return simd_make_double3(__tg_rint(simd_make_double4_undef(x))); -} - -static SIMD_CFUNC simd_double4 __tg_rint(simd_double4 x) { -#if defined __AVX__ - return _mm256_round_pd(x, _MM_FROUND_RINT); -#else - return simd_make_double4(__tg_rint(x.lo), __tg_rint(x.hi)); -#endif -} - -static SIMD_CFUNC simd_double8 __tg_rint(simd_double8 x) { -#if defined __AVX512F__ - return _mm512_roundscale_pd(x, _MM_FROUND_RINT); -#else - return simd_make_double8(__tg_rint(x.lo), __tg_rint(x.hi)); -#endif -} - -static SIMD_CFUNC simd_float2 __tg_trunc(simd_float2 x) { -#if defined __arm64__ - return vrnd_f32(x); -#else - return simd_make_float2(__tg_trunc(simd_make_float4_undef(x))); -#endif -} - -static SIMD_CFUNC simd_float3 __tg_trunc(simd_float3 x) { - return simd_make_float3(__tg_trunc(simd_make_float4_undef(x))); -} - -#if defined __arm__ && SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_trunc_f4(simd_float4 x); -#endif - -static SIMD_CFUNC simd_float4 __tg_trunc(simd_float4 x) { -#if defined __SSE4_1__ - return _mm_round_ps(x, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC); -#elif defined __arm64__ - return vrndq_f32(x); -#elif defined __arm__ && SIMD_LIBRARY_VERSION >= 3 - return _simd_trunc_f4(x); -#else - simd_float4 binade = simd_bitselect(0, x, 0x7f800000); - simd_int4 mask = (simd_int4)__tg_fmin(-2*binade + 1, -0); - simd_float4 result = simd_bitselect(0, x, mask); - return simd_bitselect(x, result, binade < 0x1.0p23); -#endif -} - -static SIMD_CFUNC simd_float8 __tg_trunc(simd_float8 x) { -#if defined __AVX__ - return _mm256_round_ps(x, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC); -#else - return simd_make_float8(__tg_trunc(x.lo), __tg_trunc(x.hi)); -#endif -} - -static SIMD_CFUNC simd_float16 __tg_trunc(simd_float16 x) { -#if defined __AVX512F__ - return _mm512_roundscale_ps(x, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC); -#else - return simd_make_float16(__tg_trunc(x.lo), __tg_trunc(x.hi)); -#endif -} - -#if defined __arm__ && SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_trunc_d2(simd_double2 x); -#endif - -static SIMD_CFUNC simd_double2 __tg_trunc(simd_double2 x) { -#if defined __SSE4_1__ - return _mm_round_pd(x, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC); -#elif defined __arm64__ - return vrndq_f64(x); -#elif defined __arm__ && SIMD_LIBRARY_VERSION >= 3 - return _simd_trunc_d2(x); -#else - simd_double2 binade = simd_bitselect(0, x, 0x7ff0000000000000); - simd_long2 mask = (simd_long2)__tg_fmin(-2*binade + 1, -0); - simd_double2 result = simd_bitselect(0, x, mask); - return simd_bitselect(x, result, binade < 0x1.0p52); -#endif -} - -static SIMD_CFUNC simd_double3 __tg_trunc(simd_double3 x) { - return simd_make_double3(__tg_trunc(simd_make_double4_undef(x))); -} - -static SIMD_CFUNC simd_double4 __tg_trunc(simd_double4 x) { -#if defined __AVX__ - return _mm256_round_pd(x, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC); -#else - return simd_make_double4(__tg_trunc(x.lo), __tg_trunc(x.hi)); -#endif -} - -static SIMD_CFUNC simd_double8 __tg_trunc(simd_double8 x) { -#if defined __AVX512F__ - return _mm512_roundscale_pd(x, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC); -#else - return simd_make_double8(__tg_trunc(x.lo), __tg_trunc(x.hi)); -#endif -} - -#pragma mark - sine, cosine implementation -static inline SIMD_CFUNC simd_float2 __tg_sin(simd_float2 x) { - return simd_make_float2(__tg_sin(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_sin(simd_float3 x) { - return simd_make_float3(__tg_sin(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_sin_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_sin(simd_float4 x) { - return _simd_sin_f4(x); -} -#elif SIMD_LIBRARY_VERSION == 1 -extern simd_float4 __sin_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_sin(simd_float4 x) { - return __sin_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_sin(simd_float4 x) { - return simd_make_float4(sin(x.x), sin(x.y), sin(x.z), sin(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_sin_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_sin(simd_float8 x) { - return _simd_sin_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_sin(simd_float8 x) { - return simd_make_float8(__tg_sin(x.lo), __tg_sin(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_sin_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_sin(simd_float16 x) { - return _simd_sin_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_sin(simd_float16 x) { - return simd_make_float16(__tg_sin(x.lo), __tg_sin(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_sin_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_sin(simd_double2 x) { - return _simd_sin_d2(x); -} -#elif SIMD_LIBRARY_VERSION == 1 -extern simd_double2 __sin_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_sin(simd_double2 x) { - return __sin_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_sin(simd_double2 x) { - return simd_make_double2(sin(x.x), sin(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_sin(simd_double3 x) { - return simd_make_double3(__tg_sin(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_sin_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_sin(simd_double4 x) { - return _simd_sin_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_sin(simd_double4 x) { - return simd_make_double4(__tg_sin(x.lo), __tg_sin(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_sin_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_sin(simd_double8 x) { - return _simd_sin_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_sin(simd_double8 x) { - return simd_make_double8(__tg_sin(x.lo), __tg_sin(x.hi)); -} -#endif - -static inline SIMD_CFUNC simd_float2 __tg_cos(simd_float2 x) { - return simd_make_float2(__tg_cos(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_cos(simd_float3 x) { - return simd_make_float3(__tg_cos(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_cos_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_cos(simd_float4 x) { - return _simd_cos_f4(x); -} -#elif SIMD_LIBRARY_VERSION == 1 -extern simd_float4 __cos_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_cos(simd_float4 x) { - return __cos_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_cos(simd_float4 x) { - return simd_make_float4(cos(x.x), cos(x.y), cos(x.z), cos(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_cos_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_cos(simd_float8 x) { - return _simd_cos_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_cos(simd_float8 x) { - return simd_make_float8(__tg_cos(x.lo), __tg_cos(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_cos_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_cos(simd_float16 x) { - return _simd_cos_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_cos(simd_float16 x) { - return simd_make_float16(__tg_cos(x.lo), __tg_cos(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_cos_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_cos(simd_double2 x) { - return _simd_cos_d2(x); -} -#elif SIMD_LIBRARY_VERSION == 1 -extern simd_double2 __cos_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_cos(simd_double2 x) { - return __cos_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_cos(simd_double2 x) { - return simd_make_double2(cos(x.x), cos(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_cos(simd_double3 x) { - return simd_make_double3(__tg_cos(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_cos_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_cos(simd_double4 x) { - return _simd_cos_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_cos(simd_double4 x) { - return simd_make_double4(__tg_cos(x.lo), __tg_cos(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_cos_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_cos(simd_double8 x) { - return _simd_cos_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_cos(simd_double8 x) { - return simd_make_double8(__tg_cos(x.lo), __tg_cos(x.hi)); -} -#endif - - -#pragma mark - acos implementation -static inline SIMD_CFUNC simd_float2 __tg_acos(simd_float2 x) { - return simd_make_float2(__tg_acos(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_acos(simd_float3 x) { - return simd_make_float3(__tg_acos(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_acos_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_acos(simd_float4 x) { - return _simd_acos_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_acos(simd_float4 x) { - return simd_make_float4(acos(x.x), acos(x.y), acos(x.z), acos(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_acos_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_acos(simd_float8 x) { - return _simd_acos_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_acos(simd_float8 x) { - return simd_make_float8(__tg_acos(x.lo), __tg_acos(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_acos_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_acos(simd_float16 x) { - return _simd_acos_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_acos(simd_float16 x) { - return simd_make_float16(__tg_acos(x.lo), __tg_acos(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_acos_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_acos(simd_double2 x) { - return _simd_acos_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_acos(simd_double2 x) { - return simd_make_double2(acos(x.x), acos(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_acos(simd_double3 x) { - return simd_make_double3(__tg_acos(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_acos_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_acos(simd_double4 x) { - return _simd_acos_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_acos(simd_double4 x) { - return simd_make_double4(__tg_acos(x.lo), __tg_acos(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_acos_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_acos(simd_double8 x) { - return _simd_acos_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_acos(simd_double8 x) { - return simd_make_double8(__tg_acos(x.lo), __tg_acos(x.hi)); -} -#endif - -#pragma mark - asin implementation -static inline SIMD_CFUNC simd_float2 __tg_asin(simd_float2 x) { - return simd_make_float2(__tg_asin(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_asin(simd_float3 x) { - return simd_make_float3(__tg_asin(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_asin_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_asin(simd_float4 x) { - return _simd_asin_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_asin(simd_float4 x) { - return simd_make_float4(asin(x.x), asin(x.y), asin(x.z), asin(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_asin_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_asin(simd_float8 x) { - return _simd_asin_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_asin(simd_float8 x) { - return simd_make_float8(__tg_asin(x.lo), __tg_asin(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_asin_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_asin(simd_float16 x) { - return _simd_asin_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_asin(simd_float16 x) { - return simd_make_float16(__tg_asin(x.lo), __tg_asin(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_asin_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_asin(simd_double2 x) { - return _simd_asin_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_asin(simd_double2 x) { - return simd_make_double2(asin(x.x), asin(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_asin(simd_double3 x) { - return simd_make_double3(__tg_asin(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_asin_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_asin(simd_double4 x) { - return _simd_asin_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_asin(simd_double4 x) { - return simd_make_double4(__tg_asin(x.lo), __tg_asin(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_asin_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_asin(simd_double8 x) { - return _simd_asin_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_asin(simd_double8 x) { - return simd_make_double8(__tg_asin(x.lo), __tg_asin(x.hi)); -} -#endif - -#pragma mark - atan implementation -static inline SIMD_CFUNC simd_float2 __tg_atan(simd_float2 x) { - return simd_make_float2(__tg_atan(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_atan(simd_float3 x) { - return simd_make_float3(__tg_atan(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_atan_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_atan(simd_float4 x) { - return _simd_atan_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_atan(simd_float4 x) { - return simd_make_float4(atan(x.x), atan(x.y), atan(x.z), atan(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_atan_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_atan(simd_float8 x) { - return _simd_atan_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_atan(simd_float8 x) { - return simd_make_float8(__tg_atan(x.lo), __tg_atan(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_atan_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_atan(simd_float16 x) { - return _simd_atan_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_atan(simd_float16 x) { - return simd_make_float16(__tg_atan(x.lo), __tg_atan(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_atan_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_atan(simd_double2 x) { - return _simd_atan_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_atan(simd_double2 x) { - return simd_make_double2(atan(x.x), atan(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_atan(simd_double3 x) { - return simd_make_double3(__tg_atan(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_atan_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_atan(simd_double4 x) { - return _simd_atan_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_atan(simd_double4 x) { - return simd_make_double4(__tg_atan(x.lo), __tg_atan(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_atan_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_atan(simd_double8 x) { - return _simd_atan_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_atan(simd_double8 x) { - return simd_make_double8(__tg_atan(x.lo), __tg_atan(x.hi)); -} -#endif - -#pragma mark - tan implementation -static inline SIMD_CFUNC simd_float2 __tg_tan(simd_float2 x) { - return simd_make_float2(__tg_tan(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_tan(simd_float3 x) { - return simd_make_float3(__tg_tan(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_tan_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_tan(simd_float4 x) { - return _simd_tan_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_tan(simd_float4 x) { - return simd_make_float4(tan(x.x), tan(x.y), tan(x.z), tan(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_tan_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_tan(simd_float8 x) { - return _simd_tan_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_tan(simd_float8 x) { - return simd_make_float8(__tg_tan(x.lo), __tg_tan(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_tan_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_tan(simd_float16 x) { - return _simd_tan_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_tan(simd_float16 x) { - return simd_make_float16(__tg_tan(x.lo), __tg_tan(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_tan_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_tan(simd_double2 x) { - return _simd_tan_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_tan(simd_double2 x) { - return simd_make_double2(tan(x.x), tan(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_tan(simd_double3 x) { - return simd_make_double3(__tg_tan(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_tan_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_tan(simd_double4 x) { - return _simd_tan_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_tan(simd_double4 x) { - return simd_make_double4(__tg_tan(x.lo), __tg_tan(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_tan_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_tan(simd_double8 x) { - return _simd_tan_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_tan(simd_double8 x) { - return simd_make_double8(__tg_tan(x.lo), __tg_tan(x.hi)); -} -#endif - -#pragma mark - cospi implementation -#if SIMD_LIBRARY_VERSION >= 1 -static inline SIMD_CFUNC simd_float2 __tg_cospi(simd_float2 x) { - return simd_make_float2(__tg_cospi(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_cospi(simd_float3 x) { - return simd_make_float3(__tg_cospi(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_cospi_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_cospi(simd_float4 x) { - return _simd_cospi_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_cospi(simd_float4 x) { - return simd_make_float4(__cospi(x.x), __cospi(x.y), __cospi(x.z), __cospi(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_cospi_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_cospi(simd_float8 x) { - return _simd_cospi_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_cospi(simd_float8 x) { - return simd_make_float8(__tg_cospi(x.lo), __tg_cospi(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_cospi_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_cospi(simd_float16 x) { - return _simd_cospi_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_cospi(simd_float16 x) { - return simd_make_float16(__tg_cospi(x.lo), __tg_cospi(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_cospi_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_cospi(simd_double2 x) { - return _simd_cospi_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_cospi(simd_double2 x) { - return simd_make_double2(__cospi(x.x), __cospi(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_cospi(simd_double3 x) { - return simd_make_double3(__tg_cospi(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_cospi_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_cospi(simd_double4 x) { - return _simd_cospi_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_cospi(simd_double4 x) { - return simd_make_double4(__tg_cospi(x.lo), __tg_cospi(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_cospi_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_cospi(simd_double8 x) { - return _simd_cospi_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_cospi(simd_double8 x) { - return simd_make_double8(__tg_cospi(x.lo), __tg_cospi(x.hi)); -} -#endif - -#endif /* SIMD_LIBRARY_VERSION */ -#pragma mark - sinpi implementation -#if SIMD_LIBRARY_VERSION >= 1 -static inline SIMD_CFUNC simd_float2 __tg_sinpi(simd_float2 x) { - return simd_make_float2(__tg_sinpi(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_sinpi(simd_float3 x) { - return simd_make_float3(__tg_sinpi(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_sinpi_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_sinpi(simd_float4 x) { - return _simd_sinpi_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_sinpi(simd_float4 x) { - return simd_make_float4(__sinpi(x.x), __sinpi(x.y), __sinpi(x.z), __sinpi(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_sinpi_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_sinpi(simd_float8 x) { - return _simd_sinpi_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_sinpi(simd_float8 x) { - return simd_make_float8(__tg_sinpi(x.lo), __tg_sinpi(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_sinpi_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_sinpi(simd_float16 x) { - return _simd_sinpi_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_sinpi(simd_float16 x) { - return simd_make_float16(__tg_sinpi(x.lo), __tg_sinpi(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_sinpi_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_sinpi(simd_double2 x) { - return _simd_sinpi_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_sinpi(simd_double2 x) { - return simd_make_double2(__sinpi(x.x), __sinpi(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_sinpi(simd_double3 x) { - return simd_make_double3(__tg_sinpi(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_sinpi_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_sinpi(simd_double4 x) { - return _simd_sinpi_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_sinpi(simd_double4 x) { - return simd_make_double4(__tg_sinpi(x.lo), __tg_sinpi(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_sinpi_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_sinpi(simd_double8 x) { - return _simd_sinpi_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_sinpi(simd_double8 x) { - return simd_make_double8(__tg_sinpi(x.lo), __tg_sinpi(x.hi)); -} -#endif - -#endif /* SIMD_LIBRARY_VERSION */ -#pragma mark - tanpi implementation -#if SIMD_LIBRARY_VERSION >= 1 -static inline SIMD_CFUNC simd_float2 __tg_tanpi(simd_float2 x) { - return simd_make_float2(__tg_tanpi(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_tanpi(simd_float3 x) { - return simd_make_float3(__tg_tanpi(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_tanpi_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_tanpi(simd_float4 x) { - return _simd_tanpi_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_tanpi(simd_float4 x) { - return simd_make_float4(__tanpi(x.x), __tanpi(x.y), __tanpi(x.z), __tanpi(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_tanpi_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_tanpi(simd_float8 x) { - return _simd_tanpi_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_tanpi(simd_float8 x) { - return simd_make_float8(__tg_tanpi(x.lo), __tg_tanpi(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_tanpi_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_tanpi(simd_float16 x) { - return _simd_tanpi_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_tanpi(simd_float16 x) { - return simd_make_float16(__tg_tanpi(x.lo), __tg_tanpi(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_tanpi_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_tanpi(simd_double2 x) { - return _simd_tanpi_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_tanpi(simd_double2 x) { - return simd_make_double2(__tanpi(x.x), __tanpi(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_tanpi(simd_double3 x) { - return simd_make_double3(__tg_tanpi(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_tanpi_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_tanpi(simd_double4 x) { - return _simd_tanpi_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_tanpi(simd_double4 x) { - return simd_make_double4(__tg_tanpi(x.lo), __tg_tanpi(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_tanpi_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_tanpi(simd_double8 x) { - return _simd_tanpi_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_tanpi(simd_double8 x) { - return simd_make_double8(__tg_tanpi(x.lo), __tg_tanpi(x.hi)); -} -#endif - -#endif /* SIMD_LIBRARY_VERSION */ -#pragma mark - acosh implementation -static inline SIMD_CFUNC simd_float2 __tg_acosh(simd_float2 x) { - return simd_make_float2(__tg_acosh(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_acosh(simd_float3 x) { - return simd_make_float3(__tg_acosh(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_acosh_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_acosh(simd_float4 x) { - return _simd_acosh_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_acosh(simd_float4 x) { - return simd_make_float4(acosh(x.x), acosh(x.y), acosh(x.z), acosh(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_acosh_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_acosh(simd_float8 x) { - return _simd_acosh_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_acosh(simd_float8 x) { - return simd_make_float8(__tg_acosh(x.lo), __tg_acosh(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_acosh_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_acosh(simd_float16 x) { - return _simd_acosh_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_acosh(simd_float16 x) { - return simd_make_float16(__tg_acosh(x.lo), __tg_acosh(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_acosh_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_acosh(simd_double2 x) { - return _simd_acosh_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_acosh(simd_double2 x) { - return simd_make_double2(acosh(x.x), acosh(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_acosh(simd_double3 x) { - return simd_make_double3(__tg_acosh(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_acosh_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_acosh(simd_double4 x) { - return _simd_acosh_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_acosh(simd_double4 x) { - return simd_make_double4(__tg_acosh(x.lo), __tg_acosh(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_acosh_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_acosh(simd_double8 x) { - return _simd_acosh_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_acosh(simd_double8 x) { - return simd_make_double8(__tg_acosh(x.lo), __tg_acosh(x.hi)); -} -#endif - -#pragma mark - asinh implementation -static inline SIMD_CFUNC simd_float2 __tg_asinh(simd_float2 x) { - return simd_make_float2(__tg_asinh(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_asinh(simd_float3 x) { - return simd_make_float3(__tg_asinh(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_asinh_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_asinh(simd_float4 x) { - return _simd_asinh_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_asinh(simd_float4 x) { - return simd_make_float4(asinh(x.x), asinh(x.y), asinh(x.z), asinh(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_asinh_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_asinh(simd_float8 x) { - return _simd_asinh_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_asinh(simd_float8 x) { - return simd_make_float8(__tg_asinh(x.lo), __tg_asinh(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_asinh_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_asinh(simd_float16 x) { - return _simd_asinh_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_asinh(simd_float16 x) { - return simd_make_float16(__tg_asinh(x.lo), __tg_asinh(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_asinh_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_asinh(simd_double2 x) { - return _simd_asinh_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_asinh(simd_double2 x) { - return simd_make_double2(asinh(x.x), asinh(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_asinh(simd_double3 x) { - return simd_make_double3(__tg_asinh(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_asinh_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_asinh(simd_double4 x) { - return _simd_asinh_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_asinh(simd_double4 x) { - return simd_make_double4(__tg_asinh(x.lo), __tg_asinh(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_asinh_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_asinh(simd_double8 x) { - return _simd_asinh_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_asinh(simd_double8 x) { - return simd_make_double8(__tg_asinh(x.lo), __tg_asinh(x.hi)); -} -#endif - -#pragma mark - atanh implementation -static inline SIMD_CFUNC simd_float2 __tg_atanh(simd_float2 x) { - return simd_make_float2(__tg_atanh(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_atanh(simd_float3 x) { - return simd_make_float3(__tg_atanh(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_atanh_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_atanh(simd_float4 x) { - return _simd_atanh_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_atanh(simd_float4 x) { - return simd_make_float4(atanh(x.x), atanh(x.y), atanh(x.z), atanh(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_atanh_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_atanh(simd_float8 x) { - return _simd_atanh_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_atanh(simd_float8 x) { - return simd_make_float8(__tg_atanh(x.lo), __tg_atanh(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_atanh_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_atanh(simd_float16 x) { - return _simd_atanh_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_atanh(simd_float16 x) { - return simd_make_float16(__tg_atanh(x.lo), __tg_atanh(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_atanh_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_atanh(simd_double2 x) { - return _simd_atanh_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_atanh(simd_double2 x) { - return simd_make_double2(atanh(x.x), atanh(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_atanh(simd_double3 x) { - return simd_make_double3(__tg_atanh(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_atanh_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_atanh(simd_double4 x) { - return _simd_atanh_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_atanh(simd_double4 x) { - return simd_make_double4(__tg_atanh(x.lo), __tg_atanh(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_atanh_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_atanh(simd_double8 x) { - return _simd_atanh_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_atanh(simd_double8 x) { - return simd_make_double8(__tg_atanh(x.lo), __tg_atanh(x.hi)); -} -#endif - -#pragma mark - cosh implementation -static inline SIMD_CFUNC simd_float2 __tg_cosh(simd_float2 x) { - return simd_make_float2(__tg_cosh(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_cosh(simd_float3 x) { - return simd_make_float3(__tg_cosh(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_cosh_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_cosh(simd_float4 x) { - return _simd_cosh_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_cosh(simd_float4 x) { - return simd_make_float4(cosh(x.x), cosh(x.y), cosh(x.z), cosh(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_cosh_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_cosh(simd_float8 x) { - return _simd_cosh_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_cosh(simd_float8 x) { - return simd_make_float8(__tg_cosh(x.lo), __tg_cosh(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_cosh_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_cosh(simd_float16 x) { - return _simd_cosh_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_cosh(simd_float16 x) { - return simd_make_float16(__tg_cosh(x.lo), __tg_cosh(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_cosh_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_cosh(simd_double2 x) { - return _simd_cosh_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_cosh(simd_double2 x) { - return simd_make_double2(cosh(x.x), cosh(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_cosh(simd_double3 x) { - return simd_make_double3(__tg_cosh(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_cosh_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_cosh(simd_double4 x) { - return _simd_cosh_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_cosh(simd_double4 x) { - return simd_make_double4(__tg_cosh(x.lo), __tg_cosh(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_cosh_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_cosh(simd_double8 x) { - return _simd_cosh_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_cosh(simd_double8 x) { - return simd_make_double8(__tg_cosh(x.lo), __tg_cosh(x.hi)); -} -#endif - -#pragma mark - sinh implementation -static inline SIMD_CFUNC simd_float2 __tg_sinh(simd_float2 x) { - return simd_make_float2(__tg_sinh(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_sinh(simd_float3 x) { - return simd_make_float3(__tg_sinh(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_sinh_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_sinh(simd_float4 x) { - return _simd_sinh_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_sinh(simd_float4 x) { - return simd_make_float4(sinh(x.x), sinh(x.y), sinh(x.z), sinh(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_sinh_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_sinh(simd_float8 x) { - return _simd_sinh_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_sinh(simd_float8 x) { - return simd_make_float8(__tg_sinh(x.lo), __tg_sinh(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_sinh_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_sinh(simd_float16 x) { - return _simd_sinh_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_sinh(simd_float16 x) { - return simd_make_float16(__tg_sinh(x.lo), __tg_sinh(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_sinh_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_sinh(simd_double2 x) { - return _simd_sinh_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_sinh(simd_double2 x) { - return simd_make_double2(sinh(x.x), sinh(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_sinh(simd_double3 x) { - return simd_make_double3(__tg_sinh(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_sinh_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_sinh(simd_double4 x) { - return _simd_sinh_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_sinh(simd_double4 x) { - return simd_make_double4(__tg_sinh(x.lo), __tg_sinh(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_sinh_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_sinh(simd_double8 x) { - return _simd_sinh_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_sinh(simd_double8 x) { - return simd_make_double8(__tg_sinh(x.lo), __tg_sinh(x.hi)); -} -#endif - -#pragma mark - tanh implementation -static inline SIMD_CFUNC simd_float2 __tg_tanh(simd_float2 x) { - return simd_make_float2(__tg_tanh(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_tanh(simd_float3 x) { - return simd_make_float3(__tg_tanh(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_tanh_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_tanh(simd_float4 x) { - return _simd_tanh_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_tanh(simd_float4 x) { - return simd_make_float4(tanh(x.x), tanh(x.y), tanh(x.z), tanh(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_tanh_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_tanh(simd_float8 x) { - return _simd_tanh_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_tanh(simd_float8 x) { - return simd_make_float8(__tg_tanh(x.lo), __tg_tanh(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_tanh_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_tanh(simd_float16 x) { - return _simd_tanh_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_tanh(simd_float16 x) { - return simd_make_float16(__tg_tanh(x.lo), __tg_tanh(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_tanh_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_tanh(simd_double2 x) { - return _simd_tanh_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_tanh(simd_double2 x) { - return simd_make_double2(tanh(x.x), tanh(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_tanh(simd_double3 x) { - return simd_make_double3(__tg_tanh(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_tanh_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_tanh(simd_double4 x) { - return _simd_tanh_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_tanh(simd_double4 x) { - return simd_make_double4(__tg_tanh(x.lo), __tg_tanh(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_tanh_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_tanh(simd_double8 x) { - return _simd_tanh_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_tanh(simd_double8 x) { - return simd_make_double8(__tg_tanh(x.lo), __tg_tanh(x.hi)); -} -#endif - -#pragma mark - exp implementation -static inline SIMD_CFUNC simd_float2 __tg_exp(simd_float2 x) { - return simd_make_float2(__tg_exp(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_exp(simd_float3 x) { - return simd_make_float3(__tg_exp(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_exp_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_exp(simd_float4 x) { - return _simd_exp_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_exp(simd_float4 x) { - return simd_make_float4(exp(x.x), exp(x.y), exp(x.z), exp(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_exp_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_exp(simd_float8 x) { - return _simd_exp_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_exp(simd_float8 x) { - return simd_make_float8(__tg_exp(x.lo), __tg_exp(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_exp_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_exp(simd_float16 x) { - return _simd_exp_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_exp(simd_float16 x) { - return simd_make_float16(__tg_exp(x.lo), __tg_exp(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_exp_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_exp(simd_double2 x) { - return _simd_exp_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_exp(simd_double2 x) { - return simd_make_double2(exp(x.x), exp(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_exp(simd_double3 x) { - return simd_make_double3(__tg_exp(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_exp_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_exp(simd_double4 x) { - return _simd_exp_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_exp(simd_double4 x) { - return simd_make_double4(__tg_exp(x.lo), __tg_exp(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_exp_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_exp(simd_double8 x) { - return _simd_exp_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_exp(simd_double8 x) { - return simd_make_double8(__tg_exp(x.lo), __tg_exp(x.hi)); -} -#endif - -#pragma mark - exp2 implementation -static inline SIMD_CFUNC simd_float2 __tg_exp2(simd_float2 x) { - return simd_make_float2(__tg_exp2(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_exp2(simd_float3 x) { - return simd_make_float3(__tg_exp2(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_exp2_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_exp2(simd_float4 x) { - return _simd_exp2_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_exp2(simd_float4 x) { - return simd_make_float4(exp2(x.x), exp2(x.y), exp2(x.z), exp2(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_exp2_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_exp2(simd_float8 x) { - return _simd_exp2_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_exp2(simd_float8 x) { - return simd_make_float8(__tg_exp2(x.lo), __tg_exp2(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_exp2_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_exp2(simd_float16 x) { - return _simd_exp2_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_exp2(simd_float16 x) { - return simd_make_float16(__tg_exp2(x.lo), __tg_exp2(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_exp2_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_exp2(simd_double2 x) { - return _simd_exp2_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_exp2(simd_double2 x) { - return simd_make_double2(exp2(x.x), exp2(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_exp2(simd_double3 x) { - return simd_make_double3(__tg_exp2(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_exp2_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_exp2(simd_double4 x) { - return _simd_exp2_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_exp2(simd_double4 x) { - return simd_make_double4(__tg_exp2(x.lo), __tg_exp2(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_exp2_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_exp2(simd_double8 x) { - return _simd_exp2_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_exp2(simd_double8 x) { - return simd_make_double8(__tg_exp2(x.lo), __tg_exp2(x.hi)); -} -#endif - -#pragma mark - exp10 implementation -#if SIMD_LIBRARY_VERSION >= 1 -static inline SIMD_CFUNC simd_float2 __tg_exp10(simd_float2 x) { - return simd_make_float2(__tg_exp10(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_exp10(simd_float3 x) { - return simd_make_float3(__tg_exp10(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_exp10_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_exp10(simd_float4 x) { - return _simd_exp10_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_exp10(simd_float4 x) { - return simd_make_float4(__exp10(x.x), __exp10(x.y), __exp10(x.z), __exp10(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_exp10_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_exp10(simd_float8 x) { - return _simd_exp10_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_exp10(simd_float8 x) { - return simd_make_float8(__tg_exp10(x.lo), __tg_exp10(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_exp10_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_exp10(simd_float16 x) { - return _simd_exp10_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_exp10(simd_float16 x) { - return simd_make_float16(__tg_exp10(x.lo), __tg_exp10(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_exp10_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_exp10(simd_double2 x) { - return _simd_exp10_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_exp10(simd_double2 x) { - return simd_make_double2(__exp10(x.x), __exp10(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_exp10(simd_double3 x) { - return simd_make_double3(__tg_exp10(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_exp10_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_exp10(simd_double4 x) { - return _simd_exp10_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_exp10(simd_double4 x) { - return simd_make_double4(__tg_exp10(x.lo), __tg_exp10(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_exp10_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_exp10(simd_double8 x) { - return _simd_exp10_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_exp10(simd_double8 x) { - return simd_make_double8(__tg_exp10(x.lo), __tg_exp10(x.hi)); -} -#endif - -#endif /* SIMD_LIBRARY_VERSION */ -#pragma mark - expm1 implementation -static inline SIMD_CFUNC simd_float2 __tg_expm1(simd_float2 x) { - return simd_make_float2(__tg_expm1(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_expm1(simd_float3 x) { - return simd_make_float3(__tg_expm1(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_expm1_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_expm1(simd_float4 x) { - return _simd_expm1_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_expm1(simd_float4 x) { - return simd_make_float4(expm1(x.x), expm1(x.y), expm1(x.z), expm1(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_expm1_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_expm1(simd_float8 x) { - return _simd_expm1_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_expm1(simd_float8 x) { - return simd_make_float8(__tg_expm1(x.lo), __tg_expm1(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_expm1_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_expm1(simd_float16 x) { - return _simd_expm1_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_expm1(simd_float16 x) { - return simd_make_float16(__tg_expm1(x.lo), __tg_expm1(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_expm1_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_expm1(simd_double2 x) { - return _simd_expm1_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_expm1(simd_double2 x) { - return simd_make_double2(expm1(x.x), expm1(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_expm1(simd_double3 x) { - return simd_make_double3(__tg_expm1(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_expm1_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_expm1(simd_double4 x) { - return _simd_expm1_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_expm1(simd_double4 x) { - return simd_make_double4(__tg_expm1(x.lo), __tg_expm1(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_expm1_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_expm1(simd_double8 x) { - return _simd_expm1_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_expm1(simd_double8 x) { - return simd_make_double8(__tg_expm1(x.lo), __tg_expm1(x.hi)); -} -#endif - -#pragma mark - log implementation -static inline SIMD_CFUNC simd_float2 __tg_log(simd_float2 x) { - return simd_make_float2(__tg_log(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_log(simd_float3 x) { - return simd_make_float3(__tg_log(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_log_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_log(simd_float4 x) { - return _simd_log_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_log(simd_float4 x) { - return simd_make_float4(log(x.x), log(x.y), log(x.z), log(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_log_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_log(simd_float8 x) { - return _simd_log_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_log(simd_float8 x) { - return simd_make_float8(__tg_log(x.lo), __tg_log(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_log_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_log(simd_float16 x) { - return _simd_log_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_log(simd_float16 x) { - return simd_make_float16(__tg_log(x.lo), __tg_log(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_log_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_log(simd_double2 x) { - return _simd_log_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_log(simd_double2 x) { - return simd_make_double2(log(x.x), log(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_log(simd_double3 x) { - return simd_make_double3(__tg_log(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_log_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_log(simd_double4 x) { - return _simd_log_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_log(simd_double4 x) { - return simd_make_double4(__tg_log(x.lo), __tg_log(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_log_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_log(simd_double8 x) { - return _simd_log_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_log(simd_double8 x) { - return simd_make_double8(__tg_log(x.lo), __tg_log(x.hi)); -} -#endif - -#pragma mark - log2 implementation -static inline SIMD_CFUNC simd_float2 __tg_log2(simd_float2 x) { - return simd_make_float2(__tg_log2(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_log2(simd_float3 x) { - return simd_make_float3(__tg_log2(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_log2_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_log2(simd_float4 x) { - return _simd_log2_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_log2(simd_float4 x) { - return simd_make_float4(log2(x.x), log2(x.y), log2(x.z), log2(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_log2_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_log2(simd_float8 x) { - return _simd_log2_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_log2(simd_float8 x) { - return simd_make_float8(__tg_log2(x.lo), __tg_log2(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_log2_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_log2(simd_float16 x) { - return _simd_log2_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_log2(simd_float16 x) { - return simd_make_float16(__tg_log2(x.lo), __tg_log2(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_log2_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_log2(simd_double2 x) { - return _simd_log2_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_log2(simd_double2 x) { - return simd_make_double2(log2(x.x), log2(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_log2(simd_double3 x) { - return simd_make_double3(__tg_log2(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_log2_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_log2(simd_double4 x) { - return _simd_log2_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_log2(simd_double4 x) { - return simd_make_double4(__tg_log2(x.lo), __tg_log2(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_log2_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_log2(simd_double8 x) { - return _simd_log2_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_log2(simd_double8 x) { - return simd_make_double8(__tg_log2(x.lo), __tg_log2(x.hi)); -} -#endif - -#pragma mark - log10 implementation -static inline SIMD_CFUNC simd_float2 __tg_log10(simd_float2 x) { - return simd_make_float2(__tg_log10(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_log10(simd_float3 x) { - return simd_make_float3(__tg_log10(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_log10_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_log10(simd_float4 x) { - return _simd_log10_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_log10(simd_float4 x) { - return simd_make_float4(log10(x.x), log10(x.y), log10(x.z), log10(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_log10_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_log10(simd_float8 x) { - return _simd_log10_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_log10(simd_float8 x) { - return simd_make_float8(__tg_log10(x.lo), __tg_log10(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_log10_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_log10(simd_float16 x) { - return _simd_log10_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_log10(simd_float16 x) { - return simd_make_float16(__tg_log10(x.lo), __tg_log10(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_log10_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_log10(simd_double2 x) { - return _simd_log10_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_log10(simd_double2 x) { - return simd_make_double2(log10(x.x), log10(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_log10(simd_double3 x) { - return simd_make_double3(__tg_log10(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_log10_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_log10(simd_double4 x) { - return _simd_log10_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_log10(simd_double4 x) { - return simd_make_double4(__tg_log10(x.lo), __tg_log10(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_log10_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_log10(simd_double8 x) { - return _simd_log10_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_log10(simd_double8 x) { - return simd_make_double8(__tg_log10(x.lo), __tg_log10(x.hi)); -} -#endif - -#pragma mark - log1p implementation -static inline SIMD_CFUNC simd_float2 __tg_log1p(simd_float2 x) { - return simd_make_float2(__tg_log1p(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_log1p(simd_float3 x) { - return simd_make_float3(__tg_log1p(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_log1p_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_log1p(simd_float4 x) { - return _simd_log1p_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_log1p(simd_float4 x) { - return simd_make_float4(log1p(x.x), log1p(x.y), log1p(x.z), log1p(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_log1p_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_log1p(simd_float8 x) { - return _simd_log1p_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_log1p(simd_float8 x) { - return simd_make_float8(__tg_log1p(x.lo), __tg_log1p(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_log1p_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_log1p(simd_float16 x) { - return _simd_log1p_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_log1p(simd_float16 x) { - return simd_make_float16(__tg_log1p(x.lo), __tg_log1p(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_log1p_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_log1p(simd_double2 x) { - return _simd_log1p_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_log1p(simd_double2 x) { - return simd_make_double2(log1p(x.x), log1p(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_log1p(simd_double3 x) { - return simd_make_double3(__tg_log1p(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_log1p_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_log1p(simd_double4 x) { - return _simd_log1p_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_log1p(simd_double4 x) { - return simd_make_double4(__tg_log1p(x.lo), __tg_log1p(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_log1p_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_log1p(simd_double8 x) { - return _simd_log1p_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_log1p(simd_double8 x) { - return simd_make_double8(__tg_log1p(x.lo), __tg_log1p(x.hi)); -} -#endif - -#pragma mark - cbrt implementation -static inline SIMD_CFUNC simd_float2 __tg_cbrt(simd_float2 x) { - return simd_make_float2(__tg_cbrt(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_cbrt(simd_float3 x) { - return simd_make_float3(__tg_cbrt(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_cbrt_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_cbrt(simd_float4 x) { - return _simd_cbrt_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_cbrt(simd_float4 x) { - return simd_make_float4(cbrt(x.x), cbrt(x.y), cbrt(x.z), cbrt(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_cbrt_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_cbrt(simd_float8 x) { - return _simd_cbrt_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_cbrt(simd_float8 x) { - return simd_make_float8(__tg_cbrt(x.lo), __tg_cbrt(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_cbrt_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_cbrt(simd_float16 x) { - return _simd_cbrt_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_cbrt(simd_float16 x) { - return simd_make_float16(__tg_cbrt(x.lo), __tg_cbrt(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_cbrt_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_cbrt(simd_double2 x) { - return _simd_cbrt_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_cbrt(simd_double2 x) { - return simd_make_double2(cbrt(x.x), cbrt(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_cbrt(simd_double3 x) { - return simd_make_double3(__tg_cbrt(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_cbrt_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_cbrt(simd_double4 x) { - return _simd_cbrt_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_cbrt(simd_double4 x) { - return simd_make_double4(__tg_cbrt(x.lo), __tg_cbrt(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_cbrt_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_cbrt(simd_double8 x) { - return _simd_cbrt_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_cbrt(simd_double8 x) { - return simd_make_double8(__tg_cbrt(x.lo), __tg_cbrt(x.hi)); -} -#endif - -#pragma mark - erf implementation -static inline SIMD_CFUNC simd_float2 __tg_erf(simd_float2 x) { - return simd_make_float2(__tg_erf(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_erf(simd_float3 x) { - return simd_make_float3(__tg_erf(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_erf_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_erf(simd_float4 x) { - return _simd_erf_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_erf(simd_float4 x) { - return simd_make_float4(erf(x.x), erf(x.y), erf(x.z), erf(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_erf_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_erf(simd_float8 x) { - return _simd_erf_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_erf(simd_float8 x) { - return simd_make_float8(__tg_erf(x.lo), __tg_erf(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_erf_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_erf(simd_float16 x) { - return _simd_erf_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_erf(simd_float16 x) { - return simd_make_float16(__tg_erf(x.lo), __tg_erf(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_erf_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_erf(simd_double2 x) { - return _simd_erf_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_erf(simd_double2 x) { - return simd_make_double2(erf(x.x), erf(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_erf(simd_double3 x) { - return simd_make_double3(__tg_erf(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_erf_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_erf(simd_double4 x) { - return _simd_erf_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_erf(simd_double4 x) { - return simd_make_double4(__tg_erf(x.lo), __tg_erf(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_erf_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_erf(simd_double8 x) { - return _simd_erf_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_erf(simd_double8 x) { - return simd_make_double8(__tg_erf(x.lo), __tg_erf(x.hi)); -} -#endif - -#pragma mark - erfc implementation -static inline SIMD_CFUNC simd_float2 __tg_erfc(simd_float2 x) { - return simd_make_float2(__tg_erfc(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_erfc(simd_float3 x) { - return simd_make_float3(__tg_erfc(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_erfc_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_erfc(simd_float4 x) { - return _simd_erfc_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_erfc(simd_float4 x) { - return simd_make_float4(erfc(x.x), erfc(x.y), erfc(x.z), erfc(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_erfc_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_erfc(simd_float8 x) { - return _simd_erfc_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_erfc(simd_float8 x) { - return simd_make_float8(__tg_erfc(x.lo), __tg_erfc(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_erfc_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_erfc(simd_float16 x) { - return _simd_erfc_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_erfc(simd_float16 x) { - return simd_make_float16(__tg_erfc(x.lo), __tg_erfc(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_erfc_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_erfc(simd_double2 x) { - return _simd_erfc_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_erfc(simd_double2 x) { - return simd_make_double2(erfc(x.x), erfc(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_erfc(simd_double3 x) { - return simd_make_double3(__tg_erfc(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_erfc_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_erfc(simd_double4 x) { - return _simd_erfc_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_erfc(simd_double4 x) { - return simd_make_double4(__tg_erfc(x.lo), __tg_erfc(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_erfc_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_erfc(simd_double8 x) { - return _simd_erfc_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_erfc(simd_double8 x) { - return simd_make_double8(__tg_erfc(x.lo), __tg_erfc(x.hi)); -} -#endif - -#pragma mark - tgamma implementation -static inline SIMD_CFUNC simd_float2 __tg_tgamma(simd_float2 x) { - return simd_make_float2(__tg_tgamma(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_tgamma(simd_float3 x) { - return simd_make_float3(__tg_tgamma(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_tgamma_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_tgamma(simd_float4 x) { - return _simd_tgamma_f4(x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_tgamma(simd_float4 x) { - return simd_make_float4(tgamma(x.x), tgamma(x.y), tgamma(x.z), tgamma(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_tgamma_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_tgamma(simd_float8 x) { - return _simd_tgamma_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_tgamma(simd_float8 x) { - return simd_make_float8(__tg_tgamma(x.lo), __tg_tgamma(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_tgamma_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_tgamma(simd_float16 x) { - return _simd_tgamma_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_tgamma(simd_float16 x) { - return simd_make_float16(__tg_tgamma(x.lo), __tg_tgamma(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_tgamma_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_tgamma(simd_double2 x) { - return _simd_tgamma_d2(x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_tgamma(simd_double2 x) { - return simd_make_double2(tgamma(x.x), tgamma(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_tgamma(simd_double3 x) { - return simd_make_double3(__tg_tgamma(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_tgamma_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_tgamma(simd_double4 x) { - return _simd_tgamma_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_tgamma(simd_double4 x) { - return simd_make_double4(__tg_tgamma(x.lo), __tg_tgamma(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_tgamma_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_tgamma(simd_double8 x) { - return _simd_tgamma_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_tgamma(simd_double8 x) { - return simd_make_double8(__tg_tgamma(x.lo), __tg_tgamma(x.hi)); -} -#endif - -#pragma mark - round implementation -static inline SIMD_CFUNC simd_float2 __tg_round(simd_float2 x) { - return simd_make_float2(__tg_round(simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_round(simd_float3 x) { - return simd_make_float3(__tg_round(simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_round_f4(simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_round(simd_float4 x) { -#if defined __arm64__ - return vrndaq_f32(x); -#else - return _simd_round_f4(x); -#endif -} -#else -static inline SIMD_CFUNC simd_float4 __tg_round(simd_float4 x) { - return simd_make_float4(round(x.x), round(x.y), round(x.z), round(x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_round_f8(simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_round(simd_float8 x) { - return _simd_round_f8(x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_round(simd_float8 x) { - return simd_make_float8(__tg_round(x.lo), __tg_round(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_round_f16(simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_round(simd_float16 x) { - return _simd_round_f16(x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_round(simd_float16 x) { - return simd_make_float16(__tg_round(x.lo), __tg_round(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_round_d2(simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_round(simd_double2 x) { -#if defined __arm64__ - return vrndaq_f64(x); -#else - return _simd_round_d2(x); -#endif -} -#else -static inline SIMD_CFUNC simd_double2 __tg_round(simd_double2 x) { - return simd_make_double2(round(x.x), round(x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_round(simd_double3 x) { - return simd_make_double3(__tg_round(simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_round_d4(simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_round(simd_double4 x) { - return _simd_round_d4(x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_round(simd_double4 x) { - return simd_make_double4(__tg_round(x.lo), __tg_round(x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_round_d8(simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_round(simd_double8 x) { - return _simd_round_d8(x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_round(simd_double8 x) { - return simd_make_double8(__tg_round(x.lo), __tg_round(x.hi)); -} -#endif - -#pragma mark - atan2 implementation -static inline SIMD_CFUNC simd_float2 __tg_atan2(simd_float2 y, simd_float2 x) { - return simd_make_float2(__tg_atan2(simd_make_float4(y), simd_make_float4(x))); -} - -static inline SIMD_CFUNC simd_float3 __tg_atan2(simd_float3 y, simd_float3 x) { - return simd_make_float3(__tg_atan2(simd_make_float4(y), simd_make_float4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_atan2_f4(simd_float4 y, simd_float4 x); -static inline SIMD_CFUNC simd_float4 __tg_atan2(simd_float4 y, simd_float4 x) { - return _simd_atan2_f4(y, x); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_atan2(simd_float4 y, simd_float4 x) { - return simd_make_float4(atan2(y.x, x.x), atan2(y.y, x.y), atan2(y.z, x.z), atan2(y.w, x.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_atan2_f8(simd_float8 y, simd_float8 x); -static inline SIMD_CFUNC simd_float8 __tg_atan2(simd_float8 y, simd_float8 x) { - return _simd_atan2_f8(y, x); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_atan2(simd_float8 y, simd_float8 x) { - return simd_make_float8(__tg_atan2(y.lo, x.lo), __tg_atan2(y.hi, x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_atan2_f16(simd_float16 y, simd_float16 x); -static inline SIMD_CFUNC simd_float16 __tg_atan2(simd_float16 y, simd_float16 x) { - return _simd_atan2_f16(y, x); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_atan2(simd_float16 y, simd_float16 x) { - return simd_make_float16(__tg_atan2(y.lo, x.lo), __tg_atan2(y.hi, x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_atan2_d2(simd_double2 y, simd_double2 x); -static inline SIMD_CFUNC simd_double2 __tg_atan2(simd_double2 y, simd_double2 x) { - return _simd_atan2_d2(y, x); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_atan2(simd_double2 y, simd_double2 x) { - return simd_make_double2(atan2(y.x, x.x), atan2(y.y, x.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_atan2(simd_double3 y, simd_double3 x) { - return simd_make_double3(__tg_atan2(simd_make_double4(y), simd_make_double4(x))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_atan2_d4(simd_double4 y, simd_double4 x); -static inline SIMD_CFUNC simd_double4 __tg_atan2(simd_double4 y, simd_double4 x) { - return _simd_atan2_d4(y, x); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_atan2(simd_double4 y, simd_double4 x) { - return simd_make_double4(__tg_atan2(y.lo, x.lo), __tg_atan2(y.hi, x.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_atan2_d8(simd_double8 y, simd_double8 x); -static inline SIMD_CFUNC simd_double8 __tg_atan2(simd_double8 y, simd_double8 x) { - return _simd_atan2_d8(y, x); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_atan2(simd_double8 y, simd_double8 x) { - return simd_make_double8(__tg_atan2(y.lo, x.lo), __tg_atan2(y.hi, x.hi)); -} -#endif - -#pragma mark - hypot implementation -static inline SIMD_CFUNC simd_float2 __tg_hypot(simd_float2 x, simd_float2 y) { - return simd_make_float2(__tg_hypot(simd_make_float4(x), simd_make_float4(y))); -} - -static inline SIMD_CFUNC simd_float3 __tg_hypot(simd_float3 x, simd_float3 y) { - return simd_make_float3(__tg_hypot(simd_make_float4(x), simd_make_float4(y))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_hypot_f4(simd_float4 x, simd_float4 y); -static inline SIMD_CFUNC simd_float4 __tg_hypot(simd_float4 x, simd_float4 y) { - return _simd_hypot_f4(x, y); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_hypot(simd_float4 x, simd_float4 y) { - return simd_make_float4(hypot(x.x, y.x), hypot(x.y, y.y), hypot(x.z, y.z), hypot(x.w, y.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_hypot_f8(simd_float8 x, simd_float8 y); -static inline SIMD_CFUNC simd_float8 __tg_hypot(simd_float8 x, simd_float8 y) { - return _simd_hypot_f8(x, y); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_hypot(simd_float8 x, simd_float8 y) { - return simd_make_float8(__tg_hypot(x.lo, y.lo), __tg_hypot(x.hi, y.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_hypot_f16(simd_float16 x, simd_float16 y); -static inline SIMD_CFUNC simd_float16 __tg_hypot(simd_float16 x, simd_float16 y) { - return _simd_hypot_f16(x, y); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_hypot(simd_float16 x, simd_float16 y) { - return simd_make_float16(__tg_hypot(x.lo, y.lo), __tg_hypot(x.hi, y.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_hypot_d2(simd_double2 x, simd_double2 y); -static inline SIMD_CFUNC simd_double2 __tg_hypot(simd_double2 x, simd_double2 y) { - return _simd_hypot_d2(x, y); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_hypot(simd_double2 x, simd_double2 y) { - return simd_make_double2(hypot(x.x, y.x), hypot(x.y, y.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_hypot(simd_double3 x, simd_double3 y) { - return simd_make_double3(__tg_hypot(simd_make_double4(x), simd_make_double4(y))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_hypot_d4(simd_double4 x, simd_double4 y); -static inline SIMD_CFUNC simd_double4 __tg_hypot(simd_double4 x, simd_double4 y) { - return _simd_hypot_d4(x, y); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_hypot(simd_double4 x, simd_double4 y) { - return simd_make_double4(__tg_hypot(x.lo, y.lo), __tg_hypot(x.hi, y.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_hypot_d8(simd_double8 x, simd_double8 y); -static inline SIMD_CFUNC simd_double8 __tg_hypot(simd_double8 x, simd_double8 y) { - return _simd_hypot_d8(x, y); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_hypot(simd_double8 x, simd_double8 y) { - return simd_make_double8(__tg_hypot(x.lo, y.lo), __tg_hypot(x.hi, y.hi)); -} -#endif - -#pragma mark - pow implementation -static inline SIMD_CFUNC simd_float2 __tg_pow(simd_float2 x, simd_float2 y) { - return simd_make_float2(__tg_pow(simd_make_float4(x), simd_make_float4(y))); -} - -static inline SIMD_CFUNC simd_float3 __tg_pow(simd_float3 x, simd_float3 y) { - return simd_make_float3(__tg_pow(simd_make_float4(x), simd_make_float4(y))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_pow_f4(simd_float4 x, simd_float4 y); -static inline SIMD_CFUNC simd_float4 __tg_pow(simd_float4 x, simd_float4 y) { - return _simd_pow_f4(x, y); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_pow(simd_float4 x, simd_float4 y) { - return simd_make_float4(pow(x.x, y.x), pow(x.y, y.y), pow(x.z, y.z), pow(x.w, y.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_pow_f8(simd_float8 x, simd_float8 y); -static inline SIMD_CFUNC simd_float8 __tg_pow(simd_float8 x, simd_float8 y) { - return _simd_pow_f8(x, y); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_pow(simd_float8 x, simd_float8 y) { - return simd_make_float8(__tg_pow(x.lo, y.lo), __tg_pow(x.hi, y.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_pow_f16(simd_float16 x, simd_float16 y); -static inline SIMD_CFUNC simd_float16 __tg_pow(simd_float16 x, simd_float16 y) { - return _simd_pow_f16(x, y); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_pow(simd_float16 x, simd_float16 y) { - return simd_make_float16(__tg_pow(x.lo, y.lo), __tg_pow(x.hi, y.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_pow_d2(simd_double2 x, simd_double2 y); -static inline SIMD_CFUNC simd_double2 __tg_pow(simd_double2 x, simd_double2 y) { - return _simd_pow_d2(x, y); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_pow(simd_double2 x, simd_double2 y) { - return simd_make_double2(pow(x.x, y.x), pow(x.y, y.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_pow(simd_double3 x, simd_double3 y) { - return simd_make_double3(__tg_pow(simd_make_double4(x), simd_make_double4(y))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_pow_d4(simd_double4 x, simd_double4 y); -static inline SIMD_CFUNC simd_double4 __tg_pow(simd_double4 x, simd_double4 y) { - return _simd_pow_d4(x, y); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_pow(simd_double4 x, simd_double4 y) { - return simd_make_double4(__tg_pow(x.lo, y.lo), __tg_pow(x.hi, y.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_pow_d8(simd_double8 x, simd_double8 y); -static inline SIMD_CFUNC simd_double8 __tg_pow(simd_double8 x, simd_double8 y) { - return _simd_pow_d8(x, y); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_pow(simd_double8 x, simd_double8 y) { - return simd_make_double8(__tg_pow(x.lo, y.lo), __tg_pow(x.hi, y.hi)); -} -#endif - -#pragma mark - fmod implementation -static inline SIMD_CFUNC simd_float2 __tg_fmod(simd_float2 x, simd_float2 y) { - return simd_make_float2(__tg_fmod(simd_make_float4(x), simd_make_float4(y))); -} - -static inline SIMD_CFUNC simd_float3 __tg_fmod(simd_float3 x, simd_float3 y) { - return simd_make_float3(__tg_fmod(simd_make_float4(x), simd_make_float4(y))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_fmod_f4(simd_float4 x, simd_float4 y); -static inline SIMD_CFUNC simd_float4 __tg_fmod(simd_float4 x, simd_float4 y) { - return _simd_fmod_f4(x, y); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_fmod(simd_float4 x, simd_float4 y) { - return simd_make_float4(fmod(x.x, y.x), fmod(x.y, y.y), fmod(x.z, y.z), fmod(x.w, y.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_fmod_f8(simd_float8 x, simd_float8 y); -static inline SIMD_CFUNC simd_float8 __tg_fmod(simd_float8 x, simd_float8 y) { - return _simd_fmod_f8(x, y); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_fmod(simd_float8 x, simd_float8 y) { - return simd_make_float8(__tg_fmod(x.lo, y.lo), __tg_fmod(x.hi, y.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_fmod_f16(simd_float16 x, simd_float16 y); -static inline SIMD_CFUNC simd_float16 __tg_fmod(simd_float16 x, simd_float16 y) { - return _simd_fmod_f16(x, y); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_fmod(simd_float16 x, simd_float16 y) { - return simd_make_float16(__tg_fmod(x.lo, y.lo), __tg_fmod(x.hi, y.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_fmod_d2(simd_double2 x, simd_double2 y); -static inline SIMD_CFUNC simd_double2 __tg_fmod(simd_double2 x, simd_double2 y) { - return _simd_fmod_d2(x, y); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_fmod(simd_double2 x, simd_double2 y) { - return simd_make_double2(fmod(x.x, y.x), fmod(x.y, y.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_fmod(simd_double3 x, simd_double3 y) { - return simd_make_double3(__tg_fmod(simd_make_double4(x), simd_make_double4(y))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_fmod_d4(simd_double4 x, simd_double4 y); -static inline SIMD_CFUNC simd_double4 __tg_fmod(simd_double4 x, simd_double4 y) { - return _simd_fmod_d4(x, y); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_fmod(simd_double4 x, simd_double4 y) { - return simd_make_double4(__tg_fmod(x.lo, y.lo), __tg_fmod(x.hi, y.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_fmod_d8(simd_double8 x, simd_double8 y); -static inline SIMD_CFUNC simd_double8 __tg_fmod(simd_double8 x, simd_double8 y) { - return _simd_fmod_d8(x, y); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_fmod(simd_double8 x, simd_double8 y) { - return simd_make_double8(__tg_fmod(x.lo, y.lo), __tg_fmod(x.hi, y.hi)); -} -#endif - -#pragma mark - remainder implementation -static inline SIMD_CFUNC simd_float2 __tg_remainder(simd_float2 x, simd_float2 y) { - return simd_make_float2(__tg_remainder(simd_make_float4(x), simd_make_float4(y))); -} - -static inline SIMD_CFUNC simd_float3 __tg_remainder(simd_float3 x, simd_float3 y) { - return simd_make_float3(__tg_remainder(simd_make_float4(x), simd_make_float4(y))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_remainder_f4(simd_float4 x, simd_float4 y); -static inline SIMD_CFUNC simd_float4 __tg_remainder(simd_float4 x, simd_float4 y) { - return _simd_remainder_f4(x, y); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_remainder(simd_float4 x, simd_float4 y) { - return simd_make_float4(remainder(x.x, y.x), remainder(x.y, y.y), remainder(x.z, y.z), remainder(x.w, y.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_remainder_f8(simd_float8 x, simd_float8 y); -static inline SIMD_CFUNC simd_float8 __tg_remainder(simd_float8 x, simd_float8 y) { - return _simd_remainder_f8(x, y); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_remainder(simd_float8 x, simd_float8 y) { - return simd_make_float8(__tg_remainder(x.lo, y.lo), __tg_remainder(x.hi, y.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_remainder_f16(simd_float16 x, simd_float16 y); -static inline SIMD_CFUNC simd_float16 __tg_remainder(simd_float16 x, simd_float16 y) { - return _simd_remainder_f16(x, y); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_remainder(simd_float16 x, simd_float16 y) { - return simd_make_float16(__tg_remainder(x.lo, y.lo), __tg_remainder(x.hi, y.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_remainder_d2(simd_double2 x, simd_double2 y); -static inline SIMD_CFUNC simd_double2 __tg_remainder(simd_double2 x, simd_double2 y) { - return _simd_remainder_d2(x, y); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_remainder(simd_double2 x, simd_double2 y) { - return simd_make_double2(remainder(x.x, y.x), remainder(x.y, y.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_remainder(simd_double3 x, simd_double3 y) { - return simd_make_double3(__tg_remainder(simd_make_double4(x), simd_make_double4(y))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_remainder_d4(simd_double4 x, simd_double4 y); -static inline SIMD_CFUNC simd_double4 __tg_remainder(simd_double4 x, simd_double4 y) { - return _simd_remainder_d4(x, y); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_remainder(simd_double4 x, simd_double4 y) { - return simd_make_double4(__tg_remainder(x.lo, y.lo), __tg_remainder(x.hi, y.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_remainder_d8(simd_double8 x, simd_double8 y); -static inline SIMD_CFUNC simd_double8 __tg_remainder(simd_double8 x, simd_double8 y) { - return _simd_remainder_d8(x, y); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_remainder(simd_double8 x, simd_double8 y) { - return simd_make_double8(__tg_remainder(x.lo, y.lo), __tg_remainder(x.hi, y.hi)); -} -#endif - -#pragma mark - nextafter implementation -static inline SIMD_CFUNC simd_float2 __tg_nextafter(simd_float2 x, simd_float2 y) { - return simd_make_float2(__tg_nextafter(simd_make_float4(x), simd_make_float4(y))); -} - -static inline SIMD_CFUNC simd_float3 __tg_nextafter(simd_float3 x, simd_float3 y) { - return simd_make_float3(__tg_nextafter(simd_make_float4(x), simd_make_float4(y))); -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_float4 _simd_nextafter_f4(simd_float4 x, simd_float4 y); -static inline SIMD_CFUNC simd_float4 __tg_nextafter(simd_float4 x, simd_float4 y) { - return _simd_nextafter_f4(x, y); -} -#else -static inline SIMD_CFUNC simd_float4 __tg_nextafter(simd_float4 x, simd_float4 y) { - return simd_make_float4(nextafter(x.x, y.x), nextafter(x.y, y.y), nextafter(x.z, y.z), nextafter(x.w, y.w)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_float8 _simd_nextafter_f8(simd_float8 x, simd_float8 y); -static inline SIMD_CFUNC simd_float8 __tg_nextafter(simd_float8 x, simd_float8 y) { - return _simd_nextafter_f8(x, y); -} -#else -static inline SIMD_CFUNC simd_float8 __tg_nextafter(simd_float8 x, simd_float8 y) { - return simd_make_float8(__tg_nextafter(x.lo, y.lo), __tg_nextafter(x.hi, y.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_float16 _simd_nextafter_f16(simd_float16 x, simd_float16 y); -static inline SIMD_CFUNC simd_float16 __tg_nextafter(simd_float16 x, simd_float16 y) { - return _simd_nextafter_f16(x, y); -} -#else -static inline SIMD_CFUNC simd_float16 __tg_nextafter(simd_float16 x, simd_float16 y) { - return simd_make_float16(__tg_nextafter(x.lo, y.lo), __tg_nextafter(x.hi, y.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_nextafter_d2(simd_double2 x, simd_double2 y); -static inline SIMD_CFUNC simd_double2 __tg_nextafter(simd_double2 x, simd_double2 y) { - return _simd_nextafter_d2(x, y); -} -#else -static inline SIMD_CFUNC simd_double2 __tg_nextafter(simd_double2 x, simd_double2 y) { - return simd_make_double2(nextafter(x.x, y.x), nextafter(x.y, y.y)); -} -#endif - -static inline SIMD_CFUNC simd_double3 __tg_nextafter(simd_double3 x, simd_double3 y) { - return simd_make_double3(__tg_nextafter(simd_make_double4(x), simd_make_double4(y))); -} - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX2__ -extern simd_double4 _simd_nextafter_d4(simd_double4 x, simd_double4 y); -static inline SIMD_CFUNC simd_double4 __tg_nextafter(simd_double4 x, simd_double4 y) { - return _simd_nextafter_d4(x, y); -} -#else -static inline SIMD_CFUNC simd_double4 __tg_nextafter(simd_double4 x, simd_double4 y) { - return simd_make_double4(__tg_nextafter(x.lo, y.lo), __tg_nextafter(x.hi, y.hi)); -} -#endif - -#if SIMD_LIBRARY_VERSION >= 3 && defined __AVX512F__ -extern simd_double8 _simd_nextafter_d8(simd_double8 x, simd_double8 y); -static inline SIMD_CFUNC simd_double8 __tg_nextafter(simd_double8 x, simd_double8 y) { - return _simd_nextafter_d8(x, y); -} -#else -static inline SIMD_CFUNC simd_double8 __tg_nextafter(simd_double8 x, simd_double8 y) { - return simd_make_double8(__tg_nextafter(x.lo, y.lo), __tg_nextafter(x.hi, y.hi)); -} -#endif - -static inline SIMD_CFUNC simd_float2 __tg_fdim(simd_float2 x, simd_float2 y) { return simd_bitselect(x-y, 0, x= 3 -extern simd_float4 _simd_fma_f4(simd_float4 x, simd_float4 y, simd_float4 z); -#endif -static inline SIMD_CFUNC simd_float4 __tg_fma(simd_float4 x, simd_float4 y, simd_float4 z) { -#if defined __arm64__ || defined __ARM_VFPV4__ - return vfmaq_f32(z, x, y); -#elif (defined __i386__ || defined __x86_64__) && defined __FMA__ - return _mm_fmadd_ps(x, y, z); -#elif SIMD_LIBRARY_VERSION >= 3 - return _simd_fma_f4(x, y, z); -#else - return simd_make_float4(fma(x.x, y.x, z.x), fma(x.y, y.y, z.y), fma(x.z, y.z, z.z), fma(x.w, y.w, z.w)); -#endif -} - -static inline SIMD_CFUNC simd_float8 __tg_fma(simd_float8 x, simd_float8 y, simd_float8 z) { -#if (defined __i386__ || defined __x86_64__) && defined __FMA__ - return _mm256_fmadd_ps(x, y, z); -#else - return simd_make_float8(__tg_fma(x.lo, y.lo, z.lo), __tg_fma(x.hi, y.hi, z.hi)); -#endif -} - -static inline SIMD_CFUNC simd_float16 __tg_fma(simd_float16 x, simd_float16 y, simd_float16 z) { -#if defined __AVX512F__ - return _mm512_fmadd_ps(x, y, z); -#else - return simd_make_float16(__tg_fma(x.lo, y.lo, z.lo), __tg_fma(x.hi, y.hi, z.hi)); -#endif -} - -#if SIMD_LIBRARY_VERSION >= 3 -extern simd_double2 _simd_fma_d2(simd_double2 x, simd_double2 y, simd_double2 z); -#endif -static inline SIMD_CFUNC simd_double2 __tg_fma(simd_double2 x, simd_double2 y, simd_double2 z) { -#if defined __arm64__ - return vfmaq_f64(z, x, y); -#elif (defined __i386__ || defined __x86_64__) && defined __FMA__ - return _mm_fmadd_pd(x, y, z); -#elif SIMD_LIBRARY_VERSION >= 3 - return _simd_fma_d2(x, y, z); -#else - return simd_make_double2(fma(x.x, y.x, z.x), fma(x.y, y.y, z.y)); -#endif -} - -static inline SIMD_CFUNC simd_double3 __tg_fma(simd_double3 x, simd_double3 y, simd_double3 z) { - return simd_make_double3(__tg_fma(simd_make_double4(x), simd_make_double4(y), simd_make_double4(z))); -} - -static inline SIMD_CFUNC simd_double4 __tg_fma(simd_double4 x, simd_double4 y, simd_double4 z) { -#if (defined __i386__ || defined __x86_64__) && defined __FMA__ - return _mm256_fmadd_pd(x, y, z); -#else - return simd_make_double4(__tg_fma(x.lo, y.lo, z.lo), __tg_fma(x.hi, y.hi, z.hi)); -#endif -} - -static inline SIMD_CFUNC simd_double8 __tg_fma(simd_double8 x, simd_double8 y, simd_double8 z) { -#if defined __AVX512F__ - return _mm512_fmadd_pd(x, y, z); -#else - return simd_make_double8(__tg_fma(x.lo, y.lo, z.lo), __tg_fma(x.hi, y.hi, z.hi)); -#endif -} - -static inline SIMD_CFUNC float simd_muladd(float x, float y, float z) { -#pragma STDC FP_CONTRACT ON - return x*y + z; -} -static inline SIMD_CFUNC simd_float2 simd_muladd(simd_float2 x, simd_float2 y, simd_float2 z) { -#pragma STDC FP_CONTRACT ON - return x*y + z; -} -static inline SIMD_CFUNC simd_float3 simd_muladd(simd_float3 x, simd_float3 y, simd_float3 z) { -#pragma STDC FP_CONTRACT ON - return x*y + z; -} -static inline SIMD_CFUNC simd_float4 simd_muladd(simd_float4 x, simd_float4 y, simd_float4 z) { -#pragma STDC FP_CONTRACT ON - return x*y + z; -} -static inline SIMD_CFUNC simd_float8 simd_muladd(simd_float8 x, simd_float8 y, simd_float8 z) { -#pragma STDC FP_CONTRACT ON - return x*y + z; -} -static inline SIMD_CFUNC simd_float16 simd_muladd(simd_float16 x, simd_float16 y, simd_float16 z) { -#pragma STDC FP_CONTRACT ON - return x*y + z; -} -static inline SIMD_CFUNC double simd_muladd(double x, double y, double z) { -#pragma STDC FP_CONTRACT ON - return x*y + z; -} -static inline SIMD_CFUNC simd_double2 simd_muladd(simd_double2 x, simd_double2 y, simd_double2 z) { -#pragma STDC FP_CONTRACT ON - return x*y + z; -} -static inline SIMD_CFUNC simd_double3 simd_muladd(simd_double3 x, simd_double3 y, simd_double3 z) { -#pragma STDC FP_CONTRACT ON - return x*y + z; -} -static inline SIMD_CFUNC simd_double4 simd_muladd(simd_double4 x, simd_double4 y, simd_double4 z) { -#pragma STDC FP_CONTRACT ON - return x*y + z; -} -static inline SIMD_CFUNC simd_double8 simd_muladd(simd_double8 x, simd_double8 y, simd_double8 z) { -#pragma STDC FP_CONTRACT ON - return x*y + z; -} -#ifdef __cplusplus -} /* extern "C" */ -#endif -#endif /* SIMD_COMPILER_HAS_REQUIRED_FEATURES */ -#endif /* SIMD_MATH_HEADER */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/simd/packed.h b/lib/libc/include/x86_64-macos-gnu/simd/packed.h deleted file mode 100644 index dfdc199999..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/simd/packed.h +++ /dev/null @@ -1,1031 +0,0 @@ -/*! @header - * This header defines fixed size vector types with relaxed alignment. For - * each vector type defined by that is not a 1- or 3- - * element vector, there is a corresponding type defined by this header that - * requires only the alignment matching that of the underlying scalar type. - * - * These types should be used to access buffers that may not be sufficiently - * aligned to allow them to be accessed using the "normal" simd vector types. - * As an example of this usage, suppose that you want to load a vector of - * four floats from an array of floats. The type simd_float4 has sixteen byte - * alignment, whereas an array of floats has only four byte alignment. - * Thus, naively casting a pointer into the array to (simd_float4 *) would - * invoke undefined behavior, and likely produce an alignment fault at - * runtime. Instead, use the corresponding packed type to load from the array: - * - *

- *  @textblock
- *  simd_float4 vector = *(packed_simd_float4 *)&array[i];
- *  // do something with vector ...
- *  @/textblock
- *  
- * - * It's important to note that the packed_ types are only needed to work with - * memory; once the data is loaded, we simply operate on it as usual using - * the simd_float4 type, as illustrated above. - * - * @copyright 2014-2017 Apple, Inc. All rights reserved. - * @unsorted */ - -#ifndef SIMD_PACKED_TYPES -#define SIMD_PACKED_TYPES - -# include -# if SIMD_COMPILER_HAS_REQUIRED_FEATURES -/*! @abstract A vector of two 8-bit signed (twos-complement) integers with - * relaxed alignment. - * @description In C++ and Metal, this type is also available as - * simd::packed_char2. The alignment of this type is that of the underlying - * scalar element type, so you can use it to load or store from an array of - * that type. */ -typedef __attribute__((__ext_vector_type__(2),__aligned__(1))) char simd_packed_char2; - -/*! @abstract A vector of four 8-bit signed (twos-complement) integers with - * relaxed alignment. - * @description In C++ and Metal, this type is also available as - * simd::packed_char4. The alignment of this type is that of the underlying - * scalar element type, so you can use it to load or store from an array of - * that type. */ -typedef __attribute__((__ext_vector_type__(4),__aligned__(1))) char simd_packed_char4; - -/*! @abstract A vector of eight 8-bit signed (twos-complement) integers with - * relaxed alignment. - * @description In C++ this type is also available as simd::packed_char8. - * This type is not available in Metal. The alignment of this type is only - * that of the underlying scalar element type, so you can use it to load or - * store from an array of that type. */ -typedef __attribute__((__ext_vector_type__(8),__aligned__(1))) char simd_packed_char8; - -/*! @abstract A vector of sixteen 8-bit signed (twos-complement) integers - * with relaxed alignment. - * @description In C++ this type is also available as simd::packed_char16. - * This type is not available in Metal. The alignment of this type is only - * that of the underlying scalar element type, so you can use it to load or - * store from an array of that type. */ -typedef __attribute__((__ext_vector_type__(16),__aligned__(1))) char simd_packed_char16; - -/*! @abstract A vector of thirty-two 8-bit signed (twos-complement) integers - * with relaxed alignment. - * @description In C++ this type is also available as simd::packed_char32. - * This type is not available in Metal. The alignment of this type is only - * that of the underlying scalar element type, so you can use it to load or - * store from an array of that type. */ -typedef __attribute__((__ext_vector_type__(32),__aligned__(1))) char simd_packed_char32; - -/*! @abstract A vector of sixty-four 8-bit signed (twos-complement) integers - * with relaxed alignment. - * @description In C++ this type is also available as simd::packed_char64. - * This type is not available in Metal. The alignment of this type is only - * that of the underlying scalar element type, so you can use it to load or - * store from an array of that type. */ -typedef __attribute__((__ext_vector_type__(64),__aligned__(1))) char simd_packed_char64; - -/*! @abstract A vector of two 8-bit unsigned integers with relaxed - * alignment. - * @description In C++ and Metal, this type is also available as - * simd::packed_uchar2. The alignment of this type is that of the - * underlying scalar element type, so you can use it to load or store from - * an array of that type. */ -typedef __attribute__((__ext_vector_type__(2),__aligned__(1))) unsigned char simd_packed_uchar2; - -/*! @abstract A vector of four 8-bit unsigned integers with relaxed - * alignment. - * @description In C++ and Metal, this type is also available as - * simd::packed_uchar4. The alignment of this type is that of the - * underlying scalar element type, so you can use it to load or store from - * an array of that type. */ -typedef __attribute__((__ext_vector_type__(4),__aligned__(1))) unsigned char simd_packed_uchar4; - -/*! @abstract A vector of eight 8-bit unsigned integers with relaxed - * alignment. - * @description In C++ this type is also available as simd::packed_uchar8. - * This type is not available in Metal. The alignment of this type is only - * that of the underlying scalar element type, so you can use it to load or - * store from an array of that type. */ -typedef __attribute__((__ext_vector_type__(8),__aligned__(1))) unsigned char simd_packed_uchar8; - -/*! @abstract A vector of sixteen 8-bit unsigned integers with relaxed - * alignment. - * @description In C++ this type is also available as simd::packed_uchar16. - * This type is not available in Metal. The alignment of this type is only - * that of the underlying scalar element type, so you can use it to load or - * store from an array of that type. */ -typedef __attribute__((__ext_vector_type__(16),__aligned__(1))) unsigned char simd_packed_uchar16; - -/*! @abstract A vector of thirty-two 8-bit unsigned integers with relaxed - * alignment. - * @description In C++ this type is also available as simd::packed_uchar32. - * This type is not available in Metal. The alignment of this type is only - * that of the underlying scalar element type, so you can use it to load or - * store from an array of that type. */ -typedef __attribute__((__ext_vector_type__(32),__aligned__(1))) unsigned char simd_packed_uchar32; - -/*! @abstract A vector of sixty-four 8-bit unsigned integers with relaxed - * alignment. - * @description In C++ this type is also available as simd::packed_uchar64. - * This type is not available in Metal. The alignment of this type is only - * that of the underlying scalar element type, so you can use it to load or - * store from an array of that type. */ -typedef __attribute__((__ext_vector_type__(64),__aligned__(1))) unsigned char simd_packed_uchar64; - -/*! @abstract A vector of two 16-bit signed (twos-complement) integers with - * relaxed alignment. - * @description In C++ and Metal, this type is also available as - * simd::packed_short2. The alignment of this type is that of the - * underlying scalar element type, so you can use it to load or store from - * an array of that type. */ -typedef __attribute__((__ext_vector_type__(2),__aligned__(2))) short simd_packed_short2; - -/*! @abstract A vector of four 16-bit signed (twos-complement) integers with - * relaxed alignment. - * @description In C++ and Metal, this type is also available as - * simd::packed_short4. The alignment of this type is that of the - * underlying scalar element type, so you can use it to load or store from - * an array of that type. */ -typedef __attribute__((__ext_vector_type__(4),__aligned__(2))) short simd_packed_short4; - -/*! @abstract A vector of eight 16-bit signed (twos-complement) integers - * with relaxed alignment. - * @description In C++ this type is also available as simd::packed_short8. - * This type is not available in Metal. The alignment of this type is only - * that of the underlying scalar element type, so you can use it to load or - * store from an array of that type. */ -typedef __attribute__((__ext_vector_type__(8),__aligned__(2))) short simd_packed_short8; - -/*! @abstract A vector of sixteen 16-bit signed (twos-complement) integers - * with relaxed alignment. - * @description In C++ this type is also available as simd::packed_short16. - * This type is not available in Metal. The alignment of this type is only - * that of the underlying scalar element type, so you can use it to load or - * store from an array of that type. */ -typedef __attribute__((__ext_vector_type__(16),__aligned__(2))) short simd_packed_short16; - -/*! @abstract A vector of thirty-two 16-bit signed (twos-complement) - * integers with relaxed alignment. - * @description In C++ this type is also available as simd::packed_short32. - * This type is not available in Metal. The alignment of this type is only - * that of the underlying scalar element type, so you can use it to load or - * store from an array of that type. */ -typedef __attribute__((__ext_vector_type__(32),__aligned__(2))) short simd_packed_short32; - -/*! @abstract A vector of two 16-bit unsigned integers with relaxed - * alignment. - * @description In C++ and Metal, this type is also available as - * simd::packed_ushort2. The alignment of this type is that of the - * underlying scalar element type, so you can use it to load or store from - * an array of that type. */ -typedef __attribute__((__ext_vector_type__(2),__aligned__(2))) unsigned short simd_packed_ushort2; - -/*! @abstract A vector of four 16-bit unsigned integers with relaxed - * alignment. - * @description In C++ and Metal, this type is also available as - * simd::packed_ushort4. The alignment of this type is that of the - * underlying scalar element type, so you can use it to load or store from - * an array of that type. */ -typedef __attribute__((__ext_vector_type__(4),__aligned__(2))) unsigned short simd_packed_ushort4; - -/*! @abstract A vector of eight 16-bit unsigned integers with relaxed - * alignment. - * @description In C++ this type is also available as simd::packed_ushort8. - * This type is not available in Metal. The alignment of this type is only - * that of the underlying scalar element type, so you can use it to load or - * store from an array of that type. */ -typedef __attribute__((__ext_vector_type__(8),__aligned__(2))) unsigned short simd_packed_ushort8; - -/*! @abstract A vector of sixteen 16-bit unsigned integers with relaxed - * alignment. - * @description In C++ this type is also available as - * simd::packed_ushort16. This type is not available in Metal. The - * alignment of this type is only that of the underlying scalar element - * type, so you can use it to load or store from an array of that type. */ -typedef __attribute__((__ext_vector_type__(16),__aligned__(2))) unsigned short simd_packed_ushort16; - -/*! @abstract A vector of thirty-two 16-bit unsigned integers with relaxed - * alignment. - * @description In C++ this type is also available as - * simd::packed_ushort32. This type is not available in Metal. The - * alignment of this type is only that of the underlying scalar element - * type, so you can use it to load or store from an array of that type. */ -typedef __attribute__((__ext_vector_type__(32),__aligned__(2))) unsigned short simd_packed_ushort32; - -/*! @abstract A vector of two 32-bit signed (twos-complement) integers with - * relaxed alignment. - * @description In C++ and Metal, this type is also available as - * simd::packed_int2. The alignment of this type is that of the underlying - * scalar element type, so you can use it to load or store from an array of - * that type. */ -typedef __attribute__((__ext_vector_type__(2),__aligned__(4))) int simd_packed_int2; - -/*! @abstract A vector of four 32-bit signed (twos-complement) integers with - * relaxed alignment. - * @description In C++ and Metal, this type is also available as - * simd::packed_int4. The alignment of this type is that of the underlying - * scalar element type, so you can use it to load or store from an array of - * that type. */ -typedef __attribute__((__ext_vector_type__(4),__aligned__(4))) int simd_packed_int4; - -/*! @abstract A vector of eight 32-bit signed (twos-complement) integers - * with relaxed alignment. - * @description In C++ this type is also available as simd::packed_int8. - * This type is not available in Metal. The alignment of this type is only - * that of the underlying scalar element type, so you can use it to load or - * store from an array of that type. */ -typedef __attribute__((__ext_vector_type__(8),__aligned__(4))) int simd_packed_int8; - -/*! @abstract A vector of sixteen 32-bit signed (twos-complement) integers - * with relaxed alignment. - * @description In C++ this type is also available as simd::packed_int16. - * This type is not available in Metal. The alignment of this type is only - * that of the underlying scalar element type, so you can use it to load or - * store from an array of that type. */ -typedef __attribute__((__ext_vector_type__(16),__aligned__(4))) int simd_packed_int16; - -/*! @abstract A vector of two 32-bit unsigned integers with relaxed - * alignment. - * @description In C++ and Metal, this type is also available as - * simd::packed_uint2. The alignment of this type is that of the underlying - * scalar element type, so you can use it to load or store from an array of - * that type. */ -typedef __attribute__((__ext_vector_type__(2),__aligned__(4))) unsigned int simd_packed_uint2; - -/*! @abstract A vector of four 32-bit unsigned integers with relaxed - * alignment. - * @description In C++ and Metal, this type is also available as - * simd::packed_uint4. The alignment of this type is that of the underlying - * scalar element type, so you can use it to load or store from an array of - * that type. */ -typedef __attribute__((__ext_vector_type__(4),__aligned__(4))) unsigned int simd_packed_uint4; - -/*! @abstract A vector of eight 32-bit unsigned integers with relaxed - * alignment. - * @description In C++ this type is also available as simd::packed_uint8. - * This type is not available in Metal. The alignment of this type is only - * that of the underlying scalar element type, so you can use it to load or - * store from an array of that type. */ -typedef __attribute__((__ext_vector_type__(8),__aligned__(4))) unsigned int simd_packed_uint8; - -/*! @abstract A vector of sixteen 32-bit unsigned integers with relaxed - * alignment. - * @description In C++ this type is also available as simd::packed_uint16. - * This type is not available in Metal. The alignment of this type is only - * that of the underlying scalar element type, so you can use it to load or - * store from an array of that type. */ -typedef __attribute__((__ext_vector_type__(16),__aligned__(4))) unsigned int simd_packed_uint16; - -/*! @abstract A vector of two 32-bit floating-point numbers with relaxed - * alignment. - * @description In C++ and Metal, this type is also available as - * simd::packed_float2. The alignment of this type is that of the - * underlying scalar element type, so you can use it to load or store from - * an array of that type. */ -typedef __attribute__((__ext_vector_type__(2),__aligned__(4))) float simd_packed_float2; - -/*! @abstract A vector of four 32-bit floating-point numbers with relaxed - * alignment. - * @description In C++ and Metal, this type is also available as - * simd::packed_float4. The alignment of this type is that of the - * underlying scalar element type, so you can use it to load or store from - * an array of that type. */ -typedef __attribute__((__ext_vector_type__(4),__aligned__(4))) float simd_packed_float4; - -/*! @abstract A vector of eight 32-bit floating-point numbers with relaxed - * alignment. - * @description In C++ this type is also available as simd::packed_float8. - * This type is not available in Metal. The alignment of this type is only - * that of the underlying scalar element type, so you can use it to load or - * store from an array of that type. */ -typedef __attribute__((__ext_vector_type__(8),__aligned__(4))) float simd_packed_float8; - -/*! @abstract A vector of sixteen 32-bit floating-point numbers with relaxed - * alignment. - * @description In C++ this type is also available as simd::packed_float16. - * This type is not available in Metal. The alignment of this type is only - * that of the underlying scalar element type, so you can use it to load or - * store from an array of that type. */ -typedef __attribute__((__ext_vector_type__(16),__aligned__(4))) float simd_packed_float16; - -/*! @abstract A vector of two 64-bit signed (twos-complement) integers with - * relaxed alignment. - * @description In C++ and Metal, this type is also available as - * simd::packed_long2. The alignment of this type is that of the underlying - * scalar element type, so you can use it to load or store from an array of - * that type. */ -#if defined __LP64__ -typedef __attribute__((__ext_vector_type__(2),__aligned__(8))) simd_long1 simd_packed_long2; -#else -typedef __attribute__((__ext_vector_type__(2),__aligned__(4))) simd_long1 simd_packed_long2; -#endif - -/*! @abstract A vector of four 64-bit signed (twos-complement) integers with - * relaxed alignment. - * @description In C++ and Metal, this type is also available as - * simd::packed_long4. The alignment of this type is that of the underlying - * scalar element type, so you can use it to load or store from an array of - * that type. */ -#if defined __LP64__ -typedef __attribute__((__ext_vector_type__(4),__aligned__(8))) simd_long1 simd_packed_long4; -#else -typedef __attribute__((__ext_vector_type__(4),__aligned__(4))) simd_long1 simd_packed_long4; -#endif - -/*! @abstract A vector of eight 64-bit signed (twos-complement) integers - * with relaxed alignment. - * @description In C++ this type is also available as simd::packed_long8. - * This type is not available in Metal. The alignment of this type is only - * that of the underlying scalar element type, so you can use it to load or - * store from an array of that type. */ -#if defined __LP64__ -typedef __attribute__((__ext_vector_type__(8),__aligned__(8))) simd_long1 simd_packed_long8; -#else -typedef __attribute__((__ext_vector_type__(8),__aligned__(4))) simd_long1 simd_packed_long8; -#endif - -/*! @abstract A vector of two 64-bit unsigned integers with relaxed - * alignment. - * @description In C++ and Metal, this type is also available as - * simd::packed_ulong2. The alignment of this type is that of the - * underlying scalar element type, so you can use it to load or store from - * an array of that type. */ -#if defined __LP64__ -typedef __attribute__((__ext_vector_type__(2),__aligned__(8))) simd_ulong1 simd_packed_ulong2; -#else -typedef __attribute__((__ext_vector_type__(2),__aligned__(4))) simd_ulong1 simd_packed_ulong2; -#endif - -/*! @abstract A vector of four 64-bit unsigned integers with relaxed - * alignment. - * @description In C++ and Metal, this type is also available as - * simd::packed_ulong4. The alignment of this type is that of the - * underlying scalar element type, so you can use it to load or store from - * an array of that type. */ -#if defined __LP64__ -typedef __attribute__((__ext_vector_type__(4),__aligned__(8))) simd_ulong1 simd_packed_ulong4; -#else -typedef __attribute__((__ext_vector_type__(4),__aligned__(4))) simd_ulong1 simd_packed_ulong4; -#endif - -/*! @abstract A vector of eight 64-bit unsigned integers with relaxed - * alignment. - * @description In C++ this type is also available as simd::packed_ulong8. - * This type is not available in Metal. The alignment of this type is only - * that of the underlying scalar element type, so you can use it to load or - * store from an array of that type. */ -#if defined __LP64__ -typedef __attribute__((__ext_vector_type__(8),__aligned__(8))) simd_ulong1 simd_packed_ulong8; -#else -typedef __attribute__((__ext_vector_type__(8),__aligned__(4))) simd_ulong1 simd_packed_ulong8; -#endif - -/*! @abstract A vector of two 64-bit floating-point numbers with relaxed - * alignment. - * @description In C++ and Metal, this type is also available as - * simd::packed_double2. The alignment of this type is that of the - * underlying scalar element type, so you can use it to load or store from - * an array of that type. */ -#if defined __LP64__ -typedef __attribute__((__ext_vector_type__(2),__aligned__(8))) double simd_packed_double2; -#else -typedef __attribute__((__ext_vector_type__(2),__aligned__(4))) double simd_packed_double2; -#endif - -/*! @abstract A vector of four 64-bit floating-point numbers with relaxed - * alignment. - * @description In C++ and Metal, this type is also available as - * simd::packed_double4. The alignment of this type is that of the - * underlying scalar element type, so you can use it to load or store from - * an array of that type. */ -#if defined __LP64__ -typedef __attribute__((__ext_vector_type__(4),__aligned__(8))) double simd_packed_double4; -#else -typedef __attribute__((__ext_vector_type__(4),__aligned__(4))) double simd_packed_double4; -#endif - -/*! @abstract A vector of eight 64-bit floating-point numbers with relaxed - * alignment. - * @description In C++ this type is also available as simd::packed_double8. - * This type is not available in Metal. The alignment of this type is only - * that of the underlying scalar element type, so you can use it to load or - * store from an array of that type. */ -#if defined __LP64__ -typedef __attribute__((__ext_vector_type__(8),__aligned__(8))) double simd_packed_double8; -#else -typedef __attribute__((__ext_vector_type__(8),__aligned__(4))) double simd_packed_double8; -#endif - -/* MARK: C++ vector types */ -#if defined __cplusplus -namespace simd { - namespace packed { - /*! @abstract A vector of two 8-bit signed (twos-complement) integers - * with relaxed alignment. - * @description In C or Objective-C, this type is available as - * simd_packed_char2. The alignment of this type is only that of the - * underlying scalar element type, so you can use it to load or store - * from an array of that type. */ -typedef ::simd_packed_char2 char2; - - /*! @abstract A vector of four 8-bit signed (twos-complement) integers - * with relaxed alignment. - * @description In C or Objective-C, this type is available as - * simd_packed_char4. The alignment of this type is only that of the - * underlying scalar element type, so you can use it to load or store - * from an array of that type. */ -typedef ::simd_packed_char4 char4; - - /*! @abstract A vector of eight 8-bit signed (twos-complement) integers - * with relaxed alignment. - * @description This type is not available in Metal. In C or - * Objective-C, this type is available as simd_packed_char8. The - * alignment of this type is only that of the underlying scalar element - * type, so you can use it to load or store from an array of that type. */ -typedef ::simd_packed_char8 char8; - - /*! @abstract A vector of sixteen 8-bit signed (twos-complement) - * integers with relaxed alignment. - * @description This type is not available in Metal. In C or - * Objective-C, this type is available as simd_packed_char16. The - * alignment of this type is only that of the underlying scalar element - * type, so you can use it to load or store from an array of that type. */ -typedef ::simd_packed_char16 char16; - - /*! @abstract A vector of thirty-two 8-bit signed (twos-complement) - * integers with relaxed alignment. - * @description This type is not available in Metal. In C or - * Objective-C, this type is available as simd_packed_char32. The - * alignment of this type is only that of the underlying scalar element - * type, so you can use it to load or store from an array of that type. */ -typedef ::simd_packed_char32 char32; - - /*! @abstract A vector of sixty-four 8-bit signed (twos-complement) - * integers with relaxed alignment. - * @description This type is not available in Metal. In C or - * Objective-C, this type is available as simd_packed_char64. The - * alignment of this type is only that of the underlying scalar element - * type, so you can use it to load or store from an array of that type. */ -typedef ::simd_packed_char64 char64; - - /*! @abstract A vector of two 8-bit unsigned integers with relaxed - * alignment. - * @description In C or Objective-C, this type is available as - * simd_packed_uchar2. The alignment of this type is only that of the - * underlying scalar element type, so you can use it to load or store - * from an array of that type. */ -typedef ::simd_packed_uchar2 uchar2; - - /*! @abstract A vector of four 8-bit unsigned integers with relaxed - * alignment. - * @description In C or Objective-C, this type is available as - * simd_packed_uchar4. The alignment of this type is only that of the - * underlying scalar element type, so you can use it to load or store - * from an array of that type. */ -typedef ::simd_packed_uchar4 uchar4; - - /*! @abstract A vector of eight 8-bit unsigned integers with relaxed - * alignment. - * @description This type is not available in Metal. In C or - * Objective-C, this type is available as simd_packed_uchar8. The - * alignment of this type is only that of the underlying scalar element - * type, so you can use it to load or store from an array of that type. */ -typedef ::simd_packed_uchar8 uchar8; - - /*! @abstract A vector of sixteen 8-bit unsigned integers with relaxed - * alignment. - * @description This type is not available in Metal. In C or - * Objective-C, this type is available as simd_packed_uchar16. The - * alignment of this type is only that of the underlying scalar element - * type, so you can use it to load or store from an array of that type. */ -typedef ::simd_packed_uchar16 uchar16; - - /*! @abstract A vector of thirty-two 8-bit unsigned integers with - * relaxed alignment. - * @description This type is not available in Metal. In C or - * Objective-C, this type is available as simd_packed_uchar32. The - * alignment of this type is only that of the underlying scalar element - * type, so you can use it to load or store from an array of that type. */ -typedef ::simd_packed_uchar32 uchar32; - - /*! @abstract A vector of sixty-four 8-bit unsigned integers with - * relaxed alignment. - * @description This type is not available in Metal. In C or - * Objective-C, this type is available as simd_packed_uchar64. The - * alignment of this type is only that of the underlying scalar element - * type, so you can use it to load or store from an array of that type. */ -typedef ::simd_packed_uchar64 uchar64; - - /*! @abstract A vector of two 16-bit signed (twos-complement) integers - * with relaxed alignment. - * @description In C or Objective-C, this type is available as - * simd_packed_short2. The alignment of this type is only that of the - * underlying scalar element type, so you can use it to load or store - * from an array of that type. */ -typedef ::simd_packed_short2 short2; - - /*! @abstract A vector of four 16-bit signed (twos-complement) integers - * with relaxed alignment. - * @description In C or Objective-C, this type is available as - * simd_packed_short4. The alignment of this type is only that of the - * underlying scalar element type, so you can use it to load or store - * from an array of that type. */ -typedef ::simd_packed_short4 short4; - - /*! @abstract A vector of eight 16-bit signed (twos-complement) integers - * with relaxed alignment. - * @description This type is not available in Metal. In C or - * Objective-C, this type is available as simd_packed_short8. The - * alignment of this type is only that of the underlying scalar element - * type, so you can use it to load or store from an array of that type. */ -typedef ::simd_packed_short8 short8; - - /*! @abstract A vector of sixteen 16-bit signed (twos-complement) - * integers with relaxed alignment. - * @description This type is not available in Metal. In C or - * Objective-C, this type is available as simd_packed_short16. The - * alignment of this type is only that of the underlying scalar element - * type, so you can use it to load or store from an array of that type. */ -typedef ::simd_packed_short16 short16; - - /*! @abstract A vector of thirty-two 16-bit signed (twos-complement) - * integers with relaxed alignment. - * @description This type is not available in Metal. In C or - * Objective-C, this type is available as simd_packed_short32. The - * alignment of this type is only that of the underlying scalar element - * type, so you can use it to load or store from an array of that type. */ -typedef ::simd_packed_short32 short32; - - /*! @abstract A vector of two 16-bit unsigned integers with relaxed - * alignment. - * @description In C or Objective-C, this type is available as - * simd_packed_ushort2. The alignment of this type is only that of the - * underlying scalar element type, so you can use it to load or store - * from an array of that type. */ -typedef ::simd_packed_ushort2 ushort2; - - /*! @abstract A vector of four 16-bit unsigned integers with relaxed - * alignment. - * @description In C or Objective-C, this type is available as - * simd_packed_ushort4. The alignment of this type is only that of the - * underlying scalar element type, so you can use it to load or store - * from an array of that type. */ -typedef ::simd_packed_ushort4 ushort4; - - /*! @abstract A vector of eight 16-bit unsigned integers with relaxed - * alignment. - * @description This type is not available in Metal. In C or - * Objective-C, this type is available as simd_packed_ushort8. The - * alignment of this type is only that of the underlying scalar element - * type, so you can use it to load or store from an array of that type. */ -typedef ::simd_packed_ushort8 ushort8; - - /*! @abstract A vector of sixteen 16-bit unsigned integers with relaxed - * alignment. - * @description This type is not available in Metal. In C or - * Objective-C, this type is available as simd_packed_ushort16. The - * alignment of this type is only that of the underlying scalar element - * type, so you can use it to load or store from an array of that type. */ -typedef ::simd_packed_ushort16 ushort16; - - /*! @abstract A vector of thirty-two 16-bit unsigned integers with - * relaxed alignment. - * @description This type is not available in Metal. In C or - * Objective-C, this type is available as simd_packed_ushort32. The - * alignment of this type is only that of the underlying scalar element - * type, so you can use it to load or store from an array of that type. */ -typedef ::simd_packed_ushort32 ushort32; - - /*! @abstract A vector of two 32-bit signed (twos-complement) integers - * with relaxed alignment. - * @description In C or Objective-C, this type is available as - * simd_packed_int2. The alignment of this type is only that of the - * underlying scalar element type, so you can use it to load or store - * from an array of that type. */ -typedef ::simd_packed_int2 int2; - - /*! @abstract A vector of four 32-bit signed (twos-complement) integers - * with relaxed alignment. - * @description In C or Objective-C, this type is available as - * simd_packed_int4. The alignment of this type is only that of the - * underlying scalar element type, so you can use it to load or store - * from an array of that type. */ -typedef ::simd_packed_int4 int4; - - /*! @abstract A vector of eight 32-bit signed (twos-complement) integers - * with relaxed alignment. - * @description This type is not available in Metal. In C or - * Objective-C, this type is available as simd_packed_int8. The - * alignment of this type is only that of the underlying scalar element - * type, so you can use it to load or store from an array of that type. */ -typedef ::simd_packed_int8 int8; - - /*! @abstract A vector of sixteen 32-bit signed (twos-complement) - * integers with relaxed alignment. - * @description This type is not available in Metal. In C or - * Objective-C, this type is available as simd_packed_int16. The - * alignment of this type is only that of the underlying scalar element - * type, so you can use it to load or store from an array of that type. */ -typedef ::simd_packed_int16 int16; - - /*! @abstract A vector of two 32-bit unsigned integers with relaxed - * alignment. - * @description In C or Objective-C, this type is available as - * simd_packed_uint2. The alignment of this type is only that of the - * underlying scalar element type, so you can use it to load or store - * from an array of that type. */ -typedef ::simd_packed_uint2 uint2; - - /*! @abstract A vector of four 32-bit unsigned integers with relaxed - * alignment. - * @description In C or Objective-C, this type is available as - * simd_packed_uint4. The alignment of this type is only that of the - * underlying scalar element type, so you can use it to load or store - * from an array of that type. */ -typedef ::simd_packed_uint4 uint4; - - /*! @abstract A vector of eight 32-bit unsigned integers with relaxed - * alignment. - * @description This type is not available in Metal. In C or - * Objective-C, this type is available as simd_packed_uint8. The - * alignment of this type is only that of the underlying scalar element - * type, so you can use it to load or store from an array of that type. */ -typedef ::simd_packed_uint8 uint8; - - /*! @abstract A vector of sixteen 32-bit unsigned integers with relaxed - * alignment. - * @description This type is not available in Metal. In C or - * Objective-C, this type is available as simd_packed_uint16. The - * alignment of this type is only that of the underlying scalar element - * type, so you can use it to load or store from an array of that type. */ -typedef ::simd_packed_uint16 uint16; - - /*! @abstract A vector of two 32-bit floating-point numbers with relaxed - * alignment. - * @description In C or Objective-C, this type is available as - * simd_packed_float2. The alignment of this type is only that of the - * underlying scalar element type, so you can use it to load or store - * from an array of that type. */ -typedef ::simd_packed_float2 float2; - - /*! @abstract A vector of four 32-bit floating-point numbers with - * relaxed alignment. - * @description In C or Objective-C, this type is available as - * simd_packed_float4. The alignment of this type is only that of the - * underlying scalar element type, so you can use it to load or store - * from an array of that type. */ -typedef ::simd_packed_float4 float4; - - /*! @abstract A vector of eight 32-bit floating-point numbers with - * relaxed alignment. - * @description This type is not available in Metal. In C or - * Objective-C, this type is available as simd_packed_float8. The - * alignment of this type is only that of the underlying scalar element - * type, so you can use it to load or store from an array of that type. */ -typedef ::simd_packed_float8 float8; - - /*! @abstract A vector of sixteen 32-bit floating-point numbers with - * relaxed alignment. - * @description This type is not available in Metal. In C or - * Objective-C, this type is available as simd_packed_float16. The - * alignment of this type is only that of the underlying scalar element - * type, so you can use it to load or store from an array of that type. */ -typedef ::simd_packed_float16 float16; - - /*! @abstract A vector of two 64-bit signed (twos-complement) integers - * with relaxed alignment. - * @description In C or Objective-C, this type is available as - * simd_packed_long2. The alignment of this type is only that of the - * underlying scalar element type, so you can use it to load or store - * from an array of that type. */ -typedef ::simd_packed_long2 long2; - - /*! @abstract A vector of four 64-bit signed (twos-complement) integers - * with relaxed alignment. - * @description In C or Objective-C, this type is available as - * simd_packed_long4. The alignment of this type is only that of the - * underlying scalar element type, so you can use it to load or store - * from an array of that type. */ -typedef ::simd_packed_long4 long4; - - /*! @abstract A vector of eight 64-bit signed (twos-complement) integers - * with relaxed alignment. - * @description This type is not available in Metal. In C or - * Objective-C, this type is available as simd_packed_long8. The - * alignment of this type is only that of the underlying scalar element - * type, so you can use it to load or store from an array of that type. */ -typedef ::simd_packed_long8 long8; - - /*! @abstract A vector of two 64-bit unsigned integers with relaxed - * alignment. - * @description In C or Objective-C, this type is available as - * simd_packed_ulong2. The alignment of this type is only that of the - * underlying scalar element type, so you can use it to load or store - * from an array of that type. */ -typedef ::simd_packed_ulong2 ulong2; - - /*! @abstract A vector of four 64-bit unsigned integers with relaxed - * alignment. - * @description In C or Objective-C, this type is available as - * simd_packed_ulong4. The alignment of this type is only that of the - * underlying scalar element type, so you can use it to load or store - * from an array of that type. */ -typedef ::simd_packed_ulong4 ulong4; - - /*! @abstract A vector of eight 64-bit unsigned integers with relaxed - * alignment. - * @description This type is not available in Metal. In C or - * Objective-C, this type is available as simd_packed_ulong8. The - * alignment of this type is only that of the underlying scalar element - * type, so you can use it to load or store from an array of that type. */ -typedef ::simd_packed_ulong8 ulong8; - - /*! @abstract A vector of two 64-bit floating-point numbers with relaxed - * alignment. - * @description In C or Objective-C, this type is available as - * simd_packed_double2. The alignment of this type is only that of the - * underlying scalar element type, so you can use it to load or store - * from an array of that type. */ -typedef ::simd_packed_double2 double2; - - /*! @abstract A vector of four 64-bit floating-point numbers with - * relaxed alignment. - * @description In C or Objective-C, this type is available as - * simd_packed_double4. The alignment of this type is only that of the - * underlying scalar element type, so you can use it to load or store - * from an array of that type. */ -typedef ::simd_packed_double4 double4; - - /*! @abstract A vector of eight 64-bit floating-point numbers with - * relaxed alignment. - * @description This type is not available in Metal. In C or - * Objective-C, this type is available as simd_packed_double8. The - * alignment of this type is only that of the underlying scalar element - * type, so you can use it to load or store from an array of that type. */ -typedef ::simd_packed_double8 double8; - - } /* namespace simd::packed:: */ -} /* namespace simd:: */ -#endif /* __cplusplus */ - -/* MARK: Deprecated vector types */ -/*! @group Deprecated vector types - * @discussion These are the original types used by earlier versions of the - * simd library; they are provided here for compatability with existing source - * files. Use the new ("simd_"-prefixed) types for future development. */ -/*! @abstract A vector of two 8-bit signed (twos-complement) integers with - * relaxed alignment. - * @description This type is deprecated; you should use simd_packed_char2 - * or simd::packed_char2 instead. */ -typedef simd_packed_char2 packed_char2; - -/*! @abstract A vector of four 8-bit signed (twos-complement) integers with - * relaxed alignment. - * @description This type is deprecated; you should use simd_packed_char4 - * or simd::packed_char4 instead. */ -typedef simd_packed_char4 packed_char4; - -/*! @abstract A vector of eight 8-bit signed (twos-complement) integers with - * relaxed alignment. - * @description This type is deprecated; you should use simd_packed_char8 - * or simd::packed_char8 instead. */ -typedef simd_packed_char8 packed_char8; - -/*! @abstract A vector of sixteen 8-bit signed (twos-complement) integers - * with relaxed alignment. - * @description This type is deprecated; you should use simd_packed_char16 - * or simd::packed_char16 instead. */ -typedef simd_packed_char16 packed_char16; - -/*! @abstract A vector of thirty-two 8-bit signed (twos-complement) integers - * with relaxed alignment. - * @description This type is deprecated; you should use simd_packed_char32 - * or simd::packed_char32 instead. */ -typedef simd_packed_char32 packed_char32; - -/*! @abstract A vector of sixty-four 8-bit signed (twos-complement) integers - * with relaxed alignment. - * @description This type is deprecated; you should use simd_packed_char64 - * or simd::packed_char64 instead. */ -typedef simd_packed_char64 packed_char64; - -/*! @abstract A vector of two 8-bit unsigned integers with relaxed - * alignment. - * @description This type is deprecated; you should use simd_packed_uchar2 - * or simd::packed_uchar2 instead. */ -typedef simd_packed_uchar2 packed_uchar2; - -/*! @abstract A vector of four 8-bit unsigned integers with relaxed - * alignment. - * @description This type is deprecated; you should use simd_packed_uchar4 - * or simd::packed_uchar4 instead. */ -typedef simd_packed_uchar4 packed_uchar4; - -/*! @abstract A vector of eight 8-bit unsigned integers with relaxed - * alignment. - * @description This type is deprecated; you should use simd_packed_uchar8 - * or simd::packed_uchar8 instead. */ -typedef simd_packed_uchar8 packed_uchar8; - -/*! @abstract A vector of sixteen 8-bit unsigned integers with relaxed - * alignment. - * @description This type is deprecated; you should use simd_packed_uchar16 - * or simd::packed_uchar16 instead. */ -typedef simd_packed_uchar16 packed_uchar16; - -/*! @abstract A vector of thirty-two 8-bit unsigned integers with relaxed - * alignment. - * @description This type is deprecated; you should use simd_packed_uchar32 - * or simd::packed_uchar32 instead. */ -typedef simd_packed_uchar32 packed_uchar32; - -/*! @abstract A vector of sixty-four 8-bit unsigned integers with relaxed - * alignment. - * @description This type is deprecated; you should use simd_packed_uchar64 - * or simd::packed_uchar64 instead. */ -typedef simd_packed_uchar64 packed_uchar64; - -/*! @abstract A vector of two 16-bit signed (twos-complement) integers with - * relaxed alignment. - * @description This type is deprecated; you should use simd_packed_short2 - * or simd::packed_short2 instead. */ -typedef simd_packed_short2 packed_short2; - -/*! @abstract A vector of four 16-bit signed (twos-complement) integers with - * relaxed alignment. - * @description This type is deprecated; you should use simd_packed_short4 - * or simd::packed_short4 instead. */ -typedef simd_packed_short4 packed_short4; - -/*! @abstract A vector of eight 16-bit signed (twos-complement) integers - * with relaxed alignment. - * @description This type is deprecated; you should use simd_packed_short8 - * or simd::packed_short8 instead. */ -typedef simd_packed_short8 packed_short8; - -/*! @abstract A vector of sixteen 16-bit signed (twos-complement) integers - * with relaxed alignment. - * @description This type is deprecated; you should use simd_packed_short16 - * or simd::packed_short16 instead. */ -typedef simd_packed_short16 packed_short16; - -/*! @abstract A vector of thirty-two 16-bit signed (twos-complement) - * integers with relaxed alignment. - * @description This type is deprecated; you should use simd_packed_short32 - * or simd::packed_short32 instead. */ -typedef simd_packed_short32 packed_short32; - -/*! @abstract A vector of two 16-bit unsigned integers with relaxed - * alignment. - * @description This type is deprecated; you should use simd_packed_ushort2 - * or simd::packed_ushort2 instead. */ -typedef simd_packed_ushort2 packed_ushort2; - -/*! @abstract A vector of four 16-bit unsigned integers with relaxed - * alignment. - * @description This type is deprecated; you should use simd_packed_ushort4 - * or simd::packed_ushort4 instead. */ -typedef simd_packed_ushort4 packed_ushort4; - -/*! @abstract A vector of eight 16-bit unsigned integers with relaxed - * alignment. - * @description This type is deprecated; you should use simd_packed_ushort8 - * or simd::packed_ushort8 instead. */ -typedef simd_packed_ushort8 packed_ushort8; - -/*! @abstract A vector of sixteen 16-bit unsigned integers with relaxed - * alignment. - * @description This type is deprecated; you should use - * simd_packed_ushort16 or simd::packed_ushort16 instead. */ -typedef simd_packed_ushort16 packed_ushort16; - -/*! @abstract A vector of thirty-two 16-bit unsigned integers with relaxed - * alignment. - * @description This type is deprecated; you should use - * simd_packed_ushort32 or simd::packed_ushort32 instead. */ -typedef simd_packed_ushort32 packed_ushort32; - -/*! @abstract A vector of two 32-bit signed (twos-complement) integers with - * relaxed alignment. - * @description This type is deprecated; you should use simd_packed_int2 or - * simd::packed_int2 instead. */ -typedef simd_packed_int2 packed_int2; - -/*! @abstract A vector of four 32-bit signed (twos-complement) integers with - * relaxed alignment. - * @description This type is deprecated; you should use simd_packed_int4 or - * simd::packed_int4 instead. */ -typedef simd_packed_int4 packed_int4; - -/*! @abstract A vector of eight 32-bit signed (twos-complement) integers - * with relaxed alignment. - * @description This type is deprecated; you should use simd_packed_int8 or - * simd::packed_int8 instead. */ -typedef simd_packed_int8 packed_int8; - -/*! @abstract A vector of sixteen 32-bit signed (twos-complement) integers - * with relaxed alignment. - * @description This type is deprecated; you should use simd_packed_int16 - * or simd::packed_int16 instead. */ -typedef simd_packed_int16 packed_int16; - -/*! @abstract A vector of two 32-bit unsigned integers with relaxed - * alignment. - * @description This type is deprecated; you should use simd_packed_uint2 - * or simd::packed_uint2 instead. */ -typedef simd_packed_uint2 packed_uint2; - -/*! @abstract A vector of four 32-bit unsigned integers with relaxed - * alignment. - * @description This type is deprecated; you should use simd_packed_uint4 - * or simd::packed_uint4 instead. */ -typedef simd_packed_uint4 packed_uint4; - -/*! @abstract A vector of eight 32-bit unsigned integers with relaxed - * alignment. - * @description This type is deprecated; you should use simd_packed_uint8 - * or simd::packed_uint8 instead. */ -typedef simd_packed_uint8 packed_uint8; - -/*! @abstract A vector of sixteen 32-bit unsigned integers with relaxed - * alignment. - * @description This type is deprecated; you should use simd_packed_uint16 - * or simd::packed_uint16 instead. */ -typedef simd_packed_uint16 packed_uint16; - -/*! @abstract A vector of two 32-bit floating-point numbers with relaxed - * alignment. - * @description This type is deprecated; you should use simd_packed_float2 - * or simd::packed_float2 instead. */ -typedef simd_packed_float2 packed_float2; - -/*! @abstract A vector of four 32-bit floating-point numbers with relaxed - * alignment. - * @description This type is deprecated; you should use simd_packed_float4 - * or simd::packed_float4 instead. */ -typedef simd_packed_float4 packed_float4; - -/*! @abstract A vector of eight 32-bit floating-point numbers with relaxed - * alignment. - * @description This type is deprecated; you should use simd_packed_float8 - * or simd::packed_float8 instead. */ -typedef simd_packed_float8 packed_float8; - -/*! @abstract A vector of sixteen 32-bit floating-point numbers with relaxed - * alignment. - * @description This type is deprecated; you should use simd_packed_float16 - * or simd::packed_float16 instead. */ -typedef simd_packed_float16 packed_float16; - -/*! @abstract A vector of two 64-bit signed (twos-complement) integers with - * relaxed alignment. - * @description This type is deprecated; you should use simd_packed_long2 - * or simd::packed_long2 instead. */ -typedef simd_packed_long2 packed_long2; - -/*! @abstract A vector of four 64-bit signed (twos-complement) integers with - * relaxed alignment. - * @description This type is deprecated; you should use simd_packed_long4 - * or simd::packed_long4 instead. */ -typedef simd_packed_long4 packed_long4; - -/*! @abstract A vector of eight 64-bit signed (twos-complement) integers - * with relaxed alignment. - * @description This type is deprecated; you should use simd_packed_long8 - * or simd::packed_long8 instead. */ -typedef simd_packed_long8 packed_long8; - -/*! @abstract A vector of two 64-bit unsigned integers with relaxed - * alignment. - * @description This type is deprecated; you should use simd_packed_ulong2 - * or simd::packed_ulong2 instead. */ -typedef simd_packed_ulong2 packed_ulong2; - -/*! @abstract A vector of four 64-bit unsigned integers with relaxed - * alignment. - * @description This type is deprecated; you should use simd_packed_ulong4 - * or simd::packed_ulong4 instead. */ -typedef simd_packed_ulong4 packed_ulong4; - -/*! @abstract A vector of eight 64-bit unsigned integers with relaxed - * alignment. - * @description This type is deprecated; you should use simd_packed_ulong8 - * or simd::packed_ulong8 instead. */ -typedef simd_packed_ulong8 packed_ulong8; - -/*! @abstract A vector of two 64-bit floating-point numbers with relaxed - * alignment. - * @description This type is deprecated; you should use simd_packed_double2 - * or simd::packed_double2 instead. */ -typedef simd_packed_double2 packed_double2; - -/*! @abstract A vector of four 64-bit floating-point numbers with relaxed - * alignment. - * @description This type is deprecated; you should use simd_packed_double4 - * or simd::packed_double4 instead. */ -typedef simd_packed_double4 packed_double4; - -/*! @abstract A vector of eight 64-bit floating-point numbers with relaxed - * alignment. - * @description This type is deprecated; you should use simd_packed_double8 - * or simd::packed_double8 instead. */ -typedef simd_packed_double8 packed_double8; - -# endif /* SIMD_COMPILER_HAS_REQUIRED_FEATURES */ -#endif \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/simd/quaternion.h b/lib/libc/include/x86_64-macos-gnu/simd/quaternion.h deleted file mode 100644 index 32158d7e8d..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/simd/quaternion.h +++ /dev/null @@ -1,1192 +0,0 @@ -/*! @header - * This header defines functions for constructing and using quaternions. - * @copyright 2015-2016 Apple, Inc. All rights reserved. - * @unsorted */ - -#ifndef SIMD_QUATERNIONS -#define SIMD_QUATERNIONS - -#include -#if SIMD_COMPILER_HAS_REQUIRED_FEATURES -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* MARK: - C and Objective-C float interfaces */ - -/*! @abstract Constructs a quaternion from four scalar values. - * - * @param ix The first component of the imaginary (vector) part. - * @param iy The second component of the imaginary (vector) part. - * @param iz The third component of the imaginary (vector) part. - * - * @param r The real (scalar) part. */ -static inline SIMD_CFUNC simd_quatf simd_quaternion(float ix, float iy, float iz, float r) { - return (simd_quatf){ { ix, iy, iz, r } }; -} - -/*! @abstract Constructs a quaternion from an array of four scalars. - * - * @discussion Note that the imaginary part of the quaternion comes from - * array elements 0, 1, and 2, and the real part comes from element 3. */ -static inline SIMD_NONCONST simd_quatf simd_quaternion(const float xyzr[4]) { - return (simd_quatf){ *(const simd_packed_float4 *)xyzr }; -} - -/*! @abstract Constructs a quaternion from a four-element vector. - * - * @discussion Note that the imaginary (vector) part of the quaternion comes - * from lanes 0, 1, and 2 of the vector, and the real (scalar) part comes from - * lane 3. */ -static inline SIMD_CFUNC simd_quatf simd_quaternion(simd_float4 xyzr) { - return (simd_quatf){ xyzr }; -} - -/*! @abstract Constructs a quaternion that rotates by `angle` radians about - * `axis`. */ -static inline SIMD_CFUNC simd_quatf simd_quaternion(float angle, simd_float3 axis); - -/*! @abstract Construct a quaternion that rotates from one vector to another. - * - * @param from A normalized three-element vector. - * @param to A normalized three-element vector. - * - * @discussion The rotation axis is `simd_cross(from, to)`. If `from` and - * `to` point in opposite directions (to within machine precision), an - * arbitrary rotation axis is chosen, and the angle is pi radians. */ -static SIMD_NOINLINE simd_quatf simd_quaternion(simd_float3 from, simd_float3 to); - -/*! @abstract Construct a quaternion from a 3x3 rotation `matrix`. - * - * @discussion If `matrix` is not orthogonal with determinant 1, the result - * is undefined. */ -static SIMD_NOINLINE simd_quatf simd_quaternion(simd_float3x3 matrix); - -/*! @abstract Construct a quaternion from a 4x4 rotation `matrix`. - * - * @discussion The last row and column of the matrix are ignored. This - * function is equivalent to calling simd_quaternion with the upper-left 3x3 - * submatrix . */ -static SIMD_NOINLINE simd_quatf simd_quaternion(simd_float4x4 matrix); - -/*! @abstract The real (scalar) part of the quaternion `q`. */ -static inline SIMD_CFUNC float simd_real(simd_quatf q) { - return q.vector.w; -} - -/*! @abstract The imaginary (vector) part of the quaternion `q`. */ -static inline SIMD_CFUNC simd_float3 simd_imag(simd_quatf q) { - return q.vector.xyz; -} - -/*! @abstract The angle (in radians) of rotation represented by `q`. */ -static inline SIMD_CFUNC float simd_angle(simd_quatf q); - -/*! @abstract The normalized axis (a 3-element vector) around which the - * action of the quaternion `q` rotates. */ -static inline SIMD_CFUNC simd_float3 simd_axis(simd_quatf q); - -/*! @abstract The sum of the quaternions `p` and `q`. */ -static inline SIMD_CFUNC simd_quatf simd_add(simd_quatf p, simd_quatf q); - -/*! @abstract The difference of the quaternions `p` and `q`. */ -static inline SIMD_CFUNC simd_quatf simd_sub(simd_quatf p, simd_quatf q); - -/*! @abstract The product of the quaternions `p` and `q`. */ -static inline SIMD_CFUNC simd_quatf simd_mul(simd_quatf p, simd_quatf q); - -/*! @abstract The quaternion `q` scaled by the real value `a`. */ -static inline SIMD_CFUNC simd_quatf simd_mul(simd_quatf q, float a); - -/*! @abstract The quaternion `q` scaled by the real value `a`. */ -static inline SIMD_CFUNC simd_quatf simd_mul(float a, simd_quatf q); - -/*! @abstract The conjugate of the quaternion `q`. */ -static inline SIMD_CFUNC simd_quatf simd_conjugate(simd_quatf q); - -/*! @abstract The (multiplicative) inverse of the quaternion `q`. */ -static inline SIMD_CFUNC simd_quatf simd_inverse(simd_quatf q); - -/*! @abstract The negation (additive inverse) of the quaternion `q`. */ -static inline SIMD_CFUNC simd_quatf simd_negate(simd_quatf q); - -/*! @abstract The dot product of the quaternions `p` and `q` interpreted as - * four-dimensional vectors. */ -static inline SIMD_CFUNC float simd_dot(simd_quatf p, simd_quatf q); - -/*! @abstract The length of the quaternion `q`. */ -static inline SIMD_CFUNC float simd_length(simd_quatf q); - -/*! @abstract The unit quaternion obtained by normalizing `q`. */ -static inline SIMD_CFUNC simd_quatf simd_normalize(simd_quatf q); - -/*! @abstract Rotates the vector `v` by the quaternion `q`. */ -static inline SIMD_CFUNC simd_float3 simd_act(simd_quatf q, simd_float3 v); - -/*! @abstract Logarithm of the quaternion `q`. - * @discussion Do not call this function directly; use `log(q)` instead. - * - * We can write a quaternion `q` in the form: `r(cos(t) + sin(t)v)` where - * `r` is the length of `q`, `t` is an angle, and `v` is a unit 3-vector. - * The logarithm of `q` is `log(r) + tv`, just like the logarithm of the - * complex number `r*(cos(t) + i sin(t))` is `log(r) + it`. - * - * Note that this function is not robust against poorly-scaled non-unit - * quaternions, because it is primarily used for spline interpolation of - * unit quaternions. If you need to compute a robust logarithm of general - * quaternions, you can use the following approach: - * - * scale = simd_reduce_max(simd_abs(q.vector)); - * logq = log(simd_recip(scale)*q); - * logq.real += log(scale); - * return logq; */ -static SIMD_NOINLINE simd_quatf __tg_log(simd_quatf q); - -/*! @abstract Inverse of `log( )`; the exponential map on quaternions. - * @discussion Do not call this function directly; use `exp(q)` instead. */ -static SIMD_NOINLINE simd_quatf __tg_exp(simd_quatf q); - -/*! @abstract Spherical linear interpolation along the shortest arc between - * quaternions `q0` and `q1`. */ -static SIMD_NOINLINE simd_quatf simd_slerp(simd_quatf q0, simd_quatf q1, float t); - -/*! @abstract Spherical linear interpolation along the longest arc between - * quaternions `q0` and `q1`. */ -static SIMD_NOINLINE simd_quatf simd_slerp_longest(simd_quatf q0, simd_quatf q1, float t); - -/*! @abstract Interpolate between quaternions along a spherical cubic spline. - * - * @discussion The function interpolates between q1 and q2. q0 is the left - * endpoint of the previous interval, and q3 is the right endpoint of the next - * interval. Use this function to smoothly interpolate between a sequence of - * rotations. */ -static SIMD_NOINLINE simd_quatf simd_spline(simd_quatf q0, simd_quatf q1, simd_quatf q2, simd_quatf q3, float t); - -/*! @abstract Spherical cubic Bezier interpolation between quaternions. - * - * @discussion The function treats q0 ... q3 as control points and uses slerp - * in place of lerp in the De Castlejeau algorithm. The endpoints of - * interpolation are thus q0 and q3, and the curve will not generally pass - * through q1 or q2. Note that the convex hull property of "standard" Bezier - * curve does not hold on the sphere. */ -static SIMD_NOINLINE simd_quatf simd_bezier(simd_quatf q0, simd_quatf q1, simd_quatf q2, simd_quatf q3, float t); - -#ifdef __cplusplus -} /* extern "C" */ -/* MARK: - C++ float interfaces */ - -namespace simd { - struct quatf : ::simd_quatf { - /*! @abstract The identity quaternion. */ - quatf( ) : ::simd_quatf(::simd_quaternion((float4){0,0,0,1})) { } - - /*! @abstract Constructs a C++ quaternion from a C quaternion. */ - quatf(::simd_quatf q) : ::simd_quatf(q) { } - - /*! @abstract Constructs a quaternion from components. */ - quatf(float ix, float iy, float iz, float r) : ::simd_quatf(::simd_quaternion(ix, iy, iz, r)) { } - - /*! @abstract Constructs a quaternion from an array of scalars. */ - quatf(const float xyzr[4]) : ::simd_quatf(::simd_quaternion(xyzr)) { } - - /*! @abstract Constructs a quaternion from a vector. */ - quatf(float4 xyzr) : ::simd_quatf(::simd_quaternion(xyzr)) { } - - /*! @abstract Quaternion representing rotation about `axis` by `angle` - * radians. */ - quatf(float angle, float3 axis) : ::simd_quatf(::simd_quaternion(angle, axis)) { } - - /*! @abstract Quaternion that rotates `from` into `to`. */ - quatf(float3 from, float3 to) : ::simd_quatf(::simd_quaternion(from, to)) { } - - /*! @abstract Constructs a quaternion from a rotation matrix. */ - quatf(::simd_float3x3 matrix) : ::simd_quatf(::simd_quaternion(matrix)) { } - - /*! @abstract Constructs a quaternion from a rotation matrix. */ - quatf(::simd_float4x4 matrix) : ::simd_quatf(::simd_quaternion(matrix)) { } - - /*! @abstract The real (scalar) part of the quaternion. */ - float real(void) const { return ::simd_real(*this); } - - /*! @abstract The imaginary (vector) part of the quaternion. */ - float3 imag(void) const { return ::simd_imag(*this); } - - /*! @abstract The angle the quaternion rotates by. */ - float angle(void) const { return ::simd_angle(*this); } - - /*! @abstract The axis the quaternion rotates about. */ - float3 axis(void) const { return ::simd_axis(*this); } - - /*! @abstract The length of the quaternion. */ - float length(void) const { return ::simd_length(*this); } - - /*! @abstract Act on the vector `v` by rotation. */ - float3 operator()(const ::simd_float3 v) const { return ::simd_act(*this, v); } - }; - - static SIMD_CPPFUNC quatf operator+(const ::simd_quatf p, const ::simd_quatf q) { return ::simd_add(p, q); } - static SIMD_CPPFUNC quatf operator-(const ::simd_quatf p, const ::simd_quatf q) { return ::simd_sub(p, q); } - static SIMD_CPPFUNC quatf operator-(const ::simd_quatf p) { return ::simd_negate(p); } - static SIMD_CPPFUNC quatf operator*(const float r, const ::simd_quatf p) { return ::simd_mul(r, p); } - static SIMD_CPPFUNC quatf operator*(const ::simd_quatf p, const float r) { return ::simd_mul(p, r); } - static SIMD_CPPFUNC quatf operator*(const ::simd_quatf p, const ::simd_quatf q) { return ::simd_mul(p, q); } - static SIMD_CPPFUNC quatf operator/(const ::simd_quatf p, const ::simd_quatf q) { return ::simd_mul(p, ::simd_inverse(q)); } - static SIMD_CPPFUNC quatf operator+=(quatf &p, const ::simd_quatf q) { return p = p+q; } - static SIMD_CPPFUNC quatf operator-=(quatf &p, const ::simd_quatf q) { return p = p-q; } - static SIMD_CPPFUNC quatf operator*=(quatf &p, const float r) { return p = p*r; } - static SIMD_CPPFUNC quatf operator*=(quatf &p, const ::simd_quatf q) { return p = p*q; } - static SIMD_CPPFUNC quatf operator/=(quatf &p, const ::simd_quatf q) { return p = p/q; } - - /*! @abstract The conjugate of the quaternion `q`. */ - static SIMD_CPPFUNC quatf conjugate(const ::simd_quatf p) { return ::simd_conjugate(p); } - - /*! @abstract The (multiplicative) inverse of the quaternion `q`. */ - static SIMD_CPPFUNC quatf inverse(const ::simd_quatf p) { return ::simd_inverse(p); } - - /*! @abstract The dot product of the quaternions `p` and `q` interpreted as - * four-dimensional vectors. */ - static SIMD_CPPFUNC float dot(const ::simd_quatf p, const ::simd_quatf q) { return ::simd_dot(p, q); } - - /*! @abstract The unit quaternion obtained by normalizing `q`. */ - static SIMD_CPPFUNC quatf normalize(const ::simd_quatf p) { return ::simd_normalize(p); } - - /*! @abstract logarithm of the quaternion `q`. */ - static SIMD_CPPFUNC quatf log(const ::simd_quatf q) { return ::__tg_log(q); } - - /*! @abstract exponential map of quaterion `q`. */ - static SIMD_CPPFUNC quatf exp(const ::simd_quatf q) { return ::__tg_exp(q); } - - /*! @abstract Spherical linear interpolation along the shortest arc between - * quaternions `q0` and `q1`. */ - static SIMD_CPPFUNC quatf slerp(const ::simd_quatf p0, const ::simd_quatf p1, float t) { return ::simd_slerp(p0, p1, t); } - - /*! @abstract Spherical linear interpolation along the longest arc between - * quaternions `q0` and `q1`. */ - static SIMD_CPPFUNC quatf slerp_longest(const ::simd_quatf p0, const ::simd_quatf p1, float t) { return ::simd_slerp_longest(p0, p1, t); } - - /*! @abstract Interpolate between quaternions along a spherical cubic spline. - * - * @discussion The function interpolates between q1 and q2. q0 is the left - * endpoint of the previous interval, and q3 is the right endpoint of the next - * interval. Use this function to smoothly interpolate between a sequence of - * rotations. */ - static SIMD_CPPFUNC quatf spline(const ::simd_quatf p0, const ::simd_quatf p1, const ::simd_quatf p2, const ::simd_quatf p3, float t) { return ::simd_spline(p0, p1, p2, p3, t); } - - /*! @abstract Spherical cubic Bezier interpolation between quaternions. - * - * @discussion The function treats q0 ... q3 as control points and uses slerp - * in place of lerp in the De Castlejeau algorithm. The endpoints of - * interpolation are thus q0 and q3, and the curve will not generally pass - * through q1 or q2. Note that the convex hull property of "standard" Bezier - * curve does not hold on the sphere. */ - static SIMD_CPPFUNC quatf bezier(const ::simd_quatf p0, const ::simd_quatf p1, const ::simd_quatf p2, const ::simd_quatf p3, float t) { return ::simd_bezier(p0, p1, p2, p3, t); } -} - -extern "C" { -#endif /* __cplusplus */ - -/* MARK: - float implementations */ - -#include -#include - -/* tg_promote is implementation gobbledygook that enables the compile-time - * dispatching in tgmath.h to work its magic. */ -static simd_quatf __attribute__((__overloadable__)) __tg_promote(simd_quatf); - -/*! @abstract Constructs a quaternion from imaginary and real parts. - * @discussion This function is hidden behind an underscore to avoid confusion - * with the angle-axis constructor. */ -static inline SIMD_CFUNC simd_quatf _simd_quaternion(simd_float3 imag, float real) { - return simd_quaternion(simd_make_float4(imag, real)); -} - -static inline SIMD_CFUNC simd_quatf simd_quaternion(float angle, simd_float3 axis) { - return _simd_quaternion(sin(angle/2) * axis, cos(angle/2)); -} - -static inline SIMD_CFUNC float simd_angle(simd_quatf q) { - return 2*atan2(simd_length(q.vector.xyz), q.vector.w); -} - -static inline SIMD_CFUNC simd_float3 simd_axis(simd_quatf q) { - return simd_normalize(q.vector.xyz); -} - -static inline SIMD_CFUNC simd_quatf simd_add(simd_quatf p, simd_quatf q) { - return simd_quaternion(p.vector + q.vector); -} - -static inline SIMD_CFUNC simd_quatf simd_sub(simd_quatf p, simd_quatf q) { - return simd_quaternion(p.vector - q.vector); -} - -static inline SIMD_CFUNC simd_quatf simd_mul(simd_quatf p, simd_quatf q) { - #pragma STDC FP_CONTRACT ON - return simd_quaternion((p.vector.x * __builtin_shufflevector(q.vector, -q.vector, 3,6,1,4) + - p.vector.y * __builtin_shufflevector(q.vector, -q.vector, 2,3,4,5)) + - (p.vector.z * __builtin_shufflevector(q.vector, -q.vector, 5,0,3,6) + - p.vector.w * q.vector)); -} - -static inline SIMD_CFUNC simd_quatf simd_mul(simd_quatf q, float a) { - return simd_quaternion(a * q.vector); -} - -static inline SIMD_CFUNC simd_quatf simd_mul(float a, simd_quatf q) { - return simd_mul(q,a); -} - -static inline SIMD_CFUNC simd_quatf simd_conjugate(simd_quatf q) { - return simd_quaternion(q.vector * (simd_float4){-1,-1,-1, 1}); -} - -static inline SIMD_CFUNC simd_quatf simd_inverse(simd_quatf q) { - return simd_quaternion(simd_conjugate(q).vector * simd_recip(simd_length_squared(q.vector))); -} - -static inline SIMD_CFUNC simd_quatf simd_negate(simd_quatf q) { - return simd_quaternion(-q.vector); -} - -static inline SIMD_CFUNC float simd_dot(simd_quatf p, simd_quatf q) { - return simd_dot(p.vector, q.vector); -} - -static inline SIMD_CFUNC float simd_length(simd_quatf q) { - return simd_length(q.vector); -} - -static inline SIMD_CFUNC simd_quatf simd_normalize(simd_quatf q) { - float length_squared = simd_length_squared(q.vector); - if (length_squared == 0) { - return simd_quaternion((simd_float4){0,0,0,1}); - } - return simd_quaternion(q.vector * simd_rsqrt(length_squared)); -} - -#if defined __arm__ || defined __arm64__ -/*! @abstract Multiplies the vector `v` by the quaternion `q`. - * - * @discussion This IS NOT the action of `q` on `v` (i.e. this is not rotation - * by `q`. That operation is provided by `simd_act(q, v)`. This function is an - * implementation detail and you should not call it directly. It may be - * removed or modified in future versions of the simd module. */ -static inline SIMD_CFUNC simd_quatf _simd_mul_vq(simd_float3 v, simd_quatf q) { - #pragma STDC FP_CONTRACT ON - return simd_quaternion(v.x * __builtin_shufflevector(q.vector, -q.vector, 3,6,1,4) + - v.y * __builtin_shufflevector(q.vector, -q.vector, 2,3,4,5) + - v.z * __builtin_shufflevector(q.vector, -q.vector, 5,0,3,6)); -} -#endif - -static inline SIMD_CFUNC simd_float3 simd_act(simd_quatf q, simd_float3 v) { -#if defined __arm__ || defined __arm64__ - return simd_mul(q, _simd_mul_vq(v, simd_conjugate(q))).vector.xyz; -#else - #pragma STDC FP_CONTRACT ON - simd_float3 t = 2*simd_cross(simd_imag(q),v); - return v + simd_real(q)*t + simd_cross(simd_imag(q), t); -#endif -} - -static SIMD_NOINLINE simd_quatf __tg_log(simd_quatf q) { - float real = __tg_log(simd_length_squared(q.vector))/2; - if (simd_equal(simd_imag(q), 0)) return _simd_quaternion(0, real); - simd_float3 imag = __tg_acos(simd_real(q)/simd_length(q)) * simd_normalize(simd_imag(q)); - return _simd_quaternion(imag, real); -} - -static SIMD_NOINLINE simd_quatf __tg_exp(simd_quatf q) { - // angle is actually *twice* the angle of the rotation corresponding to - // the resulting quaternion, which is why we don't simply use the (angle, - // axis) constructor to generate `unit`. - float angle = simd_length(simd_imag(q)); - if (angle == 0) return _simd_quaternion(0, exp(simd_real(q))); - simd_float3 axis = simd_normalize(simd_imag(q)); - simd_quatf unit = _simd_quaternion(sin(angle)*axis, cosf(angle)); - return simd_mul(exp(simd_real(q)), unit); -} - -/*! @abstract Implementation detail of the `simd_quaternion(from, to)` - * initializer. - * - * @discussion Computes the quaternion rotation `from` to `to` if they are - * separated by less than 90 degrees. Not numerically stable for larger - * angles. This function is an implementation detail and you should not - * call it directly. It may be removed or modified in future versions of the - * simd module. */ -static inline SIMD_CFUNC simd_quatf _simd_quaternion_reduced(simd_float3 from, simd_float3 to) { - simd_float3 half = simd_normalize(from + to); - return _simd_quaternion(simd_cross(from, half), simd_dot(from, half)); -} - -static SIMD_NOINLINE simd_quatf simd_quaternion(simd_float3 from, simd_float3 to) { - - // If the angle between from and to is not too big, we can compute the - // rotation accurately using a simple implementation. - if (simd_dot(from, to) >= 0) { - return _simd_quaternion_reduced(from, to); - } - - // Because from and to are more than 90 degrees apart, we compute the - // rotation in two stages (from -> half), (half -> to) to preserve numerical - // accuracy. - simd_float3 half = simd_normalize(from + to); - - if (simd_length_squared(half) == 0) { - // half is nearly zero, so from and to point in nearly opposite directions - // and the rotation is numerically underspecified. Pick an axis orthogonal - // to the vectors, and use an angle of pi radians. - simd_float3 abs_from = simd_abs(from); - if (abs_from.x <= abs_from.y && abs_from.x <= abs_from.z) - return _simd_quaternion(simd_normalize(simd_cross(from, (simd_float3){1,0,0})), 0.f); - else if (abs_from.y <= abs_from.z) - return _simd_quaternion(simd_normalize(simd_cross(from, (simd_float3){0,1,0})), 0.f); - else - return _simd_quaternion(simd_normalize(simd_cross(from, (simd_float3){0,0,1})), 0.f); - } - - // Compute the two-step rotation. */ - return simd_mul(_simd_quaternion_reduced(from, half), - _simd_quaternion_reduced(half, to)); -} - -static SIMD_NOINLINE simd_quatf simd_quaternion(simd_float3x3 matrix) { - const simd_float3 *mat = matrix.columns; - float trace = mat[0][0] + mat[1][1] + mat[2][2]; - if (trace >= 0.0) { - float r = 2*sqrt(1 + trace); - float rinv = simd_recip(r); - return simd_quaternion(rinv*(mat[1][2] - mat[2][1]), - rinv*(mat[2][0] - mat[0][2]), - rinv*(mat[0][1] - mat[1][0]), - r/4); - } else if (mat[0][0] >= mat[1][1] && mat[0][0] >= mat[2][2]) { - float r = 2*sqrt(1 - mat[1][1] - mat[2][2] + mat[0][0]); - float rinv = simd_recip(r); - return simd_quaternion(r/4, - rinv*(mat[0][1] + mat[1][0]), - rinv*(mat[0][2] + mat[2][0]), - rinv*(mat[1][2] - mat[2][1])); - } else if (mat[1][1] >= mat[2][2]) { - float r = 2*sqrt(1 - mat[0][0] - mat[2][2] + mat[1][1]); - float rinv = simd_recip(r); - return simd_quaternion(rinv*(mat[0][1] + mat[1][0]), - r/4, - rinv*(mat[1][2] + mat[2][1]), - rinv*(mat[2][0] - mat[0][2])); - } else { - float r = 2*sqrt(1 - mat[0][0] - mat[1][1] + mat[2][2]); - float rinv = simd_recip(r); - return simd_quaternion(rinv*(mat[0][2] + mat[2][0]), - rinv*(mat[1][2] + mat[2][1]), - r/4, - rinv*(mat[0][1] - mat[1][0])); - } -} - -static SIMD_NOINLINE simd_quatf simd_quaternion(simd_float4x4 matrix) { - const simd_float4 *mat = matrix.columns; - float trace = mat[0][0] + mat[1][1] + mat[2][2]; - if (trace >= 0.0) { - float r = 2*sqrt(1 + trace); - float rinv = simd_recip(r); - return simd_quaternion(rinv*(mat[1][2] - mat[2][1]), - rinv*(mat[2][0] - mat[0][2]), - rinv*(mat[0][1] - mat[1][0]), - r/4); - } else if (mat[0][0] >= mat[1][1] && mat[0][0] >= mat[2][2]) { - float r = 2*sqrt(1 - mat[1][1] - mat[2][2] + mat[0][0]); - float rinv = simd_recip(r); - return simd_quaternion(r/4, - rinv*(mat[0][1] + mat[1][0]), - rinv*(mat[0][2] + mat[2][0]), - rinv*(mat[1][2] - mat[2][1])); - } else if (mat[1][1] >= mat[2][2]) { - float r = 2*sqrt(1 - mat[0][0] - mat[2][2] + mat[1][1]); - float rinv = simd_recip(r); - return simd_quaternion(rinv*(mat[0][1] + mat[1][0]), - r/4, - rinv*(mat[1][2] + mat[2][1]), - rinv*(mat[2][0] - mat[0][2])); - } else { - float r = 2*sqrt(1 - mat[0][0] - mat[1][1] + mat[2][2]); - float rinv = simd_recip(r); - return simd_quaternion(rinv*(mat[0][2] + mat[2][0]), - rinv*(mat[1][2] + mat[2][1]), - r/4, - rinv*(mat[0][1] - mat[1][0])); - } -} - -/*! @abstract The angle between p and q interpreted as 4-dimensional vectors. - * - * @discussion This function is an implementation detail and you should not - * call it directly. It may be removed or modified in future versions of the - * simd module. */ -static SIMD_NOINLINE float _simd_angle(simd_quatf p, simd_quatf q) { - return 2*atan2(simd_length(p.vector - q.vector), simd_length(p.vector + q.vector)); -} - -/*! @abstract sin(x)/x. - * - * @discussion This function is an implementation detail and you should not - * call it directly. It may be removed or modified in future versions of the - * simd module. */ -static SIMD_CFUNC float _simd_sinc(float x) { - if (x == 0) return 1; - return sin(x)/x; -} - -/*! @abstract Spherical lerp between q0 and q1. - * - * @discussion This function may interpolate along either the longer or - * shorter path between q0 and q1; it is used as an implementation detail - * in `simd_slerp` and `simd_slerp_longest`; you should use those functions - * instead of calling this directly. */ -static SIMD_NOINLINE simd_quatf _simd_slerp_internal(simd_quatf q0, simd_quatf q1, float t) { - float s = 1 - t; - float a = _simd_angle(q0, q1); - float r = simd_recip(_simd_sinc(a)); - return simd_normalize(simd_quaternion(_simd_sinc(s*a)*r*s*q0.vector + _simd_sinc(t*a)*r*t*q1.vector)); -} - -static SIMD_NOINLINE simd_quatf simd_slerp(simd_quatf q0, simd_quatf q1, float t) { - if (simd_dot(q0, q1) >= 0) - return _simd_slerp_internal(q0, q1, t); - return _simd_slerp_internal(q0, simd_negate(q1), t); -} - -static SIMD_NOINLINE simd_quatf simd_slerp_longest(simd_quatf q0, simd_quatf q1, float t) { - if (simd_dot(q0, q1) >= 0) - return _simd_slerp_internal(q0, simd_negate(q1), t); - return _simd_slerp_internal(q0, q1, t); -} - -/*! @discussion This function is an implementation detail and you should not - * call it directly. It may be removed or modified in future versions of the - * simd module. */ -static SIMD_NOINLINE simd_quatf _simd_intermediate(simd_quatf q0, simd_quatf q1, simd_quatf q2) { - simd_quatf p0 = __tg_log(simd_mul(q0, simd_inverse(q1))); - simd_quatf p2 = __tg_log(simd_mul(q2, simd_inverse(q1))); - return simd_normalize(simd_mul(q1, __tg_exp(simd_mul(-0.25, simd_add(p0,p2))))); -} - -/*! @discussion This function is an implementation detail and you should not - * call it directly. It may be removed or modified in future versions of the - * simd module. */ -static SIMD_NOINLINE simd_quatf _simd_squad(simd_quatf q0, simd_quatf qa, simd_quatf qb, simd_quatf q1, float t) { - simd_quatf r0 = _simd_slerp_internal(q0, q1, t); - simd_quatf r1 = _simd_slerp_internal(qa, qb, t); - return _simd_slerp_internal(r0, r1, 2*t*(1 - t)); -} - -static SIMD_NOINLINE simd_quatf simd_spline(simd_quatf q0, simd_quatf q1, simd_quatf q2, simd_quatf q3, float t) { - simd_quatf qa = _simd_intermediate(q0, q1, q2); - simd_quatf qb = _simd_intermediate(q1, q2, q3); - return _simd_squad(q1, qa, qb, q2, t); -} - -static SIMD_NOINLINE simd_quatf simd_bezier(simd_quatf q0, simd_quatf q1, simd_quatf q2, simd_quatf q3, float t) { - simd_quatf q01 = _simd_slerp_internal(q0, q1, t); - simd_quatf q12 = _simd_slerp_internal(q1, q2, t); - simd_quatf q23 = _simd_slerp_internal(q2, q3, t); - simd_quatf q012 = _simd_slerp_internal(q01, q12, t); - simd_quatf q123 = _simd_slerp_internal(q12, q23, t); - return _simd_slerp_internal(q012, q123, t); -} - -/* MARK: - C and Objective-C double interfaces */ - -/*! @abstract Constructs a quaternion from four scalar values. - * - * @param ix The first component of the imaginary (vector) part. - * @param iy The second component of the imaginary (vector) part. - * @param iz The third component of the imaginary (vector) part. - * - * @param r The real (scalar) part. */ -static inline SIMD_CFUNC simd_quatd simd_quaternion(double ix, double iy, double iz, double r) { - return (simd_quatd){ { ix, iy, iz, r } }; -} - -/*! @abstract Constructs a quaternion from an array of four scalars. - * - * @discussion Note that the imaginary part of the quaternion comes from - * array elements 0, 1, and 2, and the real part comes from element 3. */ -static inline SIMD_NONCONST simd_quatd simd_quaternion(const double xyzr[4]) { - return (simd_quatd){ *(const simd_packed_double4 *)xyzr }; -} - -/*! @abstract Constructs a quaternion from a four-element vector. - * - * @discussion Note that the imaginary (vector) part of the quaternion comes - * from lanes 0, 1, and 2 of the vector, and the real (scalar) part comes from - * lane 3. */ -static inline SIMD_CFUNC simd_quatd simd_quaternion(simd_double4 xyzr) { - return (simd_quatd){ xyzr }; -} - -/*! @abstract Constructs a quaternion that rotates by `angle` radians about - * `axis`. */ -static inline SIMD_CFUNC simd_quatd simd_quaternion(double angle, simd_double3 axis); - -/*! @abstract Construct a quaternion that rotates from one vector to another. - * - * @param from A normalized three-element vector. - * @param to A normalized three-element vector. - * - * @discussion The rotation axis is `simd_cross(from, to)`. If `from` and - * `to` point in opposite directions (to within machine precision), an - * arbitrary rotation axis is chosen, and the angle is pi radians. */ -static SIMD_NOINLINE simd_quatd simd_quaternion(simd_double3 from, simd_double3 to); - -/*! @abstract Construct a quaternion from a 3x3 rotation `matrix`. - * - * @discussion If `matrix` is not orthogonal with determinant 1, the result - * is undefined. */ -static SIMD_NOINLINE simd_quatd simd_quaternion(simd_double3x3 matrix); - -/*! @abstract Construct a quaternion from a 4x4 rotation `matrix`. - * - * @discussion The last row and column of the matrix are ignored. This - * function is equivalent to calling simd_quaternion with the upper-left 3x3 - * submatrix . */ -static SIMD_NOINLINE simd_quatd simd_quaternion(simd_double4x4 matrix); - -/*! @abstract The real (scalar) part of the quaternion `q`. */ -static inline SIMD_CFUNC double simd_real(simd_quatd q) { - return q.vector.w; -} - -/*! @abstract The imaginary (vector) part of the quaternion `q`. */ -static inline SIMD_CFUNC simd_double3 simd_imag(simd_quatd q) { - return q.vector.xyz; -} - -/*! @abstract The angle (in radians) of rotation represented by `q`. */ -static inline SIMD_CFUNC double simd_angle(simd_quatd q); - -/*! @abstract The normalized axis (a 3-element vector) around which the - * action of the quaternion `q` rotates. */ -static inline SIMD_CFUNC simd_double3 simd_axis(simd_quatd q); - -/*! @abstract The sum of the quaternions `p` and `q`. */ -static inline SIMD_CFUNC simd_quatd simd_add(simd_quatd p, simd_quatd q); - -/*! @abstract The difference of the quaternions `p` and `q`. */ -static inline SIMD_CFUNC simd_quatd simd_sub(simd_quatd p, simd_quatd q); - -/*! @abstract The product of the quaternions `p` and `q`. */ -static inline SIMD_CFUNC simd_quatd simd_mul(simd_quatd p, simd_quatd q); - -/*! @abstract The quaternion `q` scaled by the real value `a`. */ -static inline SIMD_CFUNC simd_quatd simd_mul(simd_quatd q, double a); - -/*! @abstract The quaternion `q` scaled by the real value `a`. */ -static inline SIMD_CFUNC simd_quatd simd_mul(double a, simd_quatd q); - -/*! @abstract The conjugate of the quaternion `q`. */ -static inline SIMD_CFUNC simd_quatd simd_conjugate(simd_quatd q); - -/*! @abstract The (multiplicative) inverse of the quaternion `q`. */ -static inline SIMD_CFUNC simd_quatd simd_inverse(simd_quatd q); - -/*! @abstract The negation (additive inverse) of the quaternion `q`. */ -static inline SIMD_CFUNC simd_quatd simd_negate(simd_quatd q); - -/*! @abstract The dot product of the quaternions `p` and `q` interpreted as - * four-dimensional vectors. */ -static inline SIMD_CFUNC double simd_dot(simd_quatd p, simd_quatd q); - -/*! @abstract The length of the quaternion `q`. */ -static inline SIMD_CFUNC double simd_length(simd_quatd q); - -/*! @abstract The unit quaternion obtained by normalizing `q`. */ -static inline SIMD_CFUNC simd_quatd simd_normalize(simd_quatd q); - -/*! @abstract Rotates the vector `v` by the quaternion `q`. */ -static inline SIMD_CFUNC simd_double3 simd_act(simd_quatd q, simd_double3 v); - -/*! @abstract Logarithm of the quaternion `q`. - * @discussion Do not call this function directly; use `log(q)` instead. - * - * We can write a quaternion `q` in the form: `r(cos(t) + sin(t)v)` where - * `r` is the length of `q`, `t` is an angle, and `v` is a unit 3-vector. - * The logarithm of `q` is `log(r) + tv`, just like the logarithm of the - * complex number `r*(cos(t) + i sin(t))` is `log(r) + it`. - * - * Note that this function is not robust against poorly-scaled non-unit - * quaternions, because it is primarily used for spline interpolation of - * unit quaternions. If you need to compute a robust logarithm of general - * quaternions, you can use the following approach: - * - * scale = simd_reduce_max(simd_abs(q.vector)); - * logq = log(simd_recip(scale)*q); - * logq.real += log(scale); - * return logq; */ -static SIMD_NOINLINE simd_quatd __tg_log(simd_quatd q); - -/*! @abstract Inverse of `log( )`; the exponential map on quaternions. - * @discussion Do not call this function directly; use `exp(q)` instead. */ -static SIMD_NOINLINE simd_quatd __tg_exp(simd_quatd q); - -/*! @abstract Spherical linear interpolation along the shortest arc between - * quaternions `q0` and `q1`. */ -static SIMD_NOINLINE simd_quatd simd_slerp(simd_quatd q0, simd_quatd q1, double t); - -/*! @abstract Spherical linear interpolation along the longest arc between - * quaternions `q0` and `q1`. */ -static SIMD_NOINLINE simd_quatd simd_slerp_longest(simd_quatd q0, simd_quatd q1, double t); - -/*! @abstract Interpolate between quaternions along a spherical cubic spline. - * - * @discussion The function interpolates between q1 and q2. q0 is the left - * endpoint of the previous interval, and q3 is the right endpoint of the next - * interval. Use this function to smoothly interpolate between a sequence of - * rotations. */ -static SIMD_NOINLINE simd_quatd simd_spline(simd_quatd q0, simd_quatd q1, simd_quatd q2, simd_quatd q3, double t); - -/*! @abstract Spherical cubic Bezier interpolation between quaternions. - * - * @discussion The function treats q0 ... q3 as control points and uses slerp - * in place of lerp in the De Castlejeau algorithm. The endpoints of - * interpolation are thus q0 and q3, and the curve will not generally pass - * through q1 or q2. Note that the convex hull property of "standard" Bezier - * curve does not hold on the sphere. */ -static SIMD_NOINLINE simd_quatd simd_bezier(simd_quatd q0, simd_quatd q1, simd_quatd q2, simd_quatd q3, double t); - -#ifdef __cplusplus -} /* extern "C" */ -/* MARK: - C++ double interfaces */ - -namespace simd { - struct quatd : ::simd_quatd { - /*! @abstract The identity quaternion. */ - quatd( ) : ::simd_quatd(::simd_quaternion((double4){0,0,0,1})) { } - - /*! @abstract Constructs a C++ quaternion from a C quaternion. */ - quatd(::simd_quatd q) : ::simd_quatd(q) { } - - /*! @abstract Constructs a quaternion from components. */ - quatd(double ix, double iy, double iz, double r) : ::simd_quatd(::simd_quaternion(ix, iy, iz, r)) { } - - /*! @abstract Constructs a quaternion from an array of scalars. */ - quatd(const double xyzr[4]) : ::simd_quatd(::simd_quaternion(xyzr)) { } - - /*! @abstract Constructs a quaternion from a vector. */ - quatd(double4 xyzr) : ::simd_quatd(::simd_quaternion(xyzr)) { } - - /*! @abstract Quaternion representing rotation about `axis` by `angle` - * radians. */ - quatd(double angle, double3 axis) : ::simd_quatd(::simd_quaternion(angle, axis)) { } - - /*! @abstract Quaternion that rotates `from` into `to`. */ - quatd(double3 from, double3 to) : ::simd_quatd(::simd_quaternion(from, to)) { } - - /*! @abstract Constructs a quaternion from a rotation matrix. */ - quatd(::simd_double3x3 matrix) : ::simd_quatd(::simd_quaternion(matrix)) { } - - /*! @abstract Constructs a quaternion from a rotation matrix. */ - quatd(::simd_double4x4 matrix) : ::simd_quatd(::simd_quaternion(matrix)) { } - - /*! @abstract The real (scalar) part of the quaternion. */ - double real(void) const { return ::simd_real(*this); } - - /*! @abstract The imaginary (vector) part of the quaternion. */ - double3 imag(void) const { return ::simd_imag(*this); } - - /*! @abstract The angle the quaternion rotates by. */ - double angle(void) const { return ::simd_angle(*this); } - - /*! @abstract The axis the quaternion rotates about. */ - double3 axis(void) const { return ::simd_axis(*this); } - - /*! @abstract The length of the quaternion. */ - double length(void) const { return ::simd_length(*this); } - - /*! @abstract Act on the vector `v` by rotation. */ - double3 operator()(const ::simd_double3 v) const { return ::simd_act(*this, v); } - }; - - static SIMD_CPPFUNC quatd operator+(const ::simd_quatd p, const ::simd_quatd q) { return ::simd_add(p, q); } - static SIMD_CPPFUNC quatd operator-(const ::simd_quatd p, const ::simd_quatd q) { return ::simd_sub(p, q); } - static SIMD_CPPFUNC quatd operator-(const ::simd_quatd p) { return ::simd_negate(p); } - static SIMD_CPPFUNC quatd operator*(const double r, const ::simd_quatd p) { return ::simd_mul(r, p); } - static SIMD_CPPFUNC quatd operator*(const ::simd_quatd p, const double r) { return ::simd_mul(p, r); } - static SIMD_CPPFUNC quatd operator*(const ::simd_quatd p, const ::simd_quatd q) { return ::simd_mul(p, q); } - static SIMD_CPPFUNC quatd operator/(const ::simd_quatd p, const ::simd_quatd q) { return ::simd_mul(p, ::simd_inverse(q)); } - static SIMD_CPPFUNC quatd operator+=(quatd &p, const ::simd_quatd q) { return p = p+q; } - static SIMD_CPPFUNC quatd operator-=(quatd &p, const ::simd_quatd q) { return p = p-q; } - static SIMD_CPPFUNC quatd operator*=(quatd &p, const double r) { return p = p*r; } - static SIMD_CPPFUNC quatd operator*=(quatd &p, const ::simd_quatd q) { return p = p*q; } - static SIMD_CPPFUNC quatd operator/=(quatd &p, const ::simd_quatd q) { return p = p/q; } - - /*! @abstract The conjugate of the quaternion `q`. */ - static SIMD_CPPFUNC quatd conjugate(const ::simd_quatd p) { return ::simd_conjugate(p); } - - /*! @abstract The (multiplicative) inverse of the quaternion `q`. */ - static SIMD_CPPFUNC quatd inverse(const ::simd_quatd p) { return ::simd_inverse(p); } - - /*! @abstract The dot product of the quaternions `p` and `q` interpreted as - * four-dimensional vectors. */ - static SIMD_CPPFUNC double dot(const ::simd_quatd p, const ::simd_quatd q) { return ::simd_dot(p, q); } - - /*! @abstract The unit quaternion obtained by normalizing `q`. */ - static SIMD_CPPFUNC quatd normalize(const ::simd_quatd p) { return ::simd_normalize(p); } - - /*! @abstract logarithm of the quaternion `q`. */ - static SIMD_CPPFUNC quatd log(const ::simd_quatd q) { return ::__tg_log(q); } - - /*! @abstract exponential map of quaterion `q`. */ - static SIMD_CPPFUNC quatd exp(const ::simd_quatd q) { return ::__tg_exp(q); } - - /*! @abstract Spherical linear interpolation along the shortest arc between - * quaternions `q0` and `q1`. */ - static SIMD_CPPFUNC quatd slerp(const ::simd_quatd p0, const ::simd_quatd p1, double t) { return ::simd_slerp(p0, p1, t); } - - /*! @abstract Spherical linear interpolation along the longest arc between - * quaternions `q0` and `q1`. */ - static SIMD_CPPFUNC quatd slerp_longest(const ::simd_quatd p0, const ::simd_quatd p1, double t) { return ::simd_slerp_longest(p0, p1, t); } - - /*! @abstract Interpolate between quaternions along a spherical cubic spline. - * - * @discussion The function interpolates between q1 and q2. q0 is the left - * endpoint of the previous interval, and q3 is the right endpoint of the next - * interval. Use this function to smoothly interpolate between a sequence of - * rotations. */ - static SIMD_CPPFUNC quatd spline(const ::simd_quatd p0, const ::simd_quatd p1, const ::simd_quatd p2, const ::simd_quatd p3, double t) { return ::simd_spline(p0, p1, p2, p3, t); } - - /*! @abstract Spherical cubic Bezier interpolation between quaternions. - * - * @discussion The function treats q0 ... q3 as control points and uses slerp - * in place of lerp in the De Castlejeau algorithm. The endpoints of - * interpolation are thus q0 and q3, and the curve will not generally pass - * through q1 or q2. Note that the convex hull property of "standard" Bezier - * curve does not hold on the sphere. */ - static SIMD_CPPFUNC quatd bezier(const ::simd_quatd p0, const ::simd_quatd p1, const ::simd_quatd p2, const ::simd_quatd p3, double t) { return ::simd_bezier(p0, p1, p2, p3, t); } -} - -extern "C" { -#endif /* __cplusplus */ - -/* MARK: - double implementations */ - -#include -#include - -/* tg_promote is implementation gobbledygook that enables the compile-time - * dispatching in tgmath.h to work its magic. */ -static simd_quatd __attribute__((__overloadable__)) __tg_promote(simd_quatd); - -/*! @abstract Constructs a quaternion from imaginary and real parts. - * @discussion This function is hidden behind an underscore to avoid confusion - * with the angle-axis constructor. */ -static inline SIMD_CFUNC simd_quatd _simd_quaternion(simd_double3 imag, double real) { - return simd_quaternion(simd_make_double4(imag, real)); -} - -static inline SIMD_CFUNC simd_quatd simd_quaternion(double angle, simd_double3 axis) { - return _simd_quaternion(sin(angle/2) * axis, cos(angle/2)); -} - -static inline SIMD_CFUNC double simd_angle(simd_quatd q) { - return 2*atan2(simd_length(q.vector.xyz), q.vector.w); -} - -static inline SIMD_CFUNC simd_double3 simd_axis(simd_quatd q) { - return simd_normalize(q.vector.xyz); -} - -static inline SIMD_CFUNC simd_quatd simd_add(simd_quatd p, simd_quatd q) { - return simd_quaternion(p.vector + q.vector); -} - -static inline SIMD_CFUNC simd_quatd simd_sub(simd_quatd p, simd_quatd q) { - return simd_quaternion(p.vector - q.vector); -} - -static inline SIMD_CFUNC simd_quatd simd_mul(simd_quatd p, simd_quatd q) { - #pragma STDC FP_CONTRACT ON - return simd_quaternion((p.vector.x * __builtin_shufflevector(q.vector, -q.vector, 3,6,1,4) + - p.vector.y * __builtin_shufflevector(q.vector, -q.vector, 2,3,4,5)) + - (p.vector.z * __builtin_shufflevector(q.vector, -q.vector, 5,0,3,6) + - p.vector.w * q.vector)); -} - -static inline SIMD_CFUNC simd_quatd simd_mul(simd_quatd q, double a) { - return simd_quaternion(a * q.vector); -} - -static inline SIMD_CFUNC simd_quatd simd_mul(double a, simd_quatd q) { - return simd_mul(q,a); -} - -static inline SIMD_CFUNC simd_quatd simd_conjugate(simd_quatd q) { - return simd_quaternion(q.vector * (simd_double4){-1,-1,-1, 1}); -} - -static inline SIMD_CFUNC simd_quatd simd_inverse(simd_quatd q) { - return simd_quaternion(simd_conjugate(q).vector * simd_recip(simd_length_squared(q.vector))); -} - -static inline SIMD_CFUNC simd_quatd simd_negate(simd_quatd q) { - return simd_quaternion(-q.vector); -} - -static inline SIMD_CFUNC double simd_dot(simd_quatd p, simd_quatd q) { - return simd_dot(p.vector, q.vector); -} - -static inline SIMD_CFUNC double simd_length(simd_quatd q) { - return simd_length(q.vector); -} - -static inline SIMD_CFUNC simd_quatd simd_normalize(simd_quatd q) { - double length_squared = simd_length_squared(q.vector); - if (length_squared == 0) { - return simd_quaternion((simd_double4){0,0,0,1}); - } - return simd_quaternion(q.vector * simd_rsqrt(length_squared)); -} - -#if defined __arm__ || defined __arm64__ -/*! @abstract Multiplies the vector `v` by the quaternion `q`. - * - * @discussion This IS NOT the action of `q` on `v` (i.e. this is not rotation - * by `q`. That operation is provided by `simd_act(q, v)`. This function is an - * implementation detail and you should not call it directly. It may be - * removed or modified in future versions of the simd module. */ -static inline SIMD_CFUNC simd_quatd _simd_mul_vq(simd_double3 v, simd_quatd q) { - #pragma STDC FP_CONTRACT ON - return simd_quaternion(v.x * __builtin_shufflevector(q.vector, -q.vector, 3,6,1,4) + - v.y * __builtin_shufflevector(q.vector, -q.vector, 2,3,4,5) + - v.z * __builtin_shufflevector(q.vector, -q.vector, 5,0,3,6)); -} -#endif - -static inline SIMD_CFUNC simd_double3 simd_act(simd_quatd q, simd_double3 v) { -#if defined __arm__ || defined __arm64__ - return simd_mul(q, _simd_mul_vq(v, simd_conjugate(q))).vector.xyz; -#else - #pragma STDC FP_CONTRACT ON - simd_double3 t = 2*simd_cross(simd_imag(q),v); - return v + simd_real(q)*t + simd_cross(simd_imag(q), t); -#endif -} - -static SIMD_NOINLINE simd_quatd __tg_log(simd_quatd q) { - double real = __tg_log(simd_length_squared(q.vector))/2; - if (simd_equal(simd_imag(q), 0)) return _simd_quaternion(0, real); - simd_double3 imag = __tg_acos(simd_real(q)/simd_length(q)) * simd_normalize(simd_imag(q)); - return _simd_quaternion(imag, real); -} - -static SIMD_NOINLINE simd_quatd __tg_exp(simd_quatd q) { - // angle is actually *twice* the angle of the rotation corresponding to - // the resulting quaternion, which is why we don't simply use the (angle, - // axis) constructor to generate `unit`. - double angle = simd_length(simd_imag(q)); - if (angle == 0) return _simd_quaternion(0, exp(simd_real(q))); - simd_double3 axis = simd_normalize(simd_imag(q)); - simd_quatd unit = _simd_quaternion(sin(angle)*axis, cosf(angle)); - return simd_mul(exp(simd_real(q)), unit); -} - -/*! @abstract Implementation detail of the `simd_quaternion(from, to)` - * initializer. - * - * @discussion Computes the quaternion rotation `from` to `to` if they are - * separated by less than 90 degrees. Not numerically stable for larger - * angles. This function is an implementation detail and you should not - * call it directly. It may be removed or modified in future versions of the - * simd module. */ -static inline SIMD_CFUNC simd_quatd _simd_quaternion_reduced(simd_double3 from, simd_double3 to) { - simd_double3 half = simd_normalize(from + to); - return _simd_quaternion(simd_cross(from, half), simd_dot(from, half)); -} - -static SIMD_NOINLINE simd_quatd simd_quaternion(simd_double3 from, simd_double3 to) { - - // If the angle between from and to is not too big, we can compute the - // rotation accurately using a simple implementation. - if (simd_dot(from, to) >= 0) { - return _simd_quaternion_reduced(from, to); - } - - // Because from and to are more than 90 degrees apart, we compute the - // rotation in two stages (from -> half), (half -> to) to preserve numerical - // accuracy. - simd_double3 half = simd_normalize(from + to); - - if (simd_length_squared(half) == 0) { - // half is nearly zero, so from and to point in nearly opposite directions - // and the rotation is numerically underspecified. Pick an axis orthogonal - // to the vectors, and use an angle of pi radians. - simd_double3 abs_from = simd_abs(from); - if (abs_from.x <= abs_from.y && abs_from.x <= abs_from.z) - return _simd_quaternion(simd_normalize(simd_cross(from, (simd_double3){1,0,0})), 0.f); - else if (abs_from.y <= abs_from.z) - return _simd_quaternion(simd_normalize(simd_cross(from, (simd_double3){0,1,0})), 0.f); - else - return _simd_quaternion(simd_normalize(simd_cross(from, (simd_double3){0,0,1})), 0.f); - } - - // Compute the two-step rotation. */ - return simd_mul(_simd_quaternion_reduced(from, half), - _simd_quaternion_reduced(half, to)); -} - -static SIMD_NOINLINE simd_quatd simd_quaternion(simd_double3x3 matrix) { - const simd_double3 *mat = matrix.columns; - double trace = mat[0][0] + mat[1][1] + mat[2][2]; - if (trace >= 0.0) { - double r = 2*sqrt(1 + trace); - double rinv = simd_recip(r); - return simd_quaternion(rinv*(mat[1][2] - mat[2][1]), - rinv*(mat[2][0] - mat[0][2]), - rinv*(mat[0][1] - mat[1][0]), - r/4); - } else if (mat[0][0] >= mat[1][1] && mat[0][0] >= mat[2][2]) { - double r = 2*sqrt(1 - mat[1][1] - mat[2][2] + mat[0][0]); - double rinv = simd_recip(r); - return simd_quaternion(r/4, - rinv*(mat[0][1] + mat[1][0]), - rinv*(mat[0][2] + mat[2][0]), - rinv*(mat[1][2] - mat[2][1])); - } else if (mat[1][1] >= mat[2][2]) { - double r = 2*sqrt(1 - mat[0][0] - mat[2][2] + mat[1][1]); - double rinv = simd_recip(r); - return simd_quaternion(rinv*(mat[0][1] + mat[1][0]), - r/4, - rinv*(mat[1][2] + mat[2][1]), - rinv*(mat[2][0] - mat[0][2])); - } else { - double r = 2*sqrt(1 - mat[0][0] - mat[1][1] + mat[2][2]); - double rinv = simd_recip(r); - return simd_quaternion(rinv*(mat[0][2] + mat[2][0]), - rinv*(mat[1][2] + mat[2][1]), - r/4, - rinv*(mat[0][1] - mat[1][0])); - } -} - -static SIMD_NOINLINE simd_quatd simd_quaternion(simd_double4x4 matrix) { - const simd_double4 *mat = matrix.columns; - double trace = mat[0][0] + mat[1][1] + mat[2][2]; - if (trace >= 0.0) { - double r = 2*sqrt(1 + trace); - double rinv = simd_recip(r); - return simd_quaternion(rinv*(mat[1][2] - mat[2][1]), - rinv*(mat[2][0] - mat[0][2]), - rinv*(mat[0][1] - mat[1][0]), - r/4); - } else if (mat[0][0] >= mat[1][1] && mat[0][0] >= mat[2][2]) { - double r = 2*sqrt(1 - mat[1][1] - mat[2][2] + mat[0][0]); - double rinv = simd_recip(r); - return simd_quaternion(r/4, - rinv*(mat[0][1] + mat[1][0]), - rinv*(mat[0][2] + mat[2][0]), - rinv*(mat[1][2] - mat[2][1])); - } else if (mat[1][1] >= mat[2][2]) { - double r = 2*sqrt(1 - mat[0][0] - mat[2][2] + mat[1][1]); - double rinv = simd_recip(r); - return simd_quaternion(rinv*(mat[0][1] + mat[1][0]), - r/4, - rinv*(mat[1][2] + mat[2][1]), - rinv*(mat[2][0] - mat[0][2])); - } else { - double r = 2*sqrt(1 - mat[0][0] - mat[1][1] + mat[2][2]); - double rinv = simd_recip(r); - return simd_quaternion(rinv*(mat[0][2] + mat[2][0]), - rinv*(mat[1][2] + mat[2][1]), - r/4, - rinv*(mat[0][1] - mat[1][0])); - } -} - -/*! @abstract The angle between p and q interpreted as 4-dimensional vectors. - * - * @discussion This function is an implementation detail and you should not - * call it directly. It may be removed or modified in future versions of the - * simd module. */ -static SIMD_NOINLINE double _simd_angle(simd_quatd p, simd_quatd q) { - return 2*atan2(simd_length(p.vector - q.vector), simd_length(p.vector + q.vector)); -} - -/*! @abstract sin(x)/x. - * - * @discussion This function is an implementation detail and you should not - * call it directly. It may be removed or modified in future versions of the - * simd module. */ -static SIMD_CFUNC double _simd_sinc(double x) { - if (x == 0) return 1; - return sin(x)/x; -} - -/*! @abstract Spherical lerp between q0 and q1. - * - * @discussion This function may interpolate along either the longer or - * shorter path between q0 and q1; it is used as an implementation detail - * in `simd_slerp` and `simd_slerp_longest`; you should use those functions - * instead of calling this directly. */ -static SIMD_NOINLINE simd_quatd _simd_slerp_internal(simd_quatd q0, simd_quatd q1, double t) { - double s = 1 - t; - double a = _simd_angle(q0, q1); - double r = simd_recip(_simd_sinc(a)); - return simd_normalize(simd_quaternion(_simd_sinc(s*a)*r*s*q0.vector + _simd_sinc(t*a)*r*t*q1.vector)); -} - -static SIMD_NOINLINE simd_quatd simd_slerp(simd_quatd q0, simd_quatd q1, double t) { - if (simd_dot(q0, q1) >= 0) - return _simd_slerp_internal(q0, q1, t); - return _simd_slerp_internal(q0, simd_negate(q1), t); -} - -static SIMD_NOINLINE simd_quatd simd_slerp_longest(simd_quatd q0, simd_quatd q1, double t) { - if (simd_dot(q0, q1) >= 0) - return _simd_slerp_internal(q0, simd_negate(q1), t); - return _simd_slerp_internal(q0, q1, t); -} - -/*! @discussion This function is an implementation detail and you should not - * call it directly. It may be removed or modified in future versions of the - * simd module. */ -static SIMD_NOINLINE simd_quatd _simd_intermediate(simd_quatd q0, simd_quatd q1, simd_quatd q2) { - simd_quatd p0 = __tg_log(simd_mul(q0, simd_inverse(q1))); - simd_quatd p2 = __tg_log(simd_mul(q2, simd_inverse(q1))); - return simd_normalize(simd_mul(q1, __tg_exp(simd_mul(-0.25, simd_add(p0,p2))))); -} - -/*! @discussion This function is an implementation detail and you should not - * call it directly. It may be removed or modified in future versions of the - * simd module. */ -static SIMD_NOINLINE simd_quatd _simd_squad(simd_quatd q0, simd_quatd qa, simd_quatd qb, simd_quatd q1, double t) { - simd_quatd r0 = _simd_slerp_internal(q0, q1, t); - simd_quatd r1 = _simd_slerp_internal(qa, qb, t); - return _simd_slerp_internal(r0, r1, 2*t*(1 - t)); -} - -static SIMD_NOINLINE simd_quatd simd_spline(simd_quatd q0, simd_quatd q1, simd_quatd q2, simd_quatd q3, double t) { - simd_quatd qa = _simd_intermediate(q0, q1, q2); - simd_quatd qb = _simd_intermediate(q1, q2, q3); - return _simd_squad(q1, qa, qb, q2, t); -} - -static SIMD_NOINLINE simd_quatd simd_bezier(simd_quatd q0, simd_quatd q1, simd_quatd q2, simd_quatd q3, double t) { - simd_quatd q01 = _simd_slerp_internal(q0, q1, t); - simd_quatd q12 = _simd_slerp_internal(q1, q2, t); - simd_quatd q23 = _simd_slerp_internal(q2, q3, t); - simd_quatd q012 = _simd_slerp_internal(q01, q12, t); - simd_quatd q123 = _simd_slerp_internal(q12, q23, t); - return _simd_slerp_internal(q012, q123, t); -} - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ -#endif /* SIMD_COMPILER_HAS_REQUIRED_FEATURES */ -#endif /* SIMD_QUATERNIONS */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/spawn.h b/lib/libc/include/x86_64-macos-gnu/spawn.h deleted file mode 100644 index 8441df3abe..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/spawn.h +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright (c) 2006, 2010 Apple Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - - -#ifndef _SPAWN_H_ -#define _SPAWN_H_ - -/* - * [SPN] Support for _POSIX_SPAWN - */ - -#include -#include <_types.h> -#include /* shared types */ - -#include - -/* - * [SPN] Inclusion of the header may make visible symbols defined - * in the , , and headers. - */ -#include -#include -#include - -/* - * Opaque types for use with posix_spawn() family functions. Internals are - * not defined, and should not be accessed directly. Types are defined as - * mandated by POSIX. - */ -typedef void *posix_spawnattr_t; -typedef void *posix_spawn_file_actions_t; - -__BEGIN_DECLS -/* - * gcc under c99 mode won't compile "[ __restrict]" by itself. As a workaround, - * a dummy argument name is added. - */ - -int posix_spawn(pid_t * __restrict, const char * __restrict, - const posix_spawn_file_actions_t *, - const posix_spawnattr_t * __restrict, - char *const __argv[__restrict], - char *const __envp[__restrict]) __API_AVAILABLE(macos(10.5), ios(2.0)) __API_UNAVAILABLE(watchos, tvos); - -int posix_spawnp(pid_t * __restrict, const char * __restrict, - const posix_spawn_file_actions_t *, - const posix_spawnattr_t * __restrict, - char *const __argv[__restrict], - char *const __envp[__restrict]) __API_AVAILABLE(macos(10.5), ios(2.0)); - -int posix_spawn_file_actions_addclose(posix_spawn_file_actions_t *, int) __API_AVAILABLE(macos(10.5), ios(2.0)) __API_UNAVAILABLE(watchos, tvos); - -int posix_spawn_file_actions_adddup2(posix_spawn_file_actions_t *, int, - int) __API_AVAILABLE(macos(10.5), ios(2.0)) __API_UNAVAILABLE(watchos, tvos); - -int posix_spawn_file_actions_addopen( - posix_spawn_file_actions_t * __restrict, int, - const char * __restrict, int, mode_t) __API_AVAILABLE(macos(10.5), ios(2.0)) __API_UNAVAILABLE(watchos, tvos); - -int posix_spawn_file_actions_destroy(posix_spawn_file_actions_t *) __API_AVAILABLE(macos(10.5), ios(2.0)) __API_UNAVAILABLE(watchos, tvos); - -int posix_spawn_file_actions_init(posix_spawn_file_actions_t *) __API_AVAILABLE(macos(10.5), ios(2.0)) __API_UNAVAILABLE(watchos, tvos); - -int posix_spawnattr_destroy(posix_spawnattr_t *) __API_AVAILABLE(macos(10.5), ios(2.0)) __API_UNAVAILABLE(watchos, tvos); - -int posix_spawnattr_getsigdefault(const posix_spawnattr_t * __restrict, - sigset_t * __restrict) __API_AVAILABLE(macos(10.5), ios(2.0)) __API_UNAVAILABLE(watchos, tvos); - -int posix_spawnattr_getflags(const posix_spawnattr_t * __restrict, - short * __restrict) __API_AVAILABLE(macos(10.5), ios(2.0)) __API_UNAVAILABLE(watchos, tvos); - -int posix_spawnattr_getpgroup(const posix_spawnattr_t * __restrict, - pid_t * __restrict) __API_AVAILABLE(macos(10.5), ios(2.0)) __API_UNAVAILABLE(watchos, tvos); - -int posix_spawnattr_getsigmask(const posix_spawnattr_t * __restrict, - sigset_t * __restrict) __API_AVAILABLE(macos(10.5), ios(2.0)) __API_UNAVAILABLE(watchos, tvos); - -int posix_spawnattr_init(posix_spawnattr_t *) __API_AVAILABLE(macos(10.5), ios(2.0)) __API_UNAVAILABLE(watchos, tvos); - -int posix_spawnattr_setsigdefault(posix_spawnattr_t * __restrict, - const sigset_t * __restrict) __API_AVAILABLE(macos(10.5), ios(2.0)) __API_UNAVAILABLE(watchos, tvos); - -int posix_spawnattr_setflags(posix_spawnattr_t *, short) __API_AVAILABLE(macos(10.5), ios(2.0)) __API_UNAVAILABLE(watchos, tvos); - -int posix_spawnattr_setpgroup(posix_spawnattr_t *, pid_t) __API_AVAILABLE(macos(10.5), ios(2.0)) __API_UNAVAILABLE(watchos, tvos); - -int posix_spawnattr_setsigmask(posix_spawnattr_t * __restrict, - const sigset_t * __restrict) __API_AVAILABLE(macos(10.5), ios(2.0)) __API_UNAVAILABLE(watchos, tvos); - -#if 0 /* _POSIX_PRIORITY_SCHEDULING [PS] : not supported */ -int posix_spawnattr_setschedparam(posix_spawnattr_t * __restrict, - const struct sched_param * __restrict); -int posix_spawnattr_setschedpolicy(posix_spawnattr_t *, int); -int posix_spawnattr_getschedparam(const posix_spawnattr_t * __restrict, - struct sched_param * __restrict); -int posix_spawnattr_getschedpolicy(const posix_spawnattr_t * __restrict, - int * __restrict); -#endif /* 0 */ - -__END_DECLS - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -/* - * Darwin-specific extensions below - */ -#include -#include -#include - -#include - -__BEGIN_DECLS - -int posix_spawnattr_getbinpref_np(const posix_spawnattr_t * __restrict, - size_t, cpu_type_t *__restrict, size_t *__restrict) __API_AVAILABLE(macos(10.5), ios(2.0)) __API_UNAVAILABLE(watchos, tvos); - -int posix_spawnattr_setauditsessionport_np(posix_spawnattr_t * __restrict, - mach_port_t) __API_AVAILABLE(macos(10.6), ios(3.2)); - -int posix_spawnattr_setbinpref_np(posix_spawnattr_t * __restrict, - size_t, cpu_type_t *__restrict, size_t *__restrict) __API_AVAILABLE(macos(10.5), ios(2.0)) __API_UNAVAILABLE(watchos, tvos); - -int posix_spawnattr_setexceptionports_np(posix_spawnattr_t * __restrict, - exception_mask_t, mach_port_t, - exception_behavior_t, thread_state_flavor_t) __API_AVAILABLE(macos(10.5), ios(2.0)) __API_UNAVAILABLE(watchos, tvos); - -int posix_spawnattr_setspecialport_np(posix_spawnattr_t * __restrict, - mach_port_t, int) __API_AVAILABLE(macos(10.5), ios(2.0)) __API_UNAVAILABLE(watchos, tvos); - -int posix_spawnattr_setsuidcredport_np(posix_spawnattr_t * __restrict, mach_port_t) __API_UNAVAILABLE(ios, macos); - -int posix_spawn_file_actions_addinherit_np(posix_spawn_file_actions_t *, - int) __API_AVAILABLE(macos(10.7), ios(4.3)) __API_UNAVAILABLE(watchos, tvos); - -int posix_spawn_file_actions_addchdir_np(posix_spawn_file_actions_t *, - const char * __restrict) __API_AVAILABLE(macos(10.15)) __API_UNAVAILABLE(ios, tvos, watchos); - -int posix_spawn_file_actions_addfchdir_np(posix_spawn_file_actions_t *, - int) __API_AVAILABLE(macos(10.15)) __API_UNAVAILABLE(ios, tvos, watchos); - -__END_DECLS - -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ -#endif /* _SPAWN_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/stdio.h b/lib/libc/include/x86_64-macos-gnu/stdio.h deleted file mode 100644 index 0a756d415d..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/stdio.h +++ /dev/null @@ -1,410 +0,0 @@ -/* - * Copyright (c) 2000, 2005, 2007, 2009, 2010 Apple Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ -/*- - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Chris Torek. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)stdio.h 8.5 (Berkeley) 4/29/95 - */ - -#ifndef _STDIO_H_ -#define _STDIO_H_ - -#include <_stdio.h> - -__BEGIN_DECLS -extern FILE *__stdinp; -extern FILE *__stdoutp; -extern FILE *__stderrp; -__END_DECLS - -#define __SLBF 0x0001 /* line buffered */ -#define __SNBF 0x0002 /* unbuffered */ -#define __SRD 0x0004 /* OK to read */ -#define __SWR 0x0008 /* OK to write */ - /* RD and WR are never simultaneously asserted */ -#define __SRW 0x0010 /* open for reading & writing */ -#define __SEOF 0x0020 /* found EOF */ -#define __SERR 0x0040 /* found error */ -#define __SMBF 0x0080 /* _buf is from malloc */ -#define __SAPP 0x0100 /* fdopen()ed in append mode */ -#define __SSTR 0x0200 /* this is an sprintf/snprintf string */ -#define __SOPT 0x0400 /* do fseek() optimisation */ -#define __SNPT 0x0800 /* do not do fseek() optimisation */ -#define __SOFF 0x1000 /* set iff _offset is in fact correct */ -#define __SMOD 0x2000 /* true => fgetln modified _p text */ -#define __SALC 0x4000 /* allocate string space dynamically */ -#define __SIGN 0x8000 /* ignore this file in _fwalk */ - -/* - * The following three definitions are for ANSI C, which took them - * from System V, which brilliantly took internal interface macros and - * made them official arguments to setvbuf(), without renaming them. - * Hence, these ugly _IOxxx names are *supposed* to appear in user code. - * - * Although numbered as their counterparts above, the implementation - * does not rely on this. - */ -#define _IOFBF 0 /* setvbuf should set fully buffered */ -#define _IOLBF 1 /* setvbuf should set line buffered */ -#define _IONBF 2 /* setvbuf should set unbuffered */ - -#define BUFSIZ 1024 /* size of buffer used by setbuf */ -#define EOF (-1) - - /* must be == _POSIX_STREAM_MAX */ -#define FOPEN_MAX 20 /* must be <= OPEN_MAX */ -#define FILENAME_MAX 1024 /* must be <= PATH_MAX */ - -/* System V/ANSI C; this is the wrong way to do this, do *not* use these. */ -#ifndef _ANSI_SOURCE -#define P_tmpdir "/var/tmp/" -#endif -#define L_tmpnam 1024 /* XXX must be == PATH_MAX */ -#define TMP_MAX 308915776 - -#ifndef SEEK_SET -#define SEEK_SET 0 /* set file offset to offset */ -#endif -#ifndef SEEK_CUR -#define SEEK_CUR 1 /* set file offset to current plus offset */ -#endif -#ifndef SEEK_END -#define SEEK_END 2 /* set file offset to EOF plus offset */ -#endif - -#define stdin __stdinp -#define stdout __stdoutp -#define stderr __stderrp - -#ifdef _DARWIN_UNLIMITED_STREAMS -#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_3_2 -#error "_DARWIN_UNLIMITED_STREAMS specified, but -miphoneos-version-min version does not support it." -#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_6 -#error "_DARWIN_UNLIMITED_STREAMS specified, but -mmacosx-version-min version does not support it." -#endif -#endif - -/* ANSI-C */ - -__BEGIN_DECLS -void clearerr(FILE *); -int fclose(FILE *); -int feof(FILE *); -int ferror(FILE *); -int fflush(FILE *); -int fgetc(FILE *); -int fgetpos(FILE * __restrict, fpos_t *); -char *fgets(char * __restrict, int, FILE *); -#if defined(_DARWIN_UNLIMITED_STREAMS) || defined(_DARWIN_C_SOURCE) -FILE *fopen(const char * __restrict __filename, const char * __restrict __mode) __DARWIN_ALIAS_STARTING(__MAC_10_6, __IPHONE_3_2, __DARWIN_EXTSN(fopen)); -#else /* !_DARWIN_UNLIMITED_STREAMS && !_DARWIN_C_SOURCE */ -FILE *fopen(const char * __restrict __filename, const char * __restrict __mode) __DARWIN_ALIAS_STARTING(__MAC_10_6, __IPHONE_2_0, __DARWIN_ALIAS(fopen)); -#endif /* (DARWIN_UNLIMITED_STREAMS || _DARWIN_C_SOURCE) */ -int fprintf(FILE * __restrict, const char * __restrict, ...) __printflike(2, 3); -int fputc(int, FILE *); -int fputs(const char * __restrict, FILE * __restrict) __DARWIN_ALIAS(fputs); -size_t fread(void * __restrict __ptr, size_t __size, size_t __nitems, FILE * __restrict __stream); -FILE *freopen(const char * __restrict, const char * __restrict, - FILE * __restrict) __DARWIN_ALIAS(freopen); -int fscanf(FILE * __restrict, const char * __restrict, ...) __scanflike(2, 3); -int fseek(FILE *, long, int); -int fsetpos(FILE *, const fpos_t *); -long ftell(FILE *); -size_t fwrite(const void * __restrict __ptr, size_t __size, size_t __nitems, FILE * __restrict __stream) __DARWIN_ALIAS(fwrite); -int getc(FILE *); -int getchar(void); -char *gets(char *); -void perror(const char *) __cold; -int printf(const char * __restrict, ...) __printflike(1, 2); -int putc(int, FILE *); -int putchar(int); -int puts(const char *); -int remove(const char *); -int rename (const char *__old, const char *__new); -void rewind(FILE *); -int scanf(const char * __restrict, ...) __scanflike(1, 2); -void setbuf(FILE * __restrict, char * __restrict); -int setvbuf(FILE * __restrict, char * __restrict, int, size_t); -int sprintf(char * __restrict, const char * __restrict, ...) __printflike(2, 3) __swift_unavailable("Use snprintf instead."); -int sscanf(const char * __restrict, const char * __restrict, ...) __scanflike(2, 3); -FILE *tmpfile(void); - -__swift_unavailable("Use mkstemp(3) instead.") -#if !defined(_POSIX_C_SOURCE) -__deprecated_msg("This function is provided for compatibility reasons only. Due to security concerns inherent in the design of tmpnam(3), it is highly recommended that you use mkstemp(3) instead.") -#endif -char *tmpnam(char *); -int ungetc(int, FILE *); -int vfprintf(FILE * __restrict, const char * __restrict, va_list) __printflike(2, 0); -int vprintf(const char * __restrict, va_list) __printflike(1, 0); -int vsprintf(char * __restrict, const char * __restrict, va_list) __printflike(2, 0) __swift_unavailable("Use vsnprintf instead."); -__END_DECLS - - - -/* Additional functionality provided by: - * POSIX.1-1988 - */ - -#if __DARWIN_C_LEVEL >= 198808L -#define L_ctermid 1024 /* size for ctermid(); PATH_MAX */ - -__BEGIN_DECLS -#include <_ctermid.h> - -#if defined(_DARWIN_UNLIMITED_STREAMS) || defined(_DARWIN_C_SOURCE) -FILE *fdopen(int, const char *) __DARWIN_ALIAS_STARTING(__MAC_10_6, __IPHONE_3_2, __DARWIN_EXTSN(fdopen)); -#else /* !_DARWIN_UNLIMITED_STREAMS && !_DARWIN_C_SOURCE */ -FILE *fdopen(int, const char *) __DARWIN_ALIAS_STARTING(__MAC_10_6, __IPHONE_2_0, __DARWIN_ALIAS(fdopen)); -#endif /* (DARWIN_UNLIMITED_STREAMS || _DARWIN_C_SOURCE) */ -int fileno(FILE *); -__END_DECLS -#endif /* __DARWIN_C_LEVEL >= 198808L */ - - -/* Additional functionality provided by: - * POSIX.2-1992 C Language Binding Option - */ -#if TARGET_OS_EMBEDDED -#define __swift_unavailable_on(osx_msg, ios_msg) __swift_unavailable(ios_msg) -#else -#define __swift_unavailable_on(osx_msg, ios_msg) __swift_unavailable(osx_msg) -#endif - -#if __DARWIN_C_LEVEL >= 199209L -__BEGIN_DECLS -int pclose(FILE *) __swift_unavailable_on("Use posix_spawn APIs or NSTask instead.", "Process spawning is unavailable."); -#if defined(_DARWIN_UNLIMITED_STREAMS) || defined(_DARWIN_C_SOURCE) -FILE *popen(const char *, const char *) __DARWIN_ALIAS_STARTING(__MAC_10_6, __IPHONE_3_2, __DARWIN_EXTSN(popen)) __swift_unavailable_on("Use posix_spawn APIs or NSTask instead.", "Process spawning is unavailable."); -#else /* !_DARWIN_UNLIMITED_STREAMS && !_DARWIN_C_SOURCE */ -FILE *popen(const char *, const char *) __DARWIN_ALIAS_STARTING(__MAC_10_6, __IPHONE_2_0, __DARWIN_ALIAS(popen)) __swift_unavailable_on("Use posix_spawn APIs or NSTask instead.", "Process spawning is unavailable."); -#endif /* (DARWIN_UNLIMITED_STREAMS || _DARWIN_C_SOURCE) */ -__END_DECLS -#endif /* __DARWIN_C_LEVEL >= 199209L */ - -#undef __swift_unavailable_on - -/* Additional functionality provided by: - * POSIX.1c-1995, - * POSIX.1i-1995, - * and the omnibus ISO/IEC 9945-1: 1996 - */ - -#if __DARWIN_C_LEVEL >= 199506L - -/* Functions internal to the implementation. */ -__BEGIN_DECLS -int __srget(FILE *); -int __svfscanf(FILE *, const char *, va_list) __scanflike(2, 0); -int __swbuf(int, FILE *); -__END_DECLS - -/* - * The __sfoo macros are here so that we can - * define function versions in the C library. - */ -#define __sgetc(p) (--(p)->_r < 0 ? __srget(p) : (int)(*(p)->_p++)) -#if defined(__GNUC__) && defined(__STDC__) -__header_always_inline int __sputc(int _c, FILE *_p) { - if (--_p->_w >= 0 || (_p->_w >= _p->_lbfsize && (char)_c != '\n')) - return (*_p->_p++ = _c); - else - return (__swbuf(_c, _p)); -} -#else -/* - * This has been tuned to generate reasonable code on the vax using pcc. - */ -#define __sputc(c, p) \ - (--(p)->_w < 0 ? \ - (p)->_w >= (p)->_lbfsize ? \ - (*(p)->_p = (c)), *(p)->_p != '\n' ? \ - (int)*(p)->_p++ : \ - __swbuf('\n', p) : \ - __swbuf((int)(c), p) : \ - (*(p)->_p = (c), (int)*(p)->_p++)) -#endif - -#define __sfeof(p) (((p)->_flags & __SEOF) != 0) -#define __sferror(p) (((p)->_flags & __SERR) != 0) -#define __sclearerr(p) ((void)((p)->_flags &= ~(__SERR|__SEOF))) -#define __sfileno(p) ((p)->_file) - -__BEGIN_DECLS -void flockfile(FILE *); -int ftrylockfile(FILE *); -void funlockfile(FILE *); -int getc_unlocked(FILE *); -int getchar_unlocked(void); -int putc_unlocked(int, FILE *); -int putchar_unlocked(int); - -/* Removed in Issue 6 */ -#if !defined(_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 200112L -int getw(FILE *); -int putw(int, FILE *); -#endif - -__swift_unavailable("Use mkstemp(3) instead.") -#if !defined(_POSIX_C_SOURCE) -__deprecated_msg("This function is provided for compatibility reasons only. Due to security concerns inherent in the design of tempnam(3), it is highly recommended that you use mkstemp(3) instead.") -#endif -char *tempnam(const char *__dir, const char *__prefix) __DARWIN_ALIAS(tempnam); -__END_DECLS - -#ifndef lint -#define getc_unlocked(fp) __sgetc(fp) -#define putc_unlocked(x, fp) __sputc(x, fp) -#endif /* lint */ - -#define getchar_unlocked() getc_unlocked(stdin) -#define putchar_unlocked(x) putc_unlocked(x, stdout) -#endif /* __DARWIN_C_LEVEL >= 199506L */ - - - -/* Additional functionality provided by: - * POSIX.1-2001 - * ISO C99 - */ - -#if __DARWIN_C_LEVEL >= 200112L -#include - -__BEGIN_DECLS -int fseeko(FILE * __stream, off_t __offset, int __whence); -off_t ftello(FILE * __stream); -__END_DECLS -#endif /* __DARWIN_C_LEVEL >= 200112L */ - -#if __DARWIN_C_LEVEL >= 200112L || defined(_C99_SOURCE) || defined(__cplusplus) -__BEGIN_DECLS -int snprintf(char * __restrict __str, size_t __size, const char * __restrict __format, ...) __printflike(3, 4); -int vfscanf(FILE * __restrict __stream, const char * __restrict __format, va_list) __scanflike(2, 0); -int vscanf(const char * __restrict __format, va_list) __scanflike(1, 0); -int vsnprintf(char * __restrict __str, size_t __size, const char * __restrict __format, va_list) __printflike(3, 0); -int vsscanf(const char * __restrict __str, const char * __restrict __format, va_list) __scanflike(2, 0); -__END_DECLS -#endif /* __DARWIN_C_LEVEL >= 200112L || defined(_C99_SOURCE) || defined(__cplusplus) */ - - - -/* Additional functionality provided by: - * POSIX.1-2008 - */ - -#if __DARWIN_C_LEVEL >= 200809L -#include - -__BEGIN_DECLS -int dprintf(int, const char * __restrict, ...) __printflike(2, 3) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); -int vdprintf(int, const char * __restrict, va_list) __printflike(2, 0) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); -ssize_t getdelim(char ** __restrict __linep, size_t * __restrict __linecapp, int __delimiter, FILE * __restrict __stream) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); -ssize_t getline(char ** __restrict __linep, size_t * __restrict __linecapp, FILE * __restrict __stream) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); -FILE *fmemopen(void * __restrict __buf, size_t __size, const char * __restrict __mode) __API_AVAILABLE(macos(10.13), ios(11.0), tvos(11.0), watchos(4.0)); -FILE *open_memstream(char **__bufp, size_t *__sizep) __API_AVAILABLE(macos(10.13), ios(11.0), tvos(11.0), watchos(4.0)); -__END_DECLS -#endif /* __DARWIN_C_LEVEL >= 200809L */ - - - -/* Darwin extensions */ - -#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL -__BEGIN_DECLS -extern __const int sys_nerr; /* perror(3) external variables */ -extern __const char *__const sys_errlist[]; - -int asprintf(char ** __restrict, const char * __restrict, ...) __printflike(2, 3); -char *ctermid_r(char *); -char *fgetln(FILE *, size_t *); -__const char *fmtcheck(const char *, const char *); -int fpurge(FILE *); -void setbuffer(FILE *, char *, int); -int setlinebuf(FILE *); -int vasprintf(char ** __restrict, const char * __restrict, va_list) __printflike(2, 0); -FILE *zopen(const char *, const char *, int); - - -/* - * Stdio function-access interface. - */ -FILE *funopen(const void *, - int (* _Nullable)(void *, char *, int), - int (* _Nullable)(void *, const char *, int), - fpos_t (* _Nullable)(void *, fpos_t, int), - int (* _Nullable)(void *)); -__END_DECLS -#define fropen(cookie, fn) funopen(cookie, fn, 0, 0, 0) -#define fwopen(cookie, fn) funopen(cookie, 0, fn, 0, 0) - -#define feof_unlocked(p) __sfeof(p) -#define ferror_unlocked(p) __sferror(p) -#define clearerr_unlocked(p) __sclearerr(p) -#define fileno_unlocked(p) __sfileno(p) - -#endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ - - -#ifdef _USE_EXTENDED_LOCALES_ -#include -#endif /* _USE_EXTENDED_LOCALES_ */ - -#if defined (__GNUC__) && _FORTIFY_SOURCE > 0 && !defined (__cplusplus) -/* Security checking functions. */ -#include -#endif - -#endif /* _STDIO_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/stdlib.h b/lib/libc/include/x86_64-macos-gnu/stdlib.h deleted file mode 100644 index a5b61930fd..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/stdlib.h +++ /dev/null @@ -1,370 +0,0 @@ -/* - * Copyright (c) 2000, 2002 - 2008 Apple Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ -/*- - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)stdlib.h 8.5 (Berkeley) 5/19/95 - */ - -#ifndef _STDLIB_H_ -#define _STDLIB_H_ - -#include -#include - -#include <_types.h> -#if !defined(_ANSI_SOURCE) -#include -#if (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)) -#include -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ -#endif /* !_ANSI_SOURCE */ - -/* DO NOT REMOVE THIS COMMENT: fixincludes needs to see: - * _GCC_SIZE_T */ -#include - -#if !defined(_ANSI_SOURCE) && (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)) -#include -#include -#endif /* !_ANSI_SOURCE && (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ - -#include - -typedef struct { - int quot; /* quotient */ - int rem; /* remainder */ -} div_t; - -typedef struct { - long quot; /* quotient */ - long rem; /* remainder */ -} ldiv_t; - -#if !__DARWIN_NO_LONG_LONG -typedef struct { - long long quot; - long long rem; -} lldiv_t; -#endif /* !__DARWIN_NO_LONG_LONG */ - -#include - -#define EXIT_FAILURE 1 -#define EXIT_SUCCESS 0 - -#define RAND_MAX 0x7fffffff - -#ifdef _USE_EXTENDED_LOCALES_ -#include <_xlocale.h> -#endif /* _USE_EXTENDED_LOCALES_ */ - -#ifndef MB_CUR_MAX -#ifdef _USE_EXTENDED_LOCALES_ -#define MB_CUR_MAX (___mb_cur_max()) -#ifndef MB_CUR_MAX_L -#define MB_CUR_MAX_L(x) (___mb_cur_max_l(x)) -#endif /* !MB_CUR_MAX_L */ -#else /* !_USE_EXTENDED_LOCALES_ */ -extern int __mb_cur_max; -#define MB_CUR_MAX __mb_cur_max -#endif /* _USE_EXTENDED_LOCALES_ */ -#endif /* MB_CUR_MAX */ - -#if !defined(_ANSI_SOURCE) && (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)) \ - && defined(_USE_EXTENDED_LOCALES_) && !defined(MB_CUR_MAX_L) -#define MB_CUR_MAX_L(x) (___mb_cur_max_l(x)) -#endif - -#include - -__BEGIN_DECLS -void abort(void) __cold __dead2; -int abs(int) __pure2; -int atexit(void (* _Nonnull)(void)); -double atof(const char *); -int atoi(const char *); -long atol(const char *); -#if !__DARWIN_NO_LONG_LONG -long long - atoll(const char *); -#endif /* !__DARWIN_NO_LONG_LONG */ -void *bsearch(const void *__key, const void *__base, size_t __nel, - size_t __width, int (* _Nonnull __compar)(const void *, const void *)); -/* calloc is now declared in _malloc.h */ -div_t div(int, int) __pure2; -void exit(int) __dead2; -/* free is now declared in _malloc.h */ -char *getenv(const char *); -long labs(long) __pure2; -ldiv_t ldiv(long, long) __pure2; -#if !__DARWIN_NO_LONG_LONG -long long - llabs(long long); -lldiv_t lldiv(long long, long long); -#endif /* !__DARWIN_NO_LONG_LONG */ -/* malloc is now declared in _malloc.h */ -int mblen(const char *__s, size_t __n); -size_t mbstowcs(wchar_t * __restrict , const char * __restrict, size_t); -int mbtowc(wchar_t * __restrict, const char * __restrict, size_t); -/* posix_memalign is now declared in _malloc.h */ -void qsort(void *__base, size_t __nel, size_t __width, - int (* _Nonnull __compar)(const void *, const void *)); -int rand(void) __swift_unavailable("Use arc4random instead."); -/* realloc is now declared in _malloc.h */ -void srand(unsigned) __swift_unavailable("Use arc4random instead."); -double strtod(const char *, char **) __DARWIN_ALIAS(strtod); -float strtof(const char *, char **) __DARWIN_ALIAS(strtof); -long strtol(const char *__str, char **__endptr, int __base); -long double - strtold(const char *, char **); -#if !__DARWIN_NO_LONG_LONG -long long - strtoll(const char *__str, char **__endptr, int __base); -#endif /* !__DARWIN_NO_LONG_LONG */ -unsigned long - strtoul(const char *__str, char **__endptr, int __base); -#if !__DARWIN_NO_LONG_LONG -unsigned long long - strtoull(const char *__str, char **__endptr, int __base); -#endif /* !__DARWIN_NO_LONG_LONG */ - -#if TARGET_OS_EMBEDDED -#define __swift_unavailable_on(osx_msg, ios_msg) __swift_unavailable(ios_msg) -#else -#define __swift_unavailable_on(osx_msg, ios_msg) __swift_unavailable(osx_msg) -#endif - -__swift_unavailable_on("Use posix_spawn APIs or NSTask instead.", "Process spawning is unavailable") -__API_AVAILABLE(macos(10.0)) __IOS_PROHIBITED -__WATCHOS_PROHIBITED __TVOS_PROHIBITED -int system(const char *) __DARWIN_ALIAS_C(system); - -#undef __swift_unavailable_on - -size_t wcstombs(char * __restrict, const wchar_t * __restrict, size_t); -int wctomb(char *, wchar_t); - -#ifndef _ANSI_SOURCE -void _Exit(int) __dead2; -long a64l(const char *); -double drand48(void); -char *ecvt(double, int, int *__restrict, int *__restrict); /* LEGACY */ -double erand48(unsigned short[3]); -char *fcvt(double, int, int *__restrict, int *__restrict); /* LEGACY */ -char *gcvt(double, int, char *); /* LEGACY */ -int getsubopt(char **, char * const *, char **); -int grantpt(int); -#if __DARWIN_UNIX03 -char *initstate(unsigned, char *, size_t); /* no __DARWIN_ALIAS needed */ -#else /* !__DARWIN_UNIX03 */ -char *initstate(unsigned long, char *, long); -#endif /* __DARWIN_UNIX03 */ -long jrand48(unsigned short[3]) __swift_unavailable("Use arc4random instead."); -char *l64a(long); -void lcong48(unsigned short[7]); -long lrand48(void) __swift_unavailable("Use arc4random instead."); -char *mktemp(char *); -int mkstemp(char *); -long mrand48(void) __swift_unavailable("Use arc4random instead."); -long nrand48(unsigned short[3]) __swift_unavailable("Use arc4random instead."); -int posix_openpt(int); -char *ptsname(int); - -#if (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)) -int ptsname_r(int fildes, char *buffer, size_t buflen) __API_AVAILABLE(macos(10.13.4), ios(11.3), tvos(11.3), watchos(4.3)); -#endif - -int putenv(char *) __DARWIN_ALIAS(putenv); -long random(void) __swift_unavailable("Use arc4random instead."); -int rand_r(unsigned *) __swift_unavailable("Use arc4random instead."); -#if (__DARWIN_UNIX03 && !defined(_POSIX_C_SOURCE)) || defined(_DARWIN_C_SOURCE) || defined(_DARWIN_BETTER_REALPATH) -char *realpath(const char * __restrict, char * __restrict) __DARWIN_EXTSN(realpath); -#else /* (!__DARWIN_UNIX03 || _POSIX_C_SOURCE) && !_DARWIN_C_SOURCE && !_DARWIN_BETTER_REALPATH */ -char *realpath(const char * __restrict, char * __restrict) __DARWIN_ALIAS(realpath); -#endif /* (__DARWIN_UNIX03 && _POSIX_C_SOURCE) || _DARWIN_C_SOURCE || _DARWIN_BETTER_REALPATH */ -unsigned short - *seed48(unsigned short[3]); -int setenv(const char * __name, const char * __value, int __overwrite) __DARWIN_ALIAS(setenv); -#if __DARWIN_UNIX03 -void setkey(const char *) __DARWIN_ALIAS(setkey); -#else /* !__DARWIN_UNIX03 */ -int setkey(const char *); -#endif /* __DARWIN_UNIX03 */ -char *setstate(const char *); -void srand48(long); -#if __DARWIN_UNIX03 -void srandom(unsigned); -#else /* !__DARWIN_UNIX03 */ -void srandom(unsigned long); -#endif /* __DARWIN_UNIX03 */ -int unlockpt(int); -#if __DARWIN_UNIX03 -int unsetenv(const char *) __DARWIN_ALIAS(unsetenv); -#else /* !__DARWIN_UNIX03 */ -void unsetenv(const char *); -#endif /* __DARWIN_UNIX03 */ -#endif /* !_ANSI_SOURCE */ - -#if !defined(_ANSI_SOURCE) && (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)) -#include -#include -#include -#include <_types/_uint32_t.h> - -uint32_t arc4random(void); -void arc4random_addrandom(unsigned char * /*dat*/, int /*datlen*/) - __OSX_DEPRECATED(10.0, 10.12, "use arc4random_stir") - __IOS_DEPRECATED(2.0, 10.0, "use arc4random_stir") - __TVOS_DEPRECATED(2.0, 10.0, "use arc4random_stir") - __WATCHOS_DEPRECATED(1.0, 3.0, "use arc4random_stir"); -void arc4random_buf(void * __buf, size_t __nbytes) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); -void arc4random_stir(void); -uint32_t - arc4random_uniform(uint32_t __upper_bound) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); -#ifdef __BLOCKS__ -int atexit_b(void (^ _Nonnull)(void)) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2); -void *bsearch_b(const void *__key, const void *__base, size_t __nel, - size_t __width, int (^ _Nonnull __compar)(const void *, const void *)) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2); -#endif /* __BLOCKS__ */ - - /* getcap(3) functions */ -char *cgetcap(char *, const char *, int); -int cgetclose(void); -int cgetent(char **, char **, const char *); -int cgetfirst(char **, char **); -int cgetmatch(const char *, const char *); -int cgetnext(char **, char **); -int cgetnum(char *, const char *, long *); -int cgetset(const char *); -int cgetstr(char *, const char *, char **); -int cgetustr(char *, const char *, char **); - -int daemon(int, int) __DARWIN_1050(daemon) __OSX_AVAILABLE_BUT_DEPRECATED_MSG(__MAC_10_0, __MAC_10_5, __IPHONE_2_0, __IPHONE_2_0, "Use posix_spawn APIs instead.") __WATCHOS_PROHIBITED __TVOS_PROHIBITED; -char *devname(dev_t, mode_t); -char *devname_r(dev_t, mode_t, char *buf, int len); -char *getbsize(int *, long *); -int getloadavg(double [], int); -const char - *getprogname(void); -void setprogname(const char *); - -#ifdef __BLOCKS__ -#if __has_attribute(noescape) -#define __sort_noescape __attribute__((__noescape__)) -#else -#define __sort_noescape -#endif -#endif /* __BLOCKS__ */ - -int heapsort(void *__base, size_t __nel, size_t __width, - int (* _Nonnull __compar)(const void *, const void *)); -#ifdef __BLOCKS__ -int heapsort_b(void *__base, size_t __nel, size_t __width, - int (^ _Nonnull __compar)(const void *, const void *) __sort_noescape) - __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2); -#endif /* __BLOCKS__ */ -int mergesort(void *__base, size_t __nel, size_t __width, - int (* _Nonnull __compar)(const void *, const void *)); -#ifdef __BLOCKS__ -int mergesort_b(void *__base, size_t __nel, size_t __width, - int (^ _Nonnull __compar)(const void *, const void *) __sort_noescape) - __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2); -#endif /* __BLOCKS__ */ -void psort(void *__base, size_t __nel, size_t __width, - int (* _Nonnull __compar)(const void *, const void *)) - __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2); -#ifdef __BLOCKS__ -void psort_b(void *__base, size_t __nel, size_t __width, - int (^ _Nonnull __compar)(const void *, const void *) __sort_noescape) - __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2); -#endif /* __BLOCKS__ */ -void psort_r(void *__base, size_t __nel, size_t __width, void *, - int (* _Nonnull __compar)(void *, const void *, const void *)) - __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2); -#ifdef __BLOCKS__ -void qsort_b(void *__base, size_t __nel, size_t __width, - int (^ _Nonnull __compar)(const void *, const void *) __sort_noescape) - __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2); -#endif /* __BLOCKS__ */ -void qsort_r(void *__base, size_t __nel, size_t __width, void *, - int (* _Nonnull __compar)(void *, const void *, const void *)); -int radixsort(const unsigned char **__base, int __nel, const unsigned char *__table, - unsigned __endbyte); -int rpmatch(const char *) - __API_AVAILABLE(macos(10.15), ios(13.0), tvos(13.0), watchos(6.0)); -int sradixsort(const unsigned char **__base, int __nel, const unsigned char *__table, - unsigned __endbyte); -void sranddev(void); -void srandomdev(void); -void *reallocf(void *__ptr, size_t __size) __alloc_size(2); -#if !__DARWIN_NO_LONG_LONG -long long - strtoq(const char *__str, char **__endptr, int __base); -unsigned long long - strtouq(const char *__str, char **__endptr, int __base); -#endif /* !__DARWIN_NO_LONG_LONG */ -extern char *suboptarg; /* getsubopt(3) external variable */ -/* valloc is now declared in _malloc.h */ -#endif /* !_ANSI_SOURCE && !_POSIX_SOURCE */ - -/* Poison the following routines if -fshort-wchar is set */ -#if !defined(__cplusplus) && defined(__WCHAR_MAX__) && __WCHAR_MAX__ <= 0xffffU -#pragma GCC poison mbstowcs mbtowc wcstombs wctomb -#endif -__END_DECLS - -#ifdef _USE_EXTENDED_LOCALES_ -#include -#endif /* _USE_EXTENDED_LOCALES_ */ - -#endif /* _STDLIB_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/string.h b/lib/libc/include/x86_64-macos-gnu/string.h deleted file mode 100644 index bca8f8c881..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/string.h +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Copyright (c) 2000, 2007, 2010 Apple Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ -/*- - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)string.h 8.1 (Berkeley) 6/2/93 - */ - -#ifndef _STRING_H_ -#define _STRING_H_ - -#include <_types.h> -#include -#include -#include -#include - -/* ANSI-C */ - -__BEGIN_DECLS -void *memchr(const void *__s, int __c, size_t __n); -int memcmp(const void *__s1, const void *__s2, size_t __n); -void *memcpy(void *__dst, const void *__src, size_t __n); -void *memmove(void *__dst, const void *__src, size_t __len); -void *memset(void *__b, int __c, size_t __len); -char *strcat(char *__s1, const char *__s2); -char *strchr(const char *__s, int __c); -int strcmp(const char *__s1, const char *__s2); -int strcoll(const char *__s1, const char *__s2); -char *strcpy(char *__dst, const char *__src); -size_t strcspn(const char *__s, const char *__charset); -char *strerror(int __errnum) __DARWIN_ALIAS(strerror); -size_t strlen(const char *__s); -char *strncat(char *__s1, const char *__s2, size_t __n); -int strncmp(const char *__s1, const char *__s2, size_t __n); -char *strncpy(char *__dst, const char *__src, size_t __n); -char *strpbrk(const char *__s, const char *__charset); -char *strrchr(const char *__s, int __c); -size_t strspn(const char *__s, const char *__charset); -char *strstr(const char *__big, const char *__little); -char *strtok(char *__str, const char *__sep); -size_t strxfrm(char *__s1, const char *__s2, size_t __n); -__END_DECLS - - - -/* Additional functionality provided by: - * POSIX.1c-1995, - * POSIX.1i-1995, - * and the omnibus ISO/IEC 9945-1: 1996 - */ - -#if __DARWIN_C_LEVEL >= 199506L -__BEGIN_DECLS -char *strtok_r(char *__str, const char *__sep, char **__lasts); -__END_DECLS -#endif /* __DARWIN_C_LEVEL >= 199506L */ - - - -/* Additional functionality provided by: - * POSIX.1-2001 - */ - -#if __DARWIN_C_LEVEL >= 200112L -__BEGIN_DECLS -int strerror_r(int __errnum, char *__strerrbuf, size_t __buflen); -char *strdup(const char *__s1); -void *memccpy(void *__dst, const void *__src, int __c, size_t __n); -__END_DECLS -#endif /* __DARWIN_C_LEVEL >= 200112L */ - - - -/* Additional functionality provided by: - * POSIX.1-2008 - */ - -#if __DARWIN_C_LEVEL >= 200809L -__BEGIN_DECLS -char *stpcpy(char *__dst, const char *__src); -char *stpncpy(char *__dst, const char *__src, size_t __n) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); -char *strndup(const char *__s1, size_t __n) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); -size_t strnlen(const char *__s1, size_t __n) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); -char *strsignal(int __sig); -__END_DECLS -#endif /* __DARWIN_C_LEVEL >= 200809L */ - -/* C11 Annex K */ - -#if defined(__STDC_WANT_LIB_EXT1__) && __STDC_WANT_LIB_EXT1__ >= 1 -#include -#include - -__BEGIN_DECLS -errno_t memset_s(void *__s, rsize_t __smax, int __c, rsize_t __n) __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0); -__END_DECLS -#endif - -/* Darwin extensions */ - -#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL -#include - -__BEGIN_DECLS -void *memmem(const void *__big, size_t __big_len, const void *__little, size_t __little_len) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); -void memset_pattern4(void *__b, const void *__pattern4, size_t __len) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_3_0); -void memset_pattern8(void *__b, const void *__pattern8, size_t __len) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_3_0); -void memset_pattern16(void *__b, const void *__pattern16, size_t __len) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_3_0); - -char *strcasestr(const char *__big, const char *__little); -char *strnstr(const char *__big, const char *__little, size_t __len); -size_t strlcat(char *__dst, const char *__source, size_t __size); -size_t strlcpy(char *__dst, const char *__source, size_t __size); -void strmode(int __mode, char *__bp); -char *strsep(char **__stringp, const char *__delim); - -/* SUS places swab() in unistd.h. It is listed here for source compatibility */ -void swab(const void * __restrict, void * __restrict, ssize_t); - -__OSX_AVAILABLE(10.12.1) __IOS_AVAILABLE(10.1) -__TVOS_AVAILABLE(10.0.1) __WATCHOS_AVAILABLE(3.1) -int timingsafe_bcmp(const void *__b1, const void *__b2, size_t __len); -__END_DECLS - -/* Some functions historically defined in string.h were placed in strings.h - * by SUS. We are using "strings.h" instead of to avoid an issue - * where /Developer/Headers/FlatCarbon/Strings.h could be included instead on - * case-insensitive file systems. - */ -#include "strings.h" -#endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ - - -#ifdef _USE_EXTENDED_LOCALES_ -#include -#endif /* _USE_EXTENDED_LOCALES_ */ - -#if defined (__GNUC__) && _FORTIFY_SOURCE > 0 && !defined (__cplusplus) -/* Security checking functions. */ -#include -#endif - -#endif /* _STRING_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/_pthread/_pthread_attr_t.h b/lib/libc/include/x86_64-macos-gnu/sys/_pthread/_pthread_attr_t.h deleted file mode 100644 index a71842cb99..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/_pthread/_pthread_attr_t.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2003-2012 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -#ifndef _PTHREAD_ATTR_T -#define _PTHREAD_ATTR_T -#include /* __darwin_pthread_attr_t */ -typedef __darwin_pthread_attr_t pthread_attr_t; -#endif /* _PTHREAD_ATTR_T */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/_pthread/_pthread_cond_t.h b/lib/libc/include/x86_64-macos-gnu/sys/_pthread/_pthread_cond_t.h deleted file mode 100644 index 3eceff6274..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/_pthread/_pthread_cond_t.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2003-2012 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -#ifndef _PTHREAD_COND_T -#define _PTHREAD_COND_T -#include /* __darwin_pthread_cond_t */ -typedef __darwin_pthread_cond_t pthread_cond_t; -#endif /* _PTHREAD_COND_T */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/_pthread/_pthread_condattr_t.h b/lib/libc/include/x86_64-macos-gnu/sys/_pthread/_pthread_condattr_t.h deleted file mode 100644 index 7fd62badd7..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/_pthread/_pthread_condattr_t.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2003-2012 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -#ifndef _PTHREAD_CONDATTR_T -#define _PTHREAD_CONDATTR_T -#include /* __darwin_pthread_condattr_t */ -typedef __darwin_pthread_condattr_t pthread_condattr_t; -#endif /* _PTHREAD_CONDATTR_T */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/_pthread/_pthread_rwlock_t.h b/lib/libc/include/x86_64-macos-gnu/sys/_pthread/_pthread_rwlock_t.h deleted file mode 100644 index dc1f013f3b..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/_pthread/_pthread_rwlock_t.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2003-2012 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -#ifndef _PTHREAD_RWLOCK_T -#define _PTHREAD_RWLOCK_T -#include /* __darwin_pthread_rwlock_t */ -typedef __darwin_pthread_rwlock_t pthread_rwlock_t; -#endif /* _PTHREAD_RWLOCK_T */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/_pthread/_pthread_rwlockattr_t.h b/lib/libc/include/x86_64-macos-gnu/sys/_pthread/_pthread_rwlockattr_t.h deleted file mode 100644 index 99fda712f4..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/_pthread/_pthread_rwlockattr_t.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2003-2012 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -#ifndef _PTHREAD_RWLOCKATTR_T -#define _PTHREAD_RWLOCKATTR_T -#include /* __darwin_pthread_rwlockattr_t */ -typedef __darwin_pthread_rwlockattr_t pthread_rwlockattr_t; -#endif /* _PTHREAD_RWLOCKATTR_T */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/_pthread/_pthread_t.h b/lib/libc/include/x86_64-macos-gnu/sys/_pthread/_pthread_t.h deleted file mode 100644 index 87f42ee9aa..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/_pthread/_pthread_t.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2003-2012 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -#ifndef _PTHREAD_T -#define _PTHREAD_T -#include /* __darwin_pthread_t */ -typedef __darwin_pthread_t pthread_t; -#endif /* _PTHREAD_T */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/_pthread/_pthread_types.h b/lib/libc/include/x86_64-macos-gnu/sys/_pthread/_pthread_types.h deleted file mode 100644 index 7aa42bdff1..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/_pthread/_pthread_types.h +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (c) 2003-2013 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ - -#ifndef _SYS__PTHREAD_TYPES_H_ -#define _SYS__PTHREAD_TYPES_H_ - -#include - -// pthread opaque structures -#if defined(__LP64__) -#define __PTHREAD_SIZE__ 8176 -#define __PTHREAD_ATTR_SIZE__ 56 -#define __PTHREAD_MUTEXATTR_SIZE__ 8 -#define __PTHREAD_MUTEX_SIZE__ 56 -#define __PTHREAD_CONDATTR_SIZE__ 8 -#define __PTHREAD_COND_SIZE__ 40 -#define __PTHREAD_ONCE_SIZE__ 8 -#define __PTHREAD_RWLOCK_SIZE__ 192 -#define __PTHREAD_RWLOCKATTR_SIZE__ 16 -#else // !__LP64__ -#define __PTHREAD_SIZE__ 4088 -#define __PTHREAD_ATTR_SIZE__ 36 -#define __PTHREAD_MUTEXATTR_SIZE__ 8 -#define __PTHREAD_MUTEX_SIZE__ 40 -#define __PTHREAD_CONDATTR_SIZE__ 4 -#define __PTHREAD_COND_SIZE__ 24 -#define __PTHREAD_ONCE_SIZE__ 4 -#define __PTHREAD_RWLOCK_SIZE__ 124 -#define __PTHREAD_RWLOCKATTR_SIZE__ 12 -#endif // !__LP64__ - -struct __darwin_pthread_handler_rec { - void (*__routine)(void *); // Routine to call - void *__arg; // Argument to pass - struct __darwin_pthread_handler_rec *__next; -}; - -struct _opaque_pthread_attr_t { - long __sig; - char __opaque[__PTHREAD_ATTR_SIZE__]; -}; - -struct _opaque_pthread_cond_t { - long __sig; - char __opaque[__PTHREAD_COND_SIZE__]; -}; - -struct _opaque_pthread_condattr_t { - long __sig; - char __opaque[__PTHREAD_CONDATTR_SIZE__]; -}; - -struct _opaque_pthread_mutex_t { - long __sig; - char __opaque[__PTHREAD_MUTEX_SIZE__]; -}; - -struct _opaque_pthread_mutexattr_t { - long __sig; - char __opaque[__PTHREAD_MUTEXATTR_SIZE__]; -}; - -struct _opaque_pthread_once_t { - long __sig; - char __opaque[__PTHREAD_ONCE_SIZE__]; -}; - -struct _opaque_pthread_rwlock_t { - long __sig; - char __opaque[__PTHREAD_RWLOCK_SIZE__]; -}; - -struct _opaque_pthread_rwlockattr_t { - long __sig; - char __opaque[__PTHREAD_RWLOCKATTR_SIZE__]; -}; - -struct _opaque_pthread_t { - long __sig; - struct __darwin_pthread_handler_rec *__cleanup_stack; - char __opaque[__PTHREAD_SIZE__]; -}; - -typedef struct _opaque_pthread_attr_t __darwin_pthread_attr_t; -typedef struct _opaque_pthread_cond_t __darwin_pthread_cond_t; -typedef struct _opaque_pthread_condattr_t __darwin_pthread_condattr_t; -typedef unsigned long __darwin_pthread_key_t; -typedef struct _opaque_pthread_mutex_t __darwin_pthread_mutex_t; -typedef struct _opaque_pthread_mutexattr_t __darwin_pthread_mutexattr_t; -typedef struct _opaque_pthread_once_t __darwin_pthread_once_t; -typedef struct _opaque_pthread_rwlock_t __darwin_pthread_rwlock_t; -typedef struct _opaque_pthread_rwlockattr_t __darwin_pthread_rwlockattr_t; -typedef struct _opaque_pthread_t *__darwin_pthread_t; - -#endif // _SYS__PTHREAD_TYPES_H_ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/_select.h b/lib/libc/include/x86_64-macos-gnu/sys/_select.h deleted file mode 100644 index 70842ca2f5..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/_select.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2005, 2007 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ - -/* - * This is called from sys/select.h and sys/time.h for the common prototype - * of select(). Setting _DARWIN_C_SOURCE or _DARWIN_UNLIMITED_SELECT uses - * the version of select() that does not place a limit on the first argument - * (nfds). In the UNIX conformance case, values of nfds greater than - * FD_SETSIZE will return an error of EINVAL. - */ -#ifndef _SYS__SELECT_H_ -#define _SYS__SELECT_H_ - -int select(int, fd_set * __restrict, fd_set * __restrict, - fd_set * __restrict, struct timeval * __restrict) -#if defined(_DARWIN_C_SOURCE) || defined(_DARWIN_UNLIMITED_SELECT) -__DARWIN_EXTSN_C(select) -#else /* !_DARWIN_C_SOURCE && !_DARWIN_UNLIMITED_SELECT */ -# if defined(__LP64__) && !__DARWIN_NON_CANCELABLE -__DARWIN_1050(select) -# else /* !__LP64__ || __DARWIN_NON_CANCELABLE */ -__DARWIN_ALIAS_C(select) -# endif /* __LP64__ && !__DARWIN_NON_CANCELABLE */ -#endif /* _DARWIN_C_SOURCE || _DARWIN_UNLIMITED_SELECT */ -; - -#endif /* !_SYS__SELECT_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/_symbol_aliasing.h b/lib/libc/include/x86_64-macos-gnu/sys/_symbol_aliasing.h deleted file mode 100644 index 17b4d6fe37..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/_symbol_aliasing.h +++ /dev/null @@ -1,498 +0,0 @@ -/* Copyright (c) 2010 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ - -#ifndef _CDEFS_H_ -# error "Never use directly. Use instead." -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 20000 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_2_0(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_2_0(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 20100 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_2_1(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_2_1(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 20200 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_2_2(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_2_2(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 30000 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_3_0(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_3_0(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 30100 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_3_1(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_3_1(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 30200 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_3_2(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_3_2(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 40000 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_4_0(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_4_0(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 40100 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_4_1(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_4_1(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 40200 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_4_2(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_4_2(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 40300 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_4_3(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_4_3(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 50000 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_5_0(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_5_0(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 50100 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_5_1(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_5_1(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 60000 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_6_0(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_6_0(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 60100 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_6_1(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_6_1(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 70000 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_7_0(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_7_0(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 70100 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_7_1(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_7_1(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 80000 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_8_0(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_8_0(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 80100 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_8_1(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_8_1(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 80200 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_8_2(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_8_2(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 80300 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_8_3(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_8_3(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 80400 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_8_4(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_8_4(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 90000 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_9_0(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_9_0(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 90100 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_9_1(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_9_1(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 90200 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_9_2(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_9_2(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 90300 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_9_3(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_9_3(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 100000 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_10_0(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_10_0(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 100100 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_10_1(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_10_1(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 100200 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_10_2(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_10_2(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 100300 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_10_3(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_10_3(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 110000 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_11_0(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_11_0(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 110100 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_11_1(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_11_1(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 110200 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_11_2(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_11_2(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 110300 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_11_3(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_11_3(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 110400 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_11_4(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_11_4(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 120000 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_12_0(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_12_0(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 120100 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_12_1(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_12_1(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 120200 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_12_2(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_12_2(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 120300 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_12_3(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_12_3(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 120400 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_12_4(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_12_4(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 130000 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_13_0(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_13_0(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 130100 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_13_1(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_13_1(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 130200 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_13_2(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_13_2(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 130300 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_13_3(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_13_3(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 130400 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_13_4(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_13_4(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 130500 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_13_5(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_13_5(x) -#endif - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 130600 -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_13_6(x) x -#else -#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_13_6(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1000 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_0(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_0(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1010 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_1(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_1(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1020 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_2(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_2(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1030 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_3(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_3(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1040 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_4(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_4(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_5(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_5(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1060 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_6(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_6(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1070 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_7(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_7(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1080 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_8(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_8(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1090 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_9(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_9(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101000 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_10(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_10(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101002 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_10_2(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_10_2(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101003 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_10_3(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_10_3(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101100 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_11(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_11(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101102 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_11_2(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_11_2(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101103 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_11_3(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_11_3(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101104 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_11_4(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_11_4(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101200 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_12(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_12(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101201 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_12_1(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_12_1(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101202 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_12_2(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_12_2(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101204 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_12_4(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_12_4(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101300 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_13(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_13(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101301 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_13_1(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_13_1(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101302 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_13_2(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_13_2(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101304 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_13_4(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_13_4(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101400 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_14(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_14(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101401 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_14_1(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_14_1(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101404 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_14_4(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_14_4(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101405 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_14_5(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_14_5(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101406 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_14_6(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_14_6(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101500 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_15(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_15(x) -#endif - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101501 -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_15_1(x) x -#else -#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_15_1(x) -#endif \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/_types/_fd_def.h b/lib/libc/include/x86_64-macos-gnu/sys/_types/_fd_def.h deleted file mode 100644 index ec0bad4289..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/_types/_fd_def.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (c) 2003-2012 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -#ifndef _FD_SET -#define _FD_SET - -#include /* __int32_t and uintptr_t */ -#include - -/* - * Select uses bit masks of file descriptors in longs. These macros - * manipulate such bit fields (the filesystem macros use chars). The - * extra protection here is to permit application redefinition above - * the default size. - */ -#ifdef FD_SETSIZE -#define __DARWIN_FD_SETSIZE FD_SETSIZE -#else /* !FD_SETSIZE */ -#define __DARWIN_FD_SETSIZE 1024 -#endif /* FD_SETSIZE */ -#define __DARWIN_NBBY 8 /* bits in a byte */ -#define __DARWIN_NFDBITS (sizeof(__int32_t) * __DARWIN_NBBY) /* bits per mask */ -#define __DARWIN_howmany(x, y) ((((x) % (y)) == 0) ? ((x) / (y)) : (((x) / (y)) + 1)) /* # y's == x bits? */ - -__BEGIN_DECLS -typedef struct fd_set { - __int32_t fds_bits[__DARWIN_howmany(__DARWIN_FD_SETSIZE, __DARWIN_NFDBITS)]; -} fd_set; - -int __darwin_check_fd_set_overflow(int, const void *, int) __attribute__((__weak_import__)); -__END_DECLS - -__header_always_inline int -__darwin_check_fd_set(int _a, const void *_b) -{ - if ((uintptr_t)&__darwin_check_fd_set_overflow != (uintptr_t) 0) { -#if defined(_DARWIN_UNLIMITED_SELECT) || defined(_DARWIN_C_SOURCE) - return __darwin_check_fd_set_overflow(_a, _b, 1); -#else - return __darwin_check_fd_set_overflow(_a, _b, 0); -#endif - } else { - return 1; - } -} - -/* This inline avoids argument side-effect issues with FD_ISSET() */ -__header_always_inline int -__darwin_fd_isset(int _fd, const struct fd_set *_p) -{ - if (__darwin_check_fd_set(_fd, (const void *) _p)) { - return _p->fds_bits[(unsigned long)_fd / __DARWIN_NFDBITS] & ((__int32_t)(((unsigned long)1) << ((unsigned long)_fd % __DARWIN_NFDBITS))); - } - - return 0; -} - -__header_always_inline void -__darwin_fd_set(int _fd, struct fd_set *const _p) -{ - if (__darwin_check_fd_set(_fd, (const void *) _p)) { - (_p->fds_bits[(unsigned long)_fd / __DARWIN_NFDBITS] |= ((__int32_t)(((unsigned long)1) << ((unsigned long)_fd % __DARWIN_NFDBITS)))); - } -} - -__header_always_inline void -__darwin_fd_clr(int _fd, struct fd_set *const _p) -{ - if (__darwin_check_fd_set(_fd, (const void *) _p)) { - (_p->fds_bits[(unsigned long)_fd / __DARWIN_NFDBITS] &= ~((__int32_t)(((unsigned long)1) << ((unsigned long)_fd % __DARWIN_NFDBITS)))); - } -} - - -#define __DARWIN_FD_SET(n, p) __darwin_fd_set((n), (p)) -#define __DARWIN_FD_CLR(n, p) __darwin_fd_clr((n), (p)) -#define __DARWIN_FD_ISSET(n, p) __darwin_fd_isset((n), (p)) - -#if __GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ >= 3 -/* - * Use the built-in bzero function instead of the library version so that - * we do not pollute the namespace or introduce prototype warnings. - */ -#define __DARWIN_FD_ZERO(p) __builtin_bzero(p, sizeof(*(p))) -#else -#define __DARWIN_FD_ZERO(p) bzero(p, sizeof(*(p))) -#endif - -#define __DARWIN_FD_COPY(f, t) bcopy(f, t, sizeof(*(f))) -#endif /* _FD_SET */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/_types/_int8_t.h b/lib/libc/include/x86_64-macos-gnu/sys/_types/_int8_t.h deleted file mode 100644 index 15b281d533..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/_types/_int8_t.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2012 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -#ifndef _INT8_T -#define _INT8_T -typedef __signed char int8_t; -#endif /* _INT8_T */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/_types/_ucontext.h b/lib/libc/include/x86_64-macos-gnu/sys/_types/_ucontext.h deleted file mode 100644 index 1e563f4581..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/_types/_ucontext.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2003-2012 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -#ifndef _STRUCT_UCONTEXT - -#include /* __DARWIN_UNIX03 */ - -#if __DARWIN_UNIX03 -#define _STRUCT_UCONTEXT struct __darwin_ucontext -#else /* !__DARWIN_UNIX03 */ -#define _STRUCT_UCONTEXT struct ucontext -#endif /* __DARWIN_UNIX03 */ - -#include /* __darwin_size_t */ -#include /* _STRUCT_MCONTEXT */ -#include /* __darwin_sigset_t */ - -_STRUCT_UCONTEXT -{ - int uc_onstack; - __darwin_sigset_t uc_sigmask; /* signal mask used by this context */ - _STRUCT_SIGALTSTACK uc_stack; /* stack used by this context */ - _STRUCT_UCONTEXT *uc_link; /* pointer to resuming context */ - __darwin_size_t uc_mcsize; /* size of the machine context passed in */ - _STRUCT_MCONTEXT *uc_mcontext; /* pointer to machine specific context */ -#ifdef _XOPEN_SOURCE - _STRUCT_MCONTEXT __mcontext_data; -#endif /* _XOPEN_SOURCE */ -}; - -/* user context */ -typedef _STRUCT_UCONTEXT ucontext_t; /* [???] user context */ - -#endif /* _STRUCT_UCONTEXT */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/acl.h b/lib/libc/include/x86_64-macos-gnu/sys/acl.h deleted file mode 100644 index dc134613d1..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/acl.h +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Copyright (c) 2004, 2010 Apple Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * The contents of this file constitute Original Code as defined in and - * are subject to the Apple Public Source License Version 1.1 (the - * "License"). You may not use this file except in compliance with the - * License. Please obtain a copy of the License at - * http://www.apple.com/publicsource and read it before using this file. - * - * This Original Code and all software distributed under the License are - * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the - * License for the specific language governing rights and limitations - * under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - -#ifndef _SYS_ACL_H -#define _SYS_ACL_H - -#include -#include - -#define __DARWIN_ACL_READ_DATA (1<<1) -#define __DARWIN_ACL_LIST_DIRECTORY __DARWIN_ACL_READ_DATA -#define __DARWIN_ACL_WRITE_DATA (1<<2) -#define __DARWIN_ACL_ADD_FILE __DARWIN_ACL_WRITE_DATA -#define __DARWIN_ACL_EXECUTE (1<<3) -#define __DARWIN_ACL_SEARCH __DARWIN_ACL_EXECUTE -#define __DARWIN_ACL_DELETE (1<<4) -#define __DARWIN_ACL_APPEND_DATA (1<<5) -#define __DARWIN_ACL_ADD_SUBDIRECTORY __DARWIN_ACL_APPEND_DATA -#define __DARWIN_ACL_DELETE_CHILD (1<<6) -#define __DARWIN_ACL_READ_ATTRIBUTES (1<<7) -#define __DARWIN_ACL_WRITE_ATTRIBUTES (1<<8) -#define __DARWIN_ACL_READ_EXTATTRIBUTES (1<<9) -#define __DARWIN_ACL_WRITE_EXTATTRIBUTES (1<<10) -#define __DARWIN_ACL_READ_SECURITY (1<<11) -#define __DARWIN_ACL_WRITE_SECURITY (1<<12) -#define __DARWIN_ACL_CHANGE_OWNER (1<<13) -#define __DARWIN_ACL_SYNCHRONIZE (1<<20) - -#define __DARWIN_ACL_EXTENDED_ALLOW 1 -#define __DARWIN_ACL_EXTENDED_DENY 2 - -#define __DARWIN_ACL_ENTRY_INHERITED (1<<4) -#define __DARWIN_ACL_ENTRY_FILE_INHERIT (1<<5) -#define __DARWIN_ACL_ENTRY_DIRECTORY_INHERIT (1<<6) -#define __DARWIN_ACL_ENTRY_LIMIT_INHERIT (1<<7) -#define __DARWIN_ACL_ENTRY_ONLY_INHERIT (1<<8) -#define __DARWIN_ACL_FLAG_NO_INHERIT (1<<17) - -/* - * Implementation constants. - * - * The ACL_TYPE_EXTENDED binary format permits 169 entries plus - * the ACL header in a page. Give ourselves some room to grow; - * this limit is arbitrary. - */ -#define ACL_MAX_ENTRIES 128 - -/* 23.2.2 Individual object access permissions - nonstandard */ -typedef enum { - ACL_READ_DATA = __DARWIN_ACL_READ_DATA, - ACL_LIST_DIRECTORY = __DARWIN_ACL_LIST_DIRECTORY, - ACL_WRITE_DATA = __DARWIN_ACL_WRITE_DATA, - ACL_ADD_FILE = __DARWIN_ACL_ADD_FILE, - ACL_EXECUTE = __DARWIN_ACL_EXECUTE, - ACL_SEARCH = __DARWIN_ACL_SEARCH, - ACL_DELETE = __DARWIN_ACL_DELETE, - ACL_APPEND_DATA = __DARWIN_ACL_APPEND_DATA, - ACL_ADD_SUBDIRECTORY = __DARWIN_ACL_ADD_SUBDIRECTORY, - ACL_DELETE_CHILD = __DARWIN_ACL_DELETE_CHILD, - ACL_READ_ATTRIBUTES = __DARWIN_ACL_READ_ATTRIBUTES, - ACL_WRITE_ATTRIBUTES = __DARWIN_ACL_WRITE_ATTRIBUTES, - ACL_READ_EXTATTRIBUTES = __DARWIN_ACL_READ_EXTATTRIBUTES, - ACL_WRITE_EXTATTRIBUTES = __DARWIN_ACL_WRITE_EXTATTRIBUTES, - ACL_READ_SECURITY = __DARWIN_ACL_READ_SECURITY, - ACL_WRITE_SECURITY = __DARWIN_ACL_WRITE_SECURITY, - ACL_CHANGE_OWNER = __DARWIN_ACL_CHANGE_OWNER, - ACL_SYNCHRONIZE = __DARWIN_ACL_SYNCHRONIZE, -} acl_perm_t; - -/* 23.2.5 ACL entry tag type bits - nonstandard */ -typedef enum { - ACL_UNDEFINED_TAG = 0, - ACL_EXTENDED_ALLOW = __DARWIN_ACL_EXTENDED_ALLOW, - ACL_EXTENDED_DENY = __DARWIN_ACL_EXTENDED_DENY -} acl_tag_t; - -/* 23.2.6 Individual ACL types */ -typedef enum { - ACL_TYPE_EXTENDED = 0x00000100, -/* Posix 1003.1e types - not supported */ - ACL_TYPE_ACCESS = 0x00000000, - ACL_TYPE_DEFAULT = 0x00000001, -/* The following types are defined on FreeBSD/Linux - not supported */ - ACL_TYPE_AFS = 0x00000002, - ACL_TYPE_CODA = 0x00000003, - ACL_TYPE_NTFS = 0x00000004, - ACL_TYPE_NWFS = 0x00000005 -} acl_type_t; - -/* 23.2.7 ACL qualifier constants */ - -#define ACL_UNDEFINED_ID NULL /* XXX ? */ - -/* 23.2.8 ACL Entry Constants */ -typedef enum { - ACL_FIRST_ENTRY = 0, - ACL_NEXT_ENTRY = -1, - ACL_LAST_ENTRY = -2 -} acl_entry_id_t; - -/* nonstandard ACL / entry flags */ -typedef enum { - ACL_FLAG_DEFER_INHERIT = (1 << 0), /* tentative */ - ACL_FLAG_NO_INHERIT = __DARWIN_ACL_FLAG_NO_INHERIT, - ACL_ENTRY_INHERITED = __DARWIN_ACL_ENTRY_INHERITED, - ACL_ENTRY_FILE_INHERIT = __DARWIN_ACL_ENTRY_FILE_INHERIT, - ACL_ENTRY_DIRECTORY_INHERIT = __DARWIN_ACL_ENTRY_DIRECTORY_INHERIT, - ACL_ENTRY_LIMIT_INHERIT = __DARWIN_ACL_ENTRY_LIMIT_INHERIT, - ACL_ENTRY_ONLY_INHERIT = __DARWIN_ACL_ENTRY_ONLY_INHERIT -} acl_flag_t; - -/* "External" ACL types */ - -struct _acl; -struct _acl_entry; -struct _acl_permset; -struct _acl_flagset; - -typedef struct _acl *acl_t; -typedef struct _acl_entry *acl_entry_t; -typedef struct _acl_permset *acl_permset_t; -typedef struct _acl_flagset *acl_flagset_t; - -typedef u_int64_t acl_permset_mask_t; - -__BEGIN_DECLS -/* 23.1.6.1 ACL Storage Management */ -extern acl_t acl_dup(acl_t acl); -extern int acl_free(void *obj_p); -extern acl_t acl_init(int count); - -/* 23.1.6.2 (1) ACL Entry manipulation */ -extern int acl_copy_entry(acl_entry_t dest_d, acl_entry_t src_d); -extern int acl_create_entry(acl_t *acl_p, acl_entry_t *entry_p); -extern int acl_create_entry_np(acl_t *acl_p, acl_entry_t *entry_p, int entry_index); -extern int acl_delete_entry(acl_t acl, acl_entry_t entry_d); -extern int acl_get_entry(acl_t acl, int entry_id, acl_entry_t *entry_p); -extern int acl_valid(acl_t acl); -extern int acl_valid_fd_np(int fd, acl_type_t type, acl_t acl); -extern int acl_valid_file_np(const char *path, acl_type_t type, acl_t acl); -extern int acl_valid_link_np(const char *path, acl_type_t type, acl_t acl); - -/* 23.1.6.2 (2) Manipulate permissions within an ACL entry */ -extern int acl_add_perm(acl_permset_t permset_d, acl_perm_t perm); -extern int acl_calc_mask(acl_t *acl_p); /* not supported */ -extern int acl_clear_perms(acl_permset_t permset_d); -extern int acl_delete_perm(acl_permset_t permset_d, acl_perm_t perm); -extern int acl_get_perm_np(acl_permset_t permset_d, acl_perm_t perm); -extern int acl_get_permset(acl_entry_t entry_d, acl_permset_t *permset_p); -extern int acl_set_permset(acl_entry_t entry_d, acl_permset_t permset_d); - -/* nonstandard - manipulate permissions within an ACL entry using bitmasks */ -extern int acl_maximal_permset_mask_np(acl_permset_mask_t * mask_p) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); -extern int acl_get_permset_mask_np(acl_entry_t entry_d, acl_permset_mask_t * mask_p) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); -extern int acl_set_permset_mask_np(acl_entry_t entry_d, acl_permset_mask_t mask) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); - -/* nonstandard - manipulate flags on ACLs and entries */ -extern int acl_add_flag_np(acl_flagset_t flagset_d, acl_flag_t flag); -extern int acl_clear_flags_np(acl_flagset_t flagset_d); -extern int acl_delete_flag_np(acl_flagset_t flagset_d, acl_flag_t flag); -extern int acl_get_flag_np(acl_flagset_t flagset_d, acl_flag_t flag); -extern int acl_get_flagset_np(void *obj_p, acl_flagset_t *flagset_p); -extern int acl_set_flagset_np(void *obj_p, acl_flagset_t flagset_d); - -/* 23.1.6.2 (3) Manipulate ACL entry tag type and qualifier */ -extern void *acl_get_qualifier(acl_entry_t entry_d); -extern int acl_get_tag_type(acl_entry_t entry_d, acl_tag_t *tag_type_p); -extern int acl_set_qualifier(acl_entry_t entry_d, const void *tag_qualifier_p); -extern int acl_set_tag_type(acl_entry_t entry_d, acl_tag_t tag_type); - -/* 23.1.6.3 ACL manipulation on an Object */ -extern int acl_delete_def_file(const char *path_p); /* not supported */ -extern acl_t acl_get_fd(int fd); -extern acl_t acl_get_fd_np(int fd, acl_type_t type); -extern acl_t acl_get_file(const char *path_p, acl_type_t type); -extern acl_t acl_get_link_np(const char *path_p, acl_type_t type); -extern int acl_set_fd(int fd, acl_t acl); -extern int acl_set_fd_np(int fd, acl_t acl, acl_type_t acl_type); -extern int acl_set_file(const char *path_p, acl_type_t type, acl_t acl); -extern int acl_set_link_np(const char *path_p, acl_type_t type, acl_t acl); - -/* 23.1.6.4 ACL Format translation */ -extern ssize_t acl_copy_ext(void *buf_p, acl_t acl, ssize_t size); -extern ssize_t acl_copy_ext_native(void *buf_p, acl_t acl, ssize_t size); -extern acl_t acl_copy_int(const void *buf_p); -extern acl_t acl_copy_int_native(const void *buf_p); -extern acl_t acl_from_text(const char *buf_p); -extern ssize_t acl_size(acl_t acl); -extern char *acl_to_text(acl_t acl, ssize_t *len_p); -__END_DECLS - -#endif /* _SYS_ACL_H */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/attr.h b/lib/libc/include/x86_64-macos-gnu/sys/attr.h deleted file mode 100644 index 7de047ec5b..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/attr.h +++ /dev/null @@ -1,579 +0,0 @@ -/* - * Copyright (c) 2000-2018 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ - -/* - * attr.h - attribute data structures and interfaces - * - * Copyright (c) 1998, Apple Computer, Inc. All Rights Reserved. - */ - -#ifndef _SYS_ATTR_H_ -#define _SYS_ATTR_H_ - -#include - -#ifdef __APPLE_API_UNSTABLE -#include -#include -#include -#include - -#define FSOPT_NOFOLLOW 0x00000001 -#define FSOPT_NOINMEMUPDATE 0x00000002 -#define FSOPT_REPORT_FULLSIZE 0x00000004 -/* The following option only valid when requesting ATTR_CMN_RETURNED_ATTRS */ -#define FSOPT_PACK_INVAL_ATTRS 0x00000008 - - -#define FSOPT_ATTR_CMN_EXTENDED 0x00000020 - -/* we currently aren't anywhere near this amount for a valid - * fssearchblock.sizeofsearchparams1 or fssearchblock.sizeofsearchparams2 - * but we put a sanity check in to avoid abuse of the value passed in from - * user land. - */ -#define SEARCHFS_MAX_SEARCHPARMS 4096 - -typedef u_int32_t text_encoding_t; - -typedef u_int32_t fsobj_type_t; - -typedef u_int32_t fsobj_tag_t; - -typedef u_int32_t fsfile_type_t; - -typedef u_int32_t fsvolid_t; - -#include /* file object id type */ - -typedef u_int32_t attrgroup_t; - -struct attrlist { - u_short bitmapcount; /* number of attr. bit sets in list (should be 5) */ - u_int16_t reserved; /* (to maintain 4-byte alignment) */ - attrgroup_t commonattr; /* common attribute group */ - attrgroup_t volattr; /* Volume attribute group */ - attrgroup_t dirattr; /* directory attribute group */ - attrgroup_t fileattr; /* file attribute group */ - attrgroup_t forkattr; /* fork attribute group */ -}; -#define ATTR_BIT_MAP_COUNT 5 - -typedef struct attribute_set { - attrgroup_t commonattr; /* common attribute group */ - attrgroup_t volattr; /* Volume attribute group */ - attrgroup_t dirattr; /* directory attribute group */ - attrgroup_t fileattr; /* file attribute group */ - attrgroup_t forkattr; /* fork attribute group */ -} attribute_set_t; - -typedef struct attrreference { - int32_t attr_dataoffset; - u_int32_t attr_length; -} attrreference_t; - -/* XXX PPD This is derived from HFSVolumePriv.h and should perhaps be referenced from there? */ - -struct diskextent { - u_int32_t startblock; /* first block allocated */ - u_int32_t blockcount; /* number of blocks allocated */ -}; - -typedef struct diskextent extentrecord[8]; - -typedef u_int32_t vol_capabilities_set_t[4]; - -#define VOL_CAPABILITIES_FORMAT 0 -#define VOL_CAPABILITIES_INTERFACES 1 -#define VOL_CAPABILITIES_RESERVED1 2 -#define VOL_CAPABILITIES_RESERVED2 3 - -typedef struct vol_capabilities_attr { - vol_capabilities_set_t capabilities; - vol_capabilities_set_t valid; -} vol_capabilities_attr_t; - -/* - * XXX this value needs to be raised - 3893388 - */ -#define ATTR_MAX_BUFFER 8192 - -/* - * VOL_CAP_FMT_PERSISTENTOBJECTIDS: When set, the volume has object IDs - * that are persistent (retain their values even when the volume is - * unmounted and remounted), and a file or directory can be looked up - * by ID. Volumes that support VolFS and can support Carbon File ID - * references should set this bit. - * - * VOL_CAP_FMT_SYMBOLICLINKS: When set, the volume supports symbolic - * links. The symlink(), readlink(), and lstat() calls all use this - * symbolic link. - * - * VOL_CAP_FMT_HARDLINKS: When set, the volume supports hard links. - * The link() call creates hard links. - * - * VOL_CAP_FMT_JOURNAL: When set, the volume is capable of supporting - * a journal used to speed recovery in case of unplanned shutdown - * (such as a power outage or crash). This bit does not necessarily - * mean the volume is actively using a journal for recovery. - * - * VOL_CAP_FMT_JOURNAL_ACTIVE: When set, the volume is currently using - * a journal for use in speeding recovery after an unplanned shutdown. - * This bit can be set only if VOL_CAP_FMT_JOURNAL is also set. - * - * VOL_CAP_FMT_NO_ROOT_TIMES: When set, the volume format does not - * store reliable times for the root directory, so you should not - * depend on them to detect changes, etc. - * - * VOL_CAP_FMT_SPARSE_FILES: When set, the volume supports sparse files. - * That is, files which can have "holes" that have never been written - * to, and are not allocated on disk. Sparse files may have an - * allocated size that is less than the file's logical length. - * - * VOL_CAP_FMT_ZERO_RUNS: For security reasons, parts of a file (runs) - * that have never been written to must appear to contain zeroes. When - * this bit is set, the volume keeps track of allocated but unwritten - * runs of a file so that it can substitute zeroes without actually - * writing zeroes to the media. This provides performance similar to - * sparse files, but not the space savings. - * - * VOL_CAP_FMT_CASE_SENSITIVE: When set, file and directory names are - * case sensitive (upper and lower case are different). When clear, - * an upper case character is equivalent to a lower case character, - * and you can't have two names that differ solely in the case of - * the characters. - * - * VOL_CAP_FMT_CASE_PRESERVING: When set, file and directory names - * preserve the difference between upper and lower case. If clear, - * the volume may change the case of some characters (typically - * making them all upper or all lower case). A volume that sets - * VOL_CAP_FMT_CASE_SENSITIVE should also set VOL_CAP_FMT_CASE_PRESERVING. - * - * VOL_CAP_FMT_FAST_STATFS: This bit is used as a hint to upper layers - * (especially Carbon) that statfs() is fast enough that its results - * need not be cached by those upper layers. A volume that caches - * the statfs information in its in-memory structures should set this bit. - * A volume that must always read from disk or always perform a network - * transaction should not set this bit. - * - * VOL_CAP_FMT_2TB_FILESIZE: If this bit is set the volume format supports - * file sizes larger than 4GB, and potentially up to 2TB; it does not - * indicate whether the filesystem supports files larger than that. - * - * VOL_CAP_FMT_OPENDENYMODES: When set, the volume supports open deny - * modes (e.g. "open for read write, deny write"; effectively, mandatory - * file locking based on open modes). - * - * VOL_CAP_FMT_HIDDEN_FILES: When set, the volume supports the UF_HIDDEN - * file flag, and the UF_HIDDEN flag is mapped to that volume's native - * "hidden" or "invisible" bit (which may be the invisible bit from the - * Finder Info extended attribute). - * - * VOL_CAP_FMT_PATH_FROM_ID: When set, the volume supports the ability - * to derive a pathname to the root of the file system given only the - * id of an object. This also implies that object ids on this file - * system are persistent and not recycled. This is a very specialized - * capability and it is assumed that most file systems will not support - * it. Its use is for legacy non-posix APIs like ResolveFileIDRef. - * - * VOL_CAP_FMT_NO_VOLUME_SIZES: When set, the volume does not support - * returning values for total data blocks, available blocks, or free blocks - * (as in f_blocks, f_bavail, or f_bfree in "struct statfs"). Historically, - * those values were set to 0xFFFFFFFF for volumes that did not support them. - * - * VOL_CAP_FMT_DECMPFS_COMPRESSION: When set, the volume supports transparent - * decompression of compressed files using decmpfs. - * - * VOL_CAP_FMT_64BIT_OBJECT_IDS: When set, the volume uses object IDs that - * are 64-bit. This means that ATTR_CMN_FILEID and ATTR_CMN_PARENTID are the - * only legitimate attributes for obtaining object IDs from this volume and the - * 32-bit fid_objno fields of the fsobj_id_t returned by ATTR_CMN_OBJID, - * ATTR_CMN_OBJPERMID, and ATTR_CMN_PAROBJID are undefined. - * - * VOL_CAP_FMT_DIR_HARDLINKS: When set, the volume supports directory - * hard links. - * - * VOL_CAP_FMT_DOCUMENT_ID: When set, the volume supports document IDs - * (an ID which persists across object ID changes) for document revisions. - * - * VOL_CAP_FMT_WRITE_GENERATION_COUNT: When set, the volume supports write - * generation counts (a count of how many times an object has been modified) - * - * VOL_CAP_FMT_NO_IMMUTABLE_FILES: When set, the volume does not support - * setting the UF_IMMUTABLE flag. - * - * VOL_CAP_FMT_NO_PERMISSIONS: When set, the volume does not support setting - * permissions. - * - * VOL_CAP_FMT_SHARED_SPACE: When set, the volume supports sharing space with - * other filesystems i.e. multiple logical filesystems can exist in the same - * "partition". An implication of this is that the filesystem which sets - * this capability treats waitfor arguments to VFS_SYNC as bit flags. - * - * VOL_CAP_FMT_VOL_GROUPS: When set, this volume is part of a volume-group - * that implies multiple volumes must be mounted in order to boot and root the - * operating system. Typically, this means a read-only system volume and a - * writable data volume. - */ -#define VOL_CAP_FMT_PERSISTENTOBJECTIDS 0x00000001 -#define VOL_CAP_FMT_SYMBOLICLINKS 0x00000002 -#define VOL_CAP_FMT_HARDLINKS 0x00000004 -#define VOL_CAP_FMT_JOURNAL 0x00000008 -#define VOL_CAP_FMT_JOURNAL_ACTIVE 0x00000010 -#define VOL_CAP_FMT_NO_ROOT_TIMES 0x00000020 -#define VOL_CAP_FMT_SPARSE_FILES 0x00000040 -#define VOL_CAP_FMT_ZERO_RUNS 0x00000080 -#define VOL_CAP_FMT_CASE_SENSITIVE 0x00000100 -#define VOL_CAP_FMT_CASE_PRESERVING 0x00000200 -#define VOL_CAP_FMT_FAST_STATFS 0x00000400 -#define VOL_CAP_FMT_2TB_FILESIZE 0x00000800 -#define VOL_CAP_FMT_OPENDENYMODES 0x00001000 -#define VOL_CAP_FMT_HIDDEN_FILES 0x00002000 -#define VOL_CAP_FMT_PATH_FROM_ID 0x00004000 -#define VOL_CAP_FMT_NO_VOLUME_SIZES 0x00008000 -#define VOL_CAP_FMT_DECMPFS_COMPRESSION 0x00010000 -#define VOL_CAP_FMT_64BIT_OBJECT_IDS 0x00020000 -#define VOL_CAP_FMT_DIR_HARDLINKS 0x00040000 -#define VOL_CAP_FMT_DOCUMENT_ID 0x00080000 -#define VOL_CAP_FMT_WRITE_GENERATION_COUNT 0x00100000 -#define VOL_CAP_FMT_NO_IMMUTABLE_FILES 0x00200000 -#define VOL_CAP_FMT_NO_PERMISSIONS 0x00400000 -#define VOL_CAP_FMT_SHARED_SPACE 0x00800000 -#define VOL_CAP_FMT_VOL_GROUPS 0x01000000 - -/* - * VOL_CAP_INT_SEARCHFS: When set, the volume implements the - * searchfs() system call (the vnop_searchfs vnode operation). - * - * VOL_CAP_INT_ATTRLIST: When set, the volume implements the - * getattrlist() and setattrlist() system calls (vnop_getattrlist - * and vnop_setattrlist vnode operations) for the volume, files, - * and directories. The volume may or may not implement the - * readdirattr() system call. XXX Is there any minimum set - * of attributes that should be supported? To determine the - * set of supported attributes, get the ATTR_VOL_ATTRIBUTES - * attribute of the volume. - * - * VOL_CAP_INT_NFSEXPORT: When set, the volume implements exporting - * of NFS volumes. - * - * VOL_CAP_INT_READDIRATTR: When set, the volume implements the - * readdirattr() system call (vnop_readdirattr vnode operation). - * - * VOL_CAP_INT_EXCHANGEDATA: When set, the volume implements the - * exchangedata() system call (VNOP_EXCHANGE vnode operation). - * - * VOL_CAP_INT_COPYFILE: When set, the volume implements the - * VOP_COPYFILE vnode operation. (XXX There should be a copyfile() - * system call in .) - * - * VOL_CAP_INT_ALLOCATE: When set, the volume implements the - * VNOP_ALLOCATE vnode operation, which means it implements the - * F_PREALLOCATE selector of fcntl(2). - * - * VOL_CAP_INT_VOL_RENAME: When set, the volume implements the - * ATTR_VOL_NAME attribute for both getattrlist() and setattrlist(). - * The volume can be renamed by setting ATTR_VOL_NAME with setattrlist(). - * - * VOL_CAP_INT_ADVLOCK: When set, the volume implements POSIX style - * byte range locks via vnop_advlock (accessible from fcntl(2)). - * - * VOL_CAP_INT_FLOCK: When set, the volume implements whole-file flock(2) - * style locks via vnop_advlock. This includes the O_EXLOCK and O_SHLOCK - * flags of the open(2) call. - * - * VOL_CAP_INT_EXTENDED_SECURITY: When set, the volume implements - * extended security (ACLs). - * - * VOL_CAP_INT_USERACCESS: When set, the volume supports the - * ATTR_CMN_USERACCESS attribute (used to get the user's access - * mode to the file). - * - * VOL_CAP_INT_MANLOCK: When set, the volume supports AFP-style - * mandatory byte range locks via an ioctl(). - * - * VOL_CAP_INT_EXTENDED_ATTR: When set, the volume implements - * native extended attribues. - * - * VOL_CAP_INT_NAMEDSTREAMS: When set, the volume supports - * native named streams. - * - * VOL_CAP_INT_CLONE: When set, the volume supports clones. - * - * VOL_CAP_INT_SNAPSHOT: When set, the volume supports snapshots. - * - * VOL_CAP_INT_RENAME_SWAP: When set, the volume supports swapping - * file system objects. - * - * VOL_CAP_INT_RENAME_EXCL: When set, the volume supports an - * exclusive rename operation. - * - * VOL_CAP_INT_RENAME_OPENFAIL: When set, the volume may fail rename - * operations on files that are open. - */ -#define VOL_CAP_INT_SEARCHFS 0x00000001 -#define VOL_CAP_INT_ATTRLIST 0x00000002 -#define VOL_CAP_INT_NFSEXPORT 0x00000004 -#define VOL_CAP_INT_READDIRATTR 0x00000008 -#define VOL_CAP_INT_EXCHANGEDATA 0x00000010 -#define VOL_CAP_INT_COPYFILE 0x00000020 -#define VOL_CAP_INT_ALLOCATE 0x00000040 -#define VOL_CAP_INT_VOL_RENAME 0x00000080 -#define VOL_CAP_INT_ADVLOCK 0x00000100 -#define VOL_CAP_INT_FLOCK 0x00000200 -#define VOL_CAP_INT_EXTENDED_SECURITY 0x00000400 -#define VOL_CAP_INT_USERACCESS 0x00000800 -#define VOL_CAP_INT_MANLOCK 0x00001000 -#define VOL_CAP_INT_NAMEDSTREAMS 0x00002000 -#define VOL_CAP_INT_EXTENDED_ATTR 0x00004000 -#define VOL_CAP_INT_CLONE 0x00010000 -#define VOL_CAP_INT_SNAPSHOT 0x00020000 -#define VOL_CAP_INT_RENAME_SWAP 0x00040000 -#define VOL_CAP_INT_RENAME_EXCL 0x00080000 -#define VOL_CAP_INT_RENAME_OPENFAIL 0x00100000 - -typedef struct vol_attributes_attr { - attribute_set_t validattr; - attribute_set_t nativeattr; -} vol_attributes_attr_t; - -#define ATTR_CMN_NAME 0x00000001 -#define ATTR_CMN_DEVID 0x00000002 -#define ATTR_CMN_FSID 0x00000004 -#define ATTR_CMN_OBJTYPE 0x00000008 -#define ATTR_CMN_OBJTAG 0x00000010 -#define ATTR_CMN_OBJID 0x00000020 -#define ATTR_CMN_OBJPERMANENTID 0x00000040 -#define ATTR_CMN_PAROBJID 0x00000080 -#define ATTR_CMN_SCRIPT 0x00000100 -#define ATTR_CMN_CRTIME 0x00000200 -#define ATTR_CMN_MODTIME 0x00000400 -#define ATTR_CMN_CHGTIME 0x00000800 -#define ATTR_CMN_ACCTIME 0x00001000 -#define ATTR_CMN_BKUPTIME 0x00002000 -#define ATTR_CMN_FNDRINFO 0x00004000 -#define ATTR_CMN_OWNERID 0x00008000 -#define ATTR_CMN_GRPID 0x00010000 -#define ATTR_CMN_ACCESSMASK 0x00020000 -#define ATTR_CMN_FLAGS 0x00040000 - -/* The following were defined as: */ -/* #define ATTR_CMN_NAMEDATTRCOUNT 0x00080000 */ -/* #define ATTR_CMN_NAMEDATTRLIST 0x00100000 */ -/* These bits have been salvaged for use as: */ -/* #define ATTR_CMN_GEN_COUNT 0x00080000 */ -/* #define ATTR_CMN_DOCUMENT_ID 0x00100000 */ -/* They can only be used with the FSOPT_ATTR_CMN_EXTENDED */ -/* option flag. */ - -#define ATTR_CMN_GEN_COUNT 0x00080000 -#define ATTR_CMN_DOCUMENT_ID 0x00100000 - -#define ATTR_CMN_USERACCESS 0x00200000 -#define ATTR_CMN_EXTENDED_SECURITY 0x00400000 -#define ATTR_CMN_UUID 0x00800000 -#define ATTR_CMN_GRPUUID 0x01000000 -#define ATTR_CMN_FILEID 0x02000000 -#define ATTR_CMN_PARENTID 0x04000000 -#define ATTR_CMN_FULLPATH 0x08000000 -#define ATTR_CMN_ADDEDTIME 0x10000000 -#define ATTR_CMN_ERROR 0x20000000 -#define ATTR_CMN_DATA_PROTECT_FLAGS 0x40000000 - -/* - * ATTR_CMN_RETURNED_ATTRS is only valid with getattrlist(2) and - * getattrlistbulk(2). It is always the first attribute in the return buffer. - */ -#define ATTR_CMN_RETURNED_ATTRS 0x80000000 - -#define ATTR_CMN_VALIDMASK 0xFFFFFFFF -/* - * The settable ATTR_CMN_* attributes include the following: - * ATTR_CMN_SCRIPT - * ATTR_CMN_CRTIME - * ATTR_CMN_MODTIME - * ATTR_CMN_CHGTIME - * - * ATTR_CMN_ACCTIME - * ATTR_CMN_BKUPTIME - * ATTR_CMN_FNDRINFO - * ATTR_CMN_OWNERID - * - * ATTR_CMN_GRPID - * ATTR_CMN_ACCESSMASK - * ATTR_CMN_FLAGS - * - * ATTR_CMN_EXTENDED_SECURITY - * ATTR_CMN_UUID - * - * ATTR_CMN_GRPUUID - * - * ATTR_CMN_DATA_PROTECT_FLAGS - */ -#define ATTR_CMN_SETMASK 0x51C7FF00 -#define ATTR_CMN_VOLSETMASK 0x00006700 - -#define ATTR_VOL_FSTYPE 0x00000001 -#define ATTR_VOL_SIGNATURE 0x00000002 -#define ATTR_VOL_SIZE 0x00000004 -#define ATTR_VOL_SPACEFREE 0x00000008 -#define ATTR_VOL_SPACEAVAIL 0x00000010 -#define ATTR_VOL_MINALLOCATION 0x00000020 -#define ATTR_VOL_ALLOCATIONCLUMP 0x00000040 -#define ATTR_VOL_IOBLOCKSIZE 0x00000080 -#define ATTR_VOL_OBJCOUNT 0x00000100 -#define ATTR_VOL_FILECOUNT 0x00000200 -#define ATTR_VOL_DIRCOUNT 0x00000400 -#define ATTR_VOL_MAXOBJCOUNT 0x00000800 -#define ATTR_VOL_MOUNTPOINT 0x00001000 -#define ATTR_VOL_NAME 0x00002000 -#define ATTR_VOL_MOUNTFLAGS 0x00004000 -#define ATTR_VOL_MOUNTEDDEVICE 0x00008000 -#define ATTR_VOL_ENCODINGSUSED 0x00010000 -#define ATTR_VOL_CAPABILITIES 0x00020000 -#define ATTR_VOL_UUID 0x00040000 -#define ATTR_VOL_QUOTA_SIZE 0x10000000 -#define ATTR_VOL_RESERVED_SIZE 0x20000000 -#define ATTR_VOL_ATTRIBUTES 0x40000000 -#define ATTR_VOL_INFO 0x80000000 - -#define ATTR_VOL_VALIDMASK 0xF007FFFF - -/* - * The list of settable ATTR_VOL_* attributes include the following: - * ATTR_VOL_NAME - * ATTR_VOL_INFO - */ -#define ATTR_VOL_SETMASK 0x80002000 - - -/* File/directory attributes: */ -#define ATTR_DIR_LINKCOUNT 0x00000001 -#define ATTR_DIR_ENTRYCOUNT 0x00000002 -#define ATTR_DIR_MOUNTSTATUS 0x00000004 -#define ATTR_DIR_ALLOCSIZE 0x00000008 -#define ATTR_DIR_IOBLOCKSIZE 0x00000010 -#define ATTR_DIR_DATALENGTH 0x00000020 - -/* ATTR_DIR_MOUNTSTATUS Flags: */ -#define DIR_MNTSTATUS_MNTPOINT 0x00000001 -#define DIR_MNTSTATUS_TRIGGER 0x00000002 - -#define ATTR_DIR_VALIDMASK 0x0000003f -#define ATTR_DIR_SETMASK 0x00000000 - -#define ATTR_FILE_LINKCOUNT 0x00000001 -#define ATTR_FILE_TOTALSIZE 0x00000002 -#define ATTR_FILE_ALLOCSIZE 0x00000004 -#define ATTR_FILE_IOBLOCKSIZE 0x00000008 -#define ATTR_FILE_DEVTYPE 0x00000020 -#define ATTR_FILE_FORKCOUNT 0x00000080 -#define ATTR_FILE_FORKLIST 0x00000100 -#define ATTR_FILE_DATALENGTH 0x00000200 -#define ATTR_FILE_DATAALLOCSIZE 0x00000400 -#define ATTR_FILE_RSRCLENGTH 0x00001000 -#define ATTR_FILE_RSRCALLOCSIZE 0x00002000 - -#define ATTR_FILE_VALIDMASK 0x000037FF -/* - * Settable ATTR_FILE_* attributes include: - * ATTR_FILE_DEVTYPE - */ -#define ATTR_FILE_SETMASK 0x00000020 - -/* CMNEXT attributes extend the common attributes, but in the forkattr field */ -#define ATTR_CMNEXT_RELPATH 0x00000004 -#define ATTR_CMNEXT_PRIVATESIZE 0x00000008 -#define ATTR_CMNEXT_LINKID 0x00000010 -#define ATTR_CMNEXT_NOFIRMLINKPATH 0x00000020 -#define ATTR_CMNEXT_REALDEVID 0x00000040 -#define ATTR_CMNEXT_REALFSID 0x00000080 -#define ATTR_CMNEXT_CLONEID 0x00000100 -#define ATTR_CMNEXT_EXT_FLAGS 0x00000200 - -#define ATTR_CMNEXT_VALIDMASK 0x000003fc -#define ATTR_CMNEXT_SETMASK 0x00000000 - -/* Deprecated fork attributes */ -#define ATTR_FORK_TOTALSIZE 0x00000001 -#define ATTR_FORK_ALLOCSIZE 0x00000002 -#define ATTR_FORK_RESERVED 0xffffffff - -#define ATTR_FORK_VALIDMASK 0x00000003 -#define ATTR_FORK_SETMASK 0x00000000 - -/* Obsolete, implemented, not supported */ -#define ATTR_CMN_NAMEDATTRCOUNT 0x00080000 -#define ATTR_CMN_NAMEDATTRLIST 0x00100000 -#define ATTR_FILE_CLUMPSIZE 0x00000010 /* obsolete */ -#define ATTR_FILE_FILETYPE 0x00000040 /* always zero */ -#define ATTR_FILE_DATAEXTENTS 0x00000800 /* obsolete, HFS-specific */ -#define ATTR_FILE_RSRCEXTENTS 0x00004000 /* obsolete, HFS-specific */ - -/* Required attributes for getattrlistbulk(2) */ -#define ATTR_BULK_REQUIRED (ATTR_CMN_NAME | ATTR_CMN_RETURNED_ATTRS) - -/* - * Searchfs - */ -#define SRCHFS_START 0x00000001 -#define SRCHFS_MATCHPARTIALNAMES 0x00000002 -#define SRCHFS_MATCHDIRS 0x00000004 -#define SRCHFS_MATCHFILES 0x00000008 -#define SRCHFS_SKIPLINKS 0x00000010 -#define SRCHFS_SKIPINVISIBLE 0x00000020 -#define SRCHFS_SKIPPACKAGES 0x00000040 -#define SRCHFS_SKIPINAPPROPRIATE 0x00000080 - -#define SRCHFS_NEGATEPARAMS 0x80000000 -#define SRCHFS_VALIDOPTIONSMASK 0x800000FF - -struct fssearchblock { - struct attrlist *returnattrs; - void *returnbuffer; - size_t returnbuffersize; - u_long maxmatches; - struct timeval timelimit; - void *searchparams1; - size_t sizeofsearchparams1; - void *searchparams2; - size_t sizeofsearchparams2; - struct attrlist searchattrs; -}; - - -struct searchstate { - uint32_t ss_union_flags; // for SRCHFS_START - uint32_t ss_union_layer; // 0 = top - u_char ss_fsstate[548]; // fs private -} __attribute__((packed)); - -#define FST_EOF (-1) /* end-of-file offset */ - -#endif /* __APPLE_API_UNSTABLE */ -#endif /* !_SYS_ATTR_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/cdefs.h b/lib/libc/include/x86_64-macos-gnu/sys/cdefs.h deleted file mode 100644 index b2b091e28e..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/cdefs.h +++ /dev/null @@ -1,855 +0,0 @@ -/* - * Copyright (c) 2000-2018 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* Copyright 1995 NeXT Computer, Inc. All rights reserved. */ -/* - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Berkeley Software Design, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)cdefs.h 8.8 (Berkeley) 1/9/95 - */ - -#ifndef _CDEFS_H_ -#define _CDEFS_H_ - -#if defined(__cplusplus) -#define __BEGIN_DECLS extern "C" { -#define __END_DECLS } -#else -#define __BEGIN_DECLS -#define __END_DECLS -#endif - -/* This SDK is designed to work with clang and specific versions of - * gcc >= 4.0 with Apple's patch sets */ -#if !defined(__GNUC__) || __GNUC__ < 4 -#warning "Unsupported compiler detected" -#endif - -/* - * Compatibility with compilers and environments that don't support compiler - * feature checking function-like macros. - */ -#ifndef __has_builtin -#define __has_builtin(x) 0 -#endif -#ifndef __has_include -#define __has_include(x) 0 -#endif -#ifndef __has_feature -#define __has_feature(x) 0 -#endif -#ifndef __has_attribute -#define __has_attribute(x) 0 -#endif -#ifndef __has_extension -#define __has_extension(x) 0 -#endif - -/* - * The __CONCAT macro is used to concatenate parts of symbol names, e.g. - * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo. - * The __CONCAT macro is a bit tricky -- make sure you don't put spaces - * in between its arguments. __CONCAT can also concatenate double-quoted - * strings produced by the __STRING macro, but this only works with ANSI C. - */ -#if defined(__STDC__) || defined(__cplusplus) -#define __P(protos) protos /* full-blown ANSI C */ -#define __CONCAT(x, y) x ## y -#define __STRING(x) #x - -#define __const const /* define reserved names to standard */ -#define __signed signed -#define __volatile volatile -#if defined(__cplusplus) -#define __inline inline /* convert to C++ keyword */ -#else -#ifndef __GNUC__ -#define __inline /* delete GCC keyword */ -#endif /* !__GNUC__ */ -#endif /* !__cplusplus */ - -#else /* !(__STDC__ || __cplusplus) */ -#define __P(protos) () /* traditional C preprocessor */ -#define __CONCAT(x, y) x /**/ y -#define __STRING(x) "x" - -#ifndef __GNUC__ -#define __const /* delete pseudo-ANSI C keywords */ -#define __inline -#define __signed -#define __volatile -#endif /* !__GNUC__ */ - -/* - * In non-ANSI C environments, new programs will want ANSI-only C keywords - * deleted from the program and old programs will want them left alone. - * When using a compiler other than gcc, programs using the ANSI C keywords - * const, inline etc. as normal identifiers should define -DNO_ANSI_KEYWORDS. - * When using "gcc -traditional", we assume that this is the intent; if - * __GNUC__ is defined but __STDC__ is not, we leave the new keywords alone. - */ -#ifndef NO_ANSI_KEYWORDS -#define const __const /* convert ANSI C keywords */ -#define inline __inline -#define signed __signed -#define volatile __volatile -#endif /* !NO_ANSI_KEYWORDS */ -#endif /* !(__STDC__ || __cplusplus) */ - -#define __dead2 __attribute__((__noreturn__)) -#define __pure2 __attribute__((__const__)) - -/* __unused denotes variables and functions that may not be used, preventing - * the compiler from warning about it if not used. - */ -#define __unused __attribute__((__unused__)) - -/* __used forces variables and functions to be included even if it appears - * to the compiler that they are not used (and would thust be discarded). - */ -#define __used __attribute__((__used__)) - -/* __cold marks code used for debugging or that is rarely taken - * and tells the compiler to optimize for size and outline code. - */ -#if __has_attribute(cold) -#define __cold __attribute__((__cold__)) -#else -#define __cold -#endif - -/* __deprecated causes the compiler to produce a warning when encountering - * code using the deprecated functionality. - * __deprecated_msg() does the same, and compilers that support it will print - * a message along with the deprecation warning. - * This may require turning on such warning with the -Wdeprecated flag. - * __deprecated_enum_msg() should be used on enums, and compilers that support - * it will print the deprecation warning. - * __kpi_deprecated() specifically indicates deprecation of kernel programming - * interfaces in Kernel.framework used by KEXTs. - */ -#define __deprecated __attribute__((__deprecated__)) - -#if __has_extension(attribute_deprecated_with_message) || \ - (defined(__GNUC__) && ((__GNUC__ >= 5) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)))) - #define __deprecated_msg(_msg) __attribute__((__deprecated__(_msg))) -#else - #define __deprecated_msg(_msg) __attribute__((__deprecated__)) -#endif - -#if __has_extension(enumerator_attributes) - #define __deprecated_enum_msg(_msg) __deprecated_msg(_msg) -#else - #define __deprecated_enum_msg(_msg) -#endif - -#define __kpi_deprecated(_msg) - -/* __unavailable causes the compiler to error out when encountering - * code using the tagged function of variable. - */ -#define __unavailable __attribute__((__unavailable__)) - -/* Delete pseudo-keywords wherever they are not available or needed. */ -#ifndef __dead -#define __dead -#define __pure -#endif - -/* - * We use `__restrict' as a way to define the `restrict' type qualifier - * without disturbing older software that is unaware of C99 keywords. - */ -#if __STDC_VERSION__ < 199901 -#define __restrict -#else -#define __restrict restrict -#endif - -/* Compatibility with compilers and environments that don't support the - * nullability feature. - */ - -#if !__has_feature(nullability) -#ifndef __nullable -#define __nullable -#endif -#ifndef __nonnull -#define __nonnull -#endif -#ifndef __null_unspecified -#define __null_unspecified -#endif -#ifndef _Nullable -#define _Nullable -#endif -#ifndef _Nonnull -#define _Nonnull -#endif -#ifndef _Null_unspecified -#define _Null_unspecified -#endif -#endif - -/* - * __disable_tail_calls causes the compiler to not perform tail call - * optimization inside the marked function. - */ -#if __has_attribute(disable_tail_calls) -#define __disable_tail_calls __attribute__((__disable_tail_calls__)) -#else -#define __disable_tail_calls -#endif - -/* - * __not_tail_called causes the compiler to prevent tail call optimization - * on statically bound calls to the function. It has no effect on indirect - * calls. Virtual functions, objective-c methods, and functions marked as - * "always_inline" cannot be marked as __not_tail_called. - */ -#if __has_attribute(not_tail_called) -#define __not_tail_called __attribute__((__not_tail_called__)) -#else -#define __not_tail_called -#endif - -/* - * __result_use_check warns callers of a function that not using the function - * return value is a bug, i.e. dismissing malloc() return value results in a - * memory leak. - */ -#if __has_attribute(warn_unused_result) -#define __result_use_check __attribute__((__warn_unused_result__)) -#else -#define __result_use_check -#endif - -/* - * __swift_unavailable causes the compiler to mark a symbol as specifically - * unavailable in Swift, regardless of any other availability in C. - */ -#if __has_feature(attribute_availability_swift) -#define __swift_unavailable(_msg) __attribute__((__availability__(swift, unavailable, message=_msg))) -#else -#define __swift_unavailable(_msg) -#endif - -/* - * __abortlike is the attribute to put on functions like abort() that are - * typically used to mark assertions. These optimize the codegen - * for outlining while still maintaining debugability. - */ -#ifndef __abortlike -#define __abortlike __dead2 __cold __not_tail_called -#endif - -/* Declaring inline functions within headers is error-prone due to differences - * across various versions of the C language and extensions. __header_inline - * can be used to declare inline functions within system headers. In cases - * where you want to force inlining instead of letting the compiler make - * the decision, you can use __header_always_inline. - * - * Be aware that using inline for functions which compilers may also provide - * builtins can behave differently under various compilers. If you intend to - * provide an inline version of such a function, you may want to use a macro - * instead. - * - * The check for !__GNUC__ || __clang__ is because gcc doesn't correctly - * support c99 inline in some cases: - * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55965 - */ - -#if defined(__cplusplus) || \ - (__STDC_VERSION__ >= 199901L && \ - !defined(__GNUC_GNU_INLINE__) && \ - (!defined(__GNUC__) || defined(__clang__))) -# define __header_inline inline -#elif defined(__GNUC__) && defined(__GNUC_STDC_INLINE__) -# define __header_inline extern __inline __attribute__((__gnu_inline__)) -#elif defined(__GNUC__) -# define __header_inline extern __inline -#else -/* If we land here, we've encountered an unsupported compiler, - * so hopefully it understands static __inline as a fallback. - */ -# define __header_inline static __inline -#endif - -#ifdef __GNUC__ -# define __header_always_inline __header_inline __attribute__ ((__always_inline__)) -#else -/* Unfortunately, we're using a compiler that we don't know how to force to - * inline. Oh well. - */ -# define __header_always_inline __header_inline -#endif - -/* - * Compiler-dependent macros that bracket portions of code where the - * "-Wunreachable-code" warning should be ignored. Please use sparingly. - */ -#if defined(__clang__) -# define __unreachable_ok_push \ - _Pragma("clang diagnostic push") \ - _Pragma("clang diagnostic ignored \"-Wunreachable-code\"") -# define __unreachable_ok_pop \ - _Pragma("clang diagnostic pop") -#elif defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) -# define __unreachable_ok_push \ - _Pragma("GCC diagnostic push") \ - _Pragma("GCC diagnostic ignored \"-Wunreachable-code\"") -# define __unreachable_ok_pop \ - _Pragma("GCC diagnostic pop") -#else -# define __unreachable_ok_push -# define __unreachable_ok_pop -#endif - -/* - * Compiler-dependent macros to declare that functions take printf-like - * or scanf-like arguments. They are null except for versions of gcc - * that are known to support the features properly. Functions declared - * with these attributes will cause compilation warnings if there is a - * mismatch between the format string and subsequent function parameter - * types. - */ -#define __printflike(fmtarg, firstvararg) \ - __attribute__((__format__ (__printf__, fmtarg, firstvararg))) -#define __printf0like(fmtarg, firstvararg) \ - __attribute__((__format__ (__printf0__, fmtarg, firstvararg))) -#define __scanflike(fmtarg, firstvararg) \ - __attribute__((__format__ (__scanf__, fmtarg, firstvararg))) - -#define __IDSTRING(name, string) static const char name[] __used = string - -#ifndef __COPYRIGHT -#define __COPYRIGHT(s) __IDSTRING(copyright,s) -#endif - -#ifndef __RCSID -#define __RCSID(s) __IDSTRING(rcsid,s) -#endif - -#ifndef __SCCSID -#define __SCCSID(s) __IDSTRING(sccsid,s) -#endif - -#ifndef __PROJECT_VERSION -#define __PROJECT_VERSION(s) __IDSTRING(project_version,s) -#endif - -/* Source compatibility only, ID string not emitted in object file */ -#ifndef __FBSDID -#define __FBSDID(s) -#endif - -#ifndef __DECONST -#define __DECONST(type, var) __CAST_AWAY_QUALIFIER(var, const, type) -#endif - -#ifndef __DEVOLATILE -#define __DEVOLATILE(type, var) __CAST_AWAY_QUALIFIER(var, volatile, type) -#endif - -#ifndef __DEQUALIFY -#define __DEQUALIFY(type, var) __CAST_AWAY_QUALIFIER(var, const volatile, type) -#endif - -/* - * __alloc_size can be used to label function arguments that represent the - * size of memory that the function allocates and returns. The one-argument - * form labels a single argument that gives the allocation size (where the - * arguments are numbered from 1): - * - * void *malloc(size_t __size) __alloc_size(1); - * - * The two-argument form handles the case where the size is calculated as the - * product of two arguments: - * - * void *calloc(size_t __count, size_t __size) __alloc_size(1,2); - */ -#ifndef __alloc_size -#if __has_attribute(alloc_size) -#define __alloc_size(...) __attribute__((alloc_size(__VA_ARGS__))) -#else -#define __alloc_size(...) -#endif -#endif // __alloc_size - -/* - * COMPILATION ENVIRONMENTS -- see compat(5) for additional detail - * - * DEFAULT By default newly complied code will get POSIX APIs plus - * Apple API extensions in scope. - * - * Most users will use this compilation environment to avoid - * behavioral differences between 32 and 64 bit code. - * - * LEGACY Defining _NONSTD_SOURCE will get pre-POSIX APIs plus Apple - * API extensions in scope. - * - * This is generally equivalent to the Tiger release compilation - * environment, except that it cannot be applied to 64 bit code; - * its use is discouraged. - * - * We expect this environment to be deprecated in the future. - * - * STRICT Defining _POSIX_C_SOURCE or _XOPEN_SOURCE restricts the - * available APIs to exactly the set of APIs defined by the - * corresponding standard, based on the value defined. - * - * A correct, portable definition for _POSIX_C_SOURCE is 200112L. - * A correct, portable definition for _XOPEN_SOURCE is 600L. - * - * Apple API extensions are not visible in this environment, - * which can cause Apple specific code to fail to compile, - * or behave incorrectly if prototypes are not in scope or - * warnings about missing prototypes are not enabled or ignored. - * - * In any compilation environment, for correct symbol resolution to occur, - * function prototypes must be in scope. It is recommended that all Apple - * tools users add either the "-Wall" or "-Wimplicit-function-declaration" - * compiler flags to their projects to be warned when a function is being - * used without a prototype in scope. - */ - -/* These settings are particular to each product. */ -/* Platform: MacOSX */ -#define __DARWIN_ONLY_64_BIT_INO_T 0 -/* #undef __DARWIN_ONLY_UNIX_CONFORMANCE (automatically set for 64-bit) */ -#define __DARWIN_ONLY_VERS_1050 0 - -/* - * The __DARWIN_ALIAS macros are used to do symbol renaming; they allow - * legacy code to use the old symbol, thus maintaining binary compatibility - * while new code can use a standards compliant version of the same function. - * - * __DARWIN_ALIAS is used by itself if the function signature has not - * changed, it is used along with a #ifdef check for __DARWIN_UNIX03 - * if the signature has changed. Because the __LP64__ environment - * only supports UNIX03 semantics it causes __DARWIN_UNIX03 to be - * defined, but causes __DARWIN_ALIAS to do no symbol mangling. - * - * As a special case, when XCode is used to target a specific version of the - * OS, the manifest constant __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ - * will be defined by the compiler, with the digits representing major version - * time 100 + minor version times 10 (e.g. 10.5 := 1050). If we are targeting - * pre-10.5, and it is the default compilation environment, revert the - * compilation environment to pre-__DARWIN_UNIX03. - */ -#if !defined(__DARWIN_ONLY_UNIX_CONFORMANCE) -# if defined(__LP64__) -# define __DARWIN_ONLY_UNIX_CONFORMANCE 1 -# else /* !__LP64__ */ -# define __DARWIN_ONLY_UNIX_CONFORMANCE 0 -# endif /* __LP64__ */ -#endif /* !__DARWIN_ONLY_UNIX_CONFORMANCE */ - -#if !defined(__DARWIN_UNIX03) -# if __DARWIN_ONLY_UNIX_CONFORMANCE -# if defined(_NONSTD_SOURCE) -# error "Can't define _NONSTD_SOURCE when only UNIX conformance is available." -# endif /* _NONSTD_SOURCE */ -# define __DARWIN_UNIX03 1 -# elif defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && ((__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ - 0) < 1040) -# define __DARWIN_UNIX03 0 -# elif defined(_DARWIN_C_SOURCE) || defined(_XOPEN_SOURCE) || defined(_POSIX_C_SOURCE) -# if defined(_NONSTD_SOURCE) -# error "Can't define both _NONSTD_SOURCE and any of _DARWIN_C_SOURCE, _XOPEN_SOURCE or _POSIX_C_SOURCE." -# endif /* _NONSTD_SOURCE */ -# define __DARWIN_UNIX03 1 -# elif defined(_NONSTD_SOURCE) -# define __DARWIN_UNIX03 0 -# else /* default */ -# if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && ((__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ - 0) < 1050) -# define __DARWIN_UNIX03 0 -# else /* __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 */ -# define __DARWIN_UNIX03 1 -# endif /* __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 */ -# endif /* _DARWIN_C_SOURCE || _XOPEN_SOURCE || _POSIX_C_SOURCE || __LP64__ */ -#endif /* !__DARWIN_UNIX03 */ - -#if !defined(__DARWIN_64_BIT_INO_T) -# if defined(_DARWIN_USE_64_BIT_INODE) -# if defined(_DARWIN_NO_64_BIT_INODE) -# error "Can't define both _DARWIN_USE_64_BIT_INODE and _DARWIN_NO_64_BIT_INODE." -# endif /* _DARWIN_NO_64_BIT_INODE */ -# define __DARWIN_64_BIT_INO_T 1 -# elif defined(_DARWIN_NO_64_BIT_INODE) -# if __DARWIN_ONLY_64_BIT_INO_T -# error "Can't define _DARWIN_NO_64_BIT_INODE when only 64-bit inodes are available." -# endif /* __DARWIN_ONLY_64_BIT_INO_T */ -# define __DARWIN_64_BIT_INO_T 0 -# else /* default */ -# if __DARWIN_ONLY_64_BIT_INO_T -# define __DARWIN_64_BIT_INO_T 1 -# elif defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && ((__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ - 0) < 1060) || __DARWIN_UNIX03 == 0 -# define __DARWIN_64_BIT_INO_T 0 -# else /* default */ -# define __DARWIN_64_BIT_INO_T 1 -# endif /* __DARWIN_ONLY_64_BIT_INO_T */ -# endif -#endif /* !__DARWIN_64_BIT_INO_T */ - -#if !defined(__DARWIN_VERS_1050) -# if __DARWIN_ONLY_VERS_1050 -# define __DARWIN_VERS_1050 1 -# elif defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && ((__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ - 0) < 1050) || __DARWIN_UNIX03 == 0 -# define __DARWIN_VERS_1050 0 -# else /* default */ -# define __DARWIN_VERS_1050 1 -# endif -#endif /* !__DARWIN_VERS_1050 */ - -#if !defined(__DARWIN_NON_CANCELABLE) -# define __DARWIN_NON_CANCELABLE 0 -#endif /* !__DARWIN_NON_CANCELABLE */ - -/* - * symbol suffixes used for symbol versioning - */ -#if __DARWIN_UNIX03 -# if __DARWIN_ONLY_UNIX_CONFORMANCE -# define __DARWIN_SUF_UNIX03 /* nothing */ -# else /* !__DARWIN_ONLY_UNIX_CONFORMANCE */ -# define __DARWIN_SUF_UNIX03 "$UNIX2003" -# endif /* __DARWIN_ONLY_UNIX_CONFORMANCE */ - -# if __DARWIN_64_BIT_INO_T -# if __DARWIN_ONLY_64_BIT_INO_T -# define __DARWIN_SUF_64_BIT_INO_T /* nothing */ -# else /* !__DARWIN_ONLY_64_BIT_INO_T */ -# define __DARWIN_SUF_64_BIT_INO_T "$INODE64" -# endif /* __DARWIN_ONLY_64_BIT_INO_T */ -# else /* !__DARWIN_64_BIT_INO_T */ -# define __DARWIN_SUF_64_BIT_INO_T /* nothing */ -# endif /* __DARWIN_64_BIT_INO_T */ - -# if __DARWIN_VERS_1050 -# if __DARWIN_ONLY_VERS_1050 -# define __DARWIN_SUF_1050 /* nothing */ -# else /* !__DARWIN_ONLY_VERS_1050 */ -# define __DARWIN_SUF_1050 "$1050" -# endif /* __DARWIN_ONLY_VERS_1050 */ -# else /* !__DARWIN_VERS_1050 */ -# define __DARWIN_SUF_1050 /* nothing */ -# endif /* __DARWIN_VERS_1050 */ - -# if __DARWIN_NON_CANCELABLE -# define __DARWIN_SUF_NON_CANCELABLE "$NOCANCEL" -# else /* !__DARWIN_NON_CANCELABLE */ -# define __DARWIN_SUF_NON_CANCELABLE /* nothing */ -# endif /* __DARWIN_NON_CANCELABLE */ - -#else /* !__DARWIN_UNIX03 */ -# define __DARWIN_SUF_UNIX03 /* nothing */ -# define __DARWIN_SUF_64_BIT_INO_T /* nothing */ -# define __DARWIN_SUF_NON_CANCELABLE /* nothing */ -# define __DARWIN_SUF_1050 /* nothing */ -#endif /* __DARWIN_UNIX03 */ - -#define __DARWIN_SUF_EXTSN "$DARWIN_EXTSN" - -/* - * symbol versioning macros - */ -#define __DARWIN_ALIAS(sym) __asm("_" __STRING(sym) __DARWIN_SUF_UNIX03) -#define __DARWIN_ALIAS_C(sym) __asm("_" __STRING(sym) __DARWIN_SUF_NON_CANCELABLE __DARWIN_SUF_UNIX03) -#define __DARWIN_ALIAS_I(sym) __asm("_" __STRING(sym) __DARWIN_SUF_64_BIT_INO_T __DARWIN_SUF_UNIX03) -#define __DARWIN_NOCANCEL(sym) __asm("_" __STRING(sym) __DARWIN_SUF_NON_CANCELABLE) -#define __DARWIN_INODE64(sym) __asm("_" __STRING(sym) __DARWIN_SUF_64_BIT_INO_T) - -#define __DARWIN_1050(sym) __asm("_" __STRING(sym) __DARWIN_SUF_1050) -#define __DARWIN_1050ALIAS(sym) __asm("_" __STRING(sym) __DARWIN_SUF_1050 __DARWIN_SUF_UNIX03) -#define __DARWIN_1050ALIAS_C(sym) __asm("_" __STRING(sym) __DARWIN_SUF_1050 __DARWIN_SUF_NON_CANCELABLE __DARWIN_SUF_UNIX03) -#define __DARWIN_1050ALIAS_I(sym) __asm("_" __STRING(sym) __DARWIN_SUF_1050 __DARWIN_SUF_64_BIT_INO_T __DARWIN_SUF_UNIX03) -#define __DARWIN_1050INODE64(sym) __asm("_" __STRING(sym) __DARWIN_SUF_1050 __DARWIN_SUF_64_BIT_INO_T) - -#define __DARWIN_EXTSN(sym) __asm("_" __STRING(sym) __DARWIN_SUF_EXTSN) -#define __DARWIN_EXTSN_C(sym) __asm("_" __STRING(sym) __DARWIN_SUF_EXTSN __DARWIN_SUF_NON_CANCELABLE) - -/* - * symbol release macros - */ -#include - -#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) -#define __DARWIN_ALIAS_STARTING(_mac, _iphone, x) __DARWIN_ALIAS_STARTING_IPHONE_##_iphone(x) -#elif defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) -#define __DARWIN_ALIAS_STARTING(_mac, _iphone, x) __DARWIN_ALIAS_STARTING_MAC_##_mac(x) -#else -#define __DARWIN_ALIAS_STARTING(_mac, _iphone, x) x -#endif - - -/* - * POSIX.1 requires that the macros we test be defined before any standard - * header file is included. This permits us to convert values for feature - * testing, as necessary, using only _POSIX_C_SOURCE. - * - * Here's a quick run-down of the versions: - * defined(_POSIX_SOURCE) 1003.1-1988 - * _POSIX_C_SOURCE == 1L 1003.1-1990 - * _POSIX_C_SOURCE == 2L 1003.2-1992 C Language Binding Option - * _POSIX_C_SOURCE == 199309L 1003.1b-1993 - * _POSIX_C_SOURCE == 199506L 1003.1c-1995, 1003.1i-1995, - * and the omnibus ISO/IEC 9945-1: 1996 - * _POSIX_C_SOURCE == 200112L 1003.1-2001 - * _POSIX_C_SOURCE == 200809L 1003.1-2008 - * - * In addition, the X/Open Portability Guide, which is now the Single UNIX - * Specification, defines a feature-test macro which indicates the version of - * that specification, and which subsumes _POSIX_C_SOURCE. - */ - -/* Deal with IEEE Std. 1003.1-1990, in which _POSIX_C_SOURCE == 1L. */ -#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 1L -#undef _POSIX_C_SOURCE -#define _POSIX_C_SOURCE 199009L -#endif - -/* Deal with IEEE Std. 1003.2-1992, in which _POSIX_C_SOURCE == 2L. */ -#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 2L -#undef _POSIX_C_SOURCE -#define _POSIX_C_SOURCE 199209L -#endif - -/* Deal with various X/Open Portability Guides and Single UNIX Spec. */ -#ifdef _XOPEN_SOURCE -#if _XOPEN_SOURCE - 0L >= 700L && (!defined(_POSIX_C_SOURCE) || _POSIX_C_SOURCE - 0L < 200809L) -#undef _POSIX_C_SOURCE -#define _POSIX_C_SOURCE 200809L -#elif _XOPEN_SOURCE - 0L >= 600L && (!defined(_POSIX_C_SOURCE) || _POSIX_C_SOURCE - 0L < 200112L) -#undef _POSIX_C_SOURCE -#define _POSIX_C_SOURCE 200112L -#elif _XOPEN_SOURCE - 0L >= 500L && (!defined(_POSIX_C_SOURCE) || _POSIX_C_SOURCE - 0L < 199506L) -#undef _POSIX_C_SOURCE -#define _POSIX_C_SOURCE 199506L -#endif -#endif - -/* - * Deal with all versions of POSIX. The ordering relative to the tests above is - * important. - */ -#if defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE) -#define _POSIX_C_SOURCE 198808L -#endif - -/* POSIX C deprecation macros */ -#include - -#define __POSIX_C_DEPRECATED(ver) ___POSIX_C_DEPRECATED_STARTING_##ver - -/* - * Set a single macro which will always be defined and can be used to determine - * the appropriate namespace. For POSIX, these values will correspond to - * _POSIX_C_SOURCE value. Currently there are two additional levels corresponding - * to ANSI (_ANSI_SOURCE) and Darwin extensions (_DARWIN_C_SOURCE) - */ -#define __DARWIN_C_ANSI 010000L -#define __DARWIN_C_FULL 900000L - -#if defined(_ANSI_SOURCE) -#define __DARWIN_C_LEVEL __DARWIN_C_ANSI -#elif defined(_POSIX_C_SOURCE) && !defined(_DARWIN_C_SOURCE) && !defined(_NONSTD_SOURCE) -#define __DARWIN_C_LEVEL _POSIX_C_SOURCE -#else -#define __DARWIN_C_LEVEL __DARWIN_C_FULL -#endif - -/* If the developer has neither requested a strict language mode nor a version - * of POSIX, turn on functionality provided by __STDC_WANT_LIB_EXT1__ as part - * of __DARWIN_C_FULL. - */ -#if !defined(__STDC_WANT_LIB_EXT1__) && !defined(__STRICT_ANSI__) && __DARWIN_C_LEVEL >= __DARWIN_C_FULL -#define __STDC_WANT_LIB_EXT1__ 1 -#endif - -/* - * long long is not supported in c89 (__STRICT_ANSI__), but g++ -ansi and - * c99 still want long longs. While not perfect, we allow long longs for - * g++. - */ -#if (defined(__STRICT_ANSI__) && (__STDC_VERSION__ - 0 < 199901L) && !defined(__GNUG__)) -#define __DARWIN_NO_LONG_LONG 1 -#else -#define __DARWIN_NO_LONG_LONG 0 -#endif - -/***************************************** -* Public darwin-specific feature macros -*****************************************/ - -/* - * _DARWIN_FEATURE_64_BIT_INODE indicates that the ino_t type is 64-bit, and - * structures modified for 64-bit inodes (like struct stat) will be used. - */ -#if __DARWIN_64_BIT_INO_T -#define _DARWIN_FEATURE_64_BIT_INODE 1 -#endif - -/* - * _DARWIN_FEATURE_64_ONLY_BIT_INODE indicates that the ino_t type may only - * be 64-bit; there is no support for 32-bit ino_t when this macro is defined - * (and non-zero). There is no struct stat64 either, as the regular - * struct stat will already be the 64-bit version. - */ -#if __DARWIN_ONLY_64_BIT_INO_T -#define _DARWIN_FEATURE_ONLY_64_BIT_INODE 1 -#endif - -/* - * _DARWIN_FEATURE_ONLY_VERS_1050 indicates that only those APIs updated - * in 10.5 exists; no pre-10.5 variants are available. - */ -#if __DARWIN_ONLY_VERS_1050 -#define _DARWIN_FEATURE_ONLY_VERS_1050 1 -#endif - -/* - * _DARWIN_FEATURE_ONLY_UNIX_CONFORMANCE indicates only UNIX conforming API - * are available (the legacy BSD APIs are not available) - */ -#if __DARWIN_ONLY_UNIX_CONFORMANCE -#define _DARWIN_FEATURE_ONLY_UNIX_CONFORMANCE 1 -#endif - -/* - * _DARWIN_FEATURE_UNIX_CONFORMANCE indicates whether UNIX conformance is on, - * and specifies the conformance level (3 is SUSv3) - */ -#if __DARWIN_UNIX03 -#define _DARWIN_FEATURE_UNIX_CONFORMANCE 3 -#endif - - -/* - * This macro casts away the qualifier from the variable - * - * Note: use at your own risk, removing qualifiers can result in - * catastrophic run-time failures. - */ -#ifndef __CAST_AWAY_QUALIFIER -#define __CAST_AWAY_QUALIFIER(variable, qualifier, type) (type) (long)(variable) -#endif - -/* - * __XNU_PRIVATE_EXTERN is a linkage decoration indicating that a symbol can be - * used from other compilation units, but not other libraries or executables. - */ -#ifndef __XNU_PRIVATE_EXTERN -#define __XNU_PRIVATE_EXTERN __attribute__((visibility("hidden"))) -#endif - -/* - * Architecture validation for current SDK - */ -#if !defined(__sys_cdefs_arch_unknown__) && defined(__i386__) -#elif !defined(__sys_cdefs_arch_unknown__) && defined(__x86_64__) -#else -#error Unsupported architecture -#endif - - - -#define __compiler_barrier() __asm__ __volatile__("" ::: "memory") - -#if __has_attribute(enum_extensibility) -#define __enum_open __attribute__((__enum_extensibility__(open))) -#define __enum_closed __attribute__((__enum_extensibility__(closed))) -#else -#define __enum_open -#define __enum_closed -#endif // __has_attribute(enum_extensibility) - -#if __has_attribute(flag_enum) -#define __enum_options __attribute__((__flag_enum__)) -#else -#define __enum_options -#endif - -/* - * Similar to OS_ENUM/OS_CLOSED_ENUM/OS_OPTIONS/OS_CLOSED_OPTIONS - * - * This provides more advanced type checking on compilers supporting - * the proper extensions, even in C. - */ -#if __has_feature(objc_fixed_enum) || __has_extension(cxx_fixed_enum) || \ - __has_extension(cxx_strong_enums) -#define __enum_decl(_name, _type, ...) \ - typedef enum : _type __VA_ARGS__ __enum_open _name -#define __enum_closed_decl(_name, _type, ...) \ - typedef enum : _type __VA_ARGS__ __enum_closed _name -#define __options_decl(_name, _type, ...) \ - typedef enum : _type __VA_ARGS__ __enum_open __enum_options _name -#define __options_closed_decl(_name, _type, ...) \ - typedef enum : _type __VA_ARGS__ __enum_closed __enum_options _name -#else -#define __enum_decl(_name, _type, ...) \ - typedef _type _name; enum __VA_ARGS__ __enum_open -#define __enum_closed_decl(_name, _type, ...) \ - typedef _type _name; enum __VA_ARGS__ __enum_closed -#define __options_decl(_name, _type, ...) \ - typedef _type _name; enum __VA_ARGS__ __enum_open __enum_options -#define __options_closed_decl(_name, _type, ...) \ - typedef _type _name; enum __VA_ARGS__ __enum_closed __enum_options -#endif - -#endif /* !_CDEFS_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/event.h b/lib/libc/include/x86_64-macos-gnu/sys/event.h deleted file mode 100644 index 1fbce9a75c..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/event.h +++ /dev/null @@ -1,396 +0,0 @@ -/* - * Copyright (c) 2003-2019 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/*- - * Copyright (c) 1999,2000,2001 Jonathan Lemon - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD: src/sys/sys/event.h,v 1.5.2.5 2001/12/14 19:21:22 jlemon Exp $ - */ - -#ifndef _SYS_EVENT_H_ -#define _SYS_EVENT_H_ - -#include -#include -#include - -/* - * Filter types - */ -#define EVFILT_READ (-1) -#define EVFILT_WRITE (-2) -#define EVFILT_AIO (-3) /* attached to aio requests */ -#define EVFILT_VNODE (-4) /* attached to vnodes */ -#define EVFILT_PROC (-5) /* attached to struct proc */ -#define EVFILT_SIGNAL (-6) /* attached to struct proc */ -#define EVFILT_TIMER (-7) /* timers */ -#define EVFILT_MACHPORT (-8) /* Mach portsets */ -#define EVFILT_FS (-9) /* Filesystem events */ -#define EVFILT_USER (-10) /* User events */ -#define EVFILT_VM (-12) /* Virtual memory events */ -#define EVFILT_EXCEPT (-15) /* Exception events */ - -#define EVFILT_SYSCOUNT 17 -#define EVFILT_THREADMARKER EVFILT_SYSCOUNT /* Internal use only */ - -#pragma pack(4) - -struct kevent { - uintptr_t ident; /* identifier for this event */ - int16_t filter; /* filter for event */ - uint16_t flags; /* general flags */ - uint32_t fflags; /* filter-specific flags */ - intptr_t data; /* filter-specific data */ - void *udata; /* opaque user data identifier */ -}; - - -#pragma pack() - -struct kevent64_s { - uint64_t ident; /* identifier for this event */ - int16_t filter; /* filter for event */ - uint16_t flags; /* general flags */ - uint32_t fflags; /* filter-specific flags */ - int64_t data; /* filter-specific data */ - uint64_t udata; /* opaque user data identifier */ - uint64_t ext[2]; /* filter-specific extensions */ -}; - - -#define EV_SET(kevp, a, b, c, d, e, f) do { \ - struct kevent *__kevp__ = (kevp); \ - __kevp__->ident = (a); \ - __kevp__->filter = (b); \ - __kevp__->flags = (c); \ - __kevp__->fflags = (d); \ - __kevp__->data = (e); \ - __kevp__->udata = (f); \ -} while(0) - -#define EV_SET64(kevp, a, b, c, d, e, f, g, h) do { \ - struct kevent64_s *__kevp__ = (kevp); \ - __kevp__->ident = (a); \ - __kevp__->filter = (b); \ - __kevp__->flags = (c); \ - __kevp__->fflags = (d); \ - __kevp__->data = (e); \ - __kevp__->udata = (f); \ - __kevp__->ext[0] = (g); \ - __kevp__->ext[1] = (h); \ -} while(0) - - -/* kevent system call flags */ -#define KEVENT_FLAG_NONE 0x000000 /* no flag value */ -#define KEVENT_FLAG_IMMEDIATE 0x000001 /* immediate timeout */ -#define KEVENT_FLAG_ERROR_EVENTS 0x000002 /* output events only include change errors */ - - -/* actions */ -#define EV_ADD 0x0001 /* add event to kq (implies enable) */ -#define EV_DELETE 0x0002 /* delete event from kq */ -#define EV_ENABLE 0x0004 /* enable event */ -#define EV_DISABLE 0x0008 /* disable event (not reported) */ - -/* flags */ -#define EV_ONESHOT 0x0010 /* only report one occurrence */ -#define EV_CLEAR 0x0020 /* clear event state after reporting */ -#define EV_RECEIPT 0x0040 /* force immediate event output */ - /* ... with or without EV_ERROR */ - /* ... use KEVENT_FLAG_ERROR_EVENTS */ - /* on syscalls supporting flags */ - -#define EV_DISPATCH 0x0080 /* disable event after reporting */ -#define EV_UDATA_SPECIFIC 0x0100 /* unique kevent per udata value */ - -#define EV_DISPATCH2 (EV_DISPATCH | EV_UDATA_SPECIFIC) -/* ... in combination with EV_DELETE */ -/* will defer delete until udata-specific */ -/* event enabled. EINPROGRESS will be */ -/* returned to indicate the deferral */ - -#define EV_VANISHED 0x0200 /* report that source has vanished */ - /* ... only valid with EV_DISPATCH2 */ - -#define EV_SYSFLAGS 0xF000 /* reserved by system */ -#define EV_FLAG0 0x1000 /* filter-specific flag */ -#define EV_FLAG1 0x2000 /* filter-specific flag */ - -/* returned values */ -#define EV_EOF 0x8000 /* EOF detected */ -#define EV_ERROR 0x4000 /* error, data contains errno */ - -/* - * Filter specific flags for EVFILT_READ - * - * The default behavior for EVFILT_READ is to make the "read" determination - * relative to the current file descriptor read pointer. - * - * The EV_POLL flag indicates the determination should be made via poll(2) - * semantics. These semantics dictate always returning true for regular files, - * regardless of the amount of unread data in the file. - * - * On input, EV_OOBAND specifies that filter should actively return in the - * presence of OOB on the descriptor. It implies that filter will return - * if there is OOB data available to read OR when any other condition - * for the read are met (for example number of bytes regular data becomes >= - * low-watermark). - * If EV_OOBAND is not set on input, it implies that the filter should not actively - * return for out of band data on the descriptor. The filter will then only return - * when some other condition for read is met (ex: when number of regular data bytes - * >=low-watermark OR when socket can't receive more data (SS_CANTRCVMORE)). - * - * On output, EV_OOBAND indicates the presence of OOB data on the descriptor. - * If it was not specified as an input parameter, then the data count is the - * number of bytes before the current OOB marker, else data count is the number - * of bytes beyond OOB marker. - */ -#define EV_POLL EV_FLAG0 -#define EV_OOBAND EV_FLAG1 - -/* - * data/hint fflags for EVFILT_USER, shared with userspace - */ - -/* - * On input, NOTE_TRIGGER causes the event to be triggered for output. - */ -#define NOTE_TRIGGER 0x01000000 - -/* - * On input, the top two bits of fflags specifies how the lower twenty four - * bits should be applied to the stored value of fflags. - * - * On output, the top two bits will always be set to NOTE_FFNOP and the - * remaining twenty four bits will contain the stored fflags value. - */ -#define NOTE_FFNOP 0x00000000 /* ignore input fflags */ -#define NOTE_FFAND 0x40000000 /* and fflags */ -#define NOTE_FFOR 0x80000000 /* or fflags */ -#define NOTE_FFCOPY 0xc0000000 /* copy fflags */ -#define NOTE_FFCTRLMASK 0xc0000000 /* mask for operations */ -#define NOTE_FFLAGSMASK 0x00ffffff - - -/* - * data/hint fflags for EVFILT_{READ|WRITE}, shared with userspace - * - * The default behavior for EVFILT_READ is to make the determination - * realtive to the current file descriptor read pointer. - */ -#define NOTE_LOWAT 0x00000001 /* low water mark */ - -/* data/hint flags for EVFILT_EXCEPT, shared with userspace */ -#define NOTE_OOB 0x00000002 /* OOB data */ - -/* - * data/hint fflags for EVFILT_VNODE, shared with userspace - */ -#define NOTE_DELETE 0x00000001 /* vnode was removed */ -#define NOTE_WRITE 0x00000002 /* data contents changed */ -#define NOTE_EXTEND 0x00000004 /* size increased */ -#define NOTE_ATTRIB 0x00000008 /* attributes changed */ -#define NOTE_LINK 0x00000010 /* link count changed */ -#define NOTE_RENAME 0x00000020 /* vnode was renamed */ -#define NOTE_REVOKE 0x00000040 /* vnode access was revoked */ -#define NOTE_NONE 0x00000080 /* No specific vnode event: to test for EVFILT_READ activation*/ -#define NOTE_FUNLOCK 0x00000100 /* vnode was unlocked by flock(2) */ - -/* - * data/hint fflags for EVFILT_PROC, shared with userspace - * - * Please note that EVFILT_PROC and EVFILT_SIGNAL share the same knote list - * that hangs off the proc structure. They also both play games with the hint - * passed to KNOTE(). If NOTE_SIGNAL is passed as a hint, then the lower bits - * of the hint contain the signal. IF NOTE_FORK is passed, then the lower bits - * contain the PID of the child (but the pid does not get passed through in - * the actual kevent). - */ -enum { - eNoteReapDeprecated __deprecated_enum_msg("This kqueue(2) EVFILT_PROC flag is deprecated") = 0x10000000 -}; - -#define NOTE_EXIT 0x80000000 /* process exited */ -#define NOTE_FORK 0x40000000 /* process forked */ -#define NOTE_EXEC 0x20000000 /* process exec'd */ -#define NOTE_REAP ((unsigned int)eNoteReapDeprecated /* 0x10000000 */ ) /* process reaped */ -#define NOTE_SIGNAL 0x08000000 /* shared with EVFILT_SIGNAL */ -#define NOTE_EXITSTATUS 0x04000000 /* exit status to be returned, valid for child process only */ -#define NOTE_EXIT_DETAIL 0x02000000 /* provide details on reasons for exit */ - -#define NOTE_PDATAMASK 0x000fffff /* mask for signal & exit status */ -#define NOTE_PCTRLMASK (~NOTE_PDATAMASK) - -/* - * If NOTE_EXITSTATUS is present, provide additional info about exiting process. - */ -enum { - eNoteExitReparentedDeprecated __deprecated_enum_msg("This kqueue(2) EVFILT_PROC flag is no longer sent") = 0x00080000 -}; -#define NOTE_EXIT_REPARENTED ((unsigned int)eNoteExitReparentedDeprecated) /* exited while reparented */ - -/* - * If NOTE_EXIT_DETAIL is present, these bits indicate specific reasons for exiting. - */ -#define NOTE_EXIT_DETAIL_MASK 0x00070000 -#define NOTE_EXIT_DECRYPTFAIL 0x00010000 -#define NOTE_EXIT_MEMORY 0x00020000 -#define NOTE_EXIT_CSERROR 0x00040000 - - -/* - * data/hint fflags for EVFILT_VM, shared with userspace. - */ -#define NOTE_VM_PRESSURE 0x80000000 /* will react on memory pressure */ -#define NOTE_VM_PRESSURE_TERMINATE 0x40000000 /* will quit on memory pressure, possibly after cleaning up dirty state */ -#define NOTE_VM_PRESSURE_SUDDEN_TERMINATE 0x20000000 /* will quit immediately on memory pressure */ -#define NOTE_VM_ERROR 0x10000000 /* there was an error */ - - -/* - * data/hint fflags for EVFILT_TIMER, shared with userspace. - * The default is a (repeating) interval timer with the data - * specifying the timeout interval in milliseconds. - * - * All timeouts are implicitly EV_CLEAR events. - */ -#define NOTE_SECONDS 0x00000001 /* data is seconds */ -#define NOTE_USECONDS 0x00000002 /* data is microseconds */ -#define NOTE_NSECONDS 0x00000004 /* data is nanoseconds */ -#define NOTE_ABSOLUTE 0x00000008 /* absolute timeout */ -/* ... implicit EV_ONESHOT, timeout uses the gettimeofday epoch */ -#define NOTE_LEEWAY 0x00000010 /* ext[1] holds leeway for power aware timers */ -#define NOTE_CRITICAL 0x00000020 /* system does minimal timer coalescing */ -#define NOTE_BACKGROUND 0x00000040 /* system does maximum timer coalescing */ -#define NOTE_MACH_CONTINUOUS_TIME 0x00000080 -/* - * NOTE_MACH_CONTINUOUS_TIME: - * with NOTE_ABSOLUTE: causes the timer to continue to tick across sleep, - * still uses gettimeofday epoch - * with NOTE_MACHTIME and NOTE_ABSOLUTE: uses mach continuous time epoch - * without NOTE_ABSOLUTE (interval timer mode): continues to tick across sleep - */ -#define NOTE_MACHTIME 0x00000100 /* data is mach absolute time units */ -/* timeout uses the mach absolute time epoch */ - - -/* - * data/hint fflags for EVFILT_MACHPORT, shared with userspace. - * - * Only portsets are supported at this time. - * - * The fflags field can optionally contain the MACH_RCV_MSG, MACH_RCV_LARGE, - * and related trailer receive options as defined in . - * The presence of these flags directs the kevent64() call to attempt to receive - * the message during kevent delivery, rather than just indicate that a message exists. - * On setup, The ext[0] field contains the receive buffer pointer and ext[1] contains - * the receive buffer length. Upon event delivery, the actual received message size - * is returned in ext[1]. As with mach_msg(), the buffer must be large enough to - * receive the message and the requested (or default) message trailers. In addition, - * the fflags field contains the return code normally returned by mach_msg(). - * - * If MACH_RCV_MSG is specified, and the ext[1] field specifies a zero length, the - * system call argument specifying an ouput area (kevent_qos) will be consulted. If - * the system call specified an output data area, the user-space address - * of the received message is carved from that provided output data area (if enough - * space remains there). The address and length of each received message is - * returned in the ext[0] and ext[1] fields (respectively) of the corresponding kevent. - * - * IF_MACH_RCV_VOUCHER_CONTENT is specified, the contents of the message voucher is - * extracted (as specified in the xflags field) and stored in ext[2] up to ext[3] - * length. If the input length is zero, and the system call provided a data area, - * the space for the voucher content is carved from the provided space and its - * address and length is returned in ext[2] and ext[3] respectively. - * - * If no message receipt options were provided in the fflags field on setup, no - * message is received by this call. Instead, on output, the data field simply - * contains the name of the actual port detected with a message waiting. - */ - -/* - * DEPRECATED!!!!!!!!! - * NOTE_TRACK, NOTE_TRACKERR, and NOTE_CHILD are no longer supported as of 10.5 - */ -/* additional flags for EVFILT_PROC */ -#define NOTE_TRACK 0x00000001 /* follow across forks */ -#define NOTE_TRACKERR 0x00000002 /* could not track child */ -#define NOTE_CHILD 0x00000004 /* am a child process */ - - - -/* Temporay solution for BootX to use inode.h till kqueue moves to vfs layer */ -#include -struct knote; -SLIST_HEAD(klist, knote); - - -#include - -struct timespec; - -__BEGIN_DECLS -int kqueue(void); -int kevent(int kq, - const struct kevent *changelist, int nchanges, - struct kevent *eventlist, int nevents, - const struct timespec *timeout); -int kevent64(int kq, - const struct kevent64_s *changelist, int nchanges, - struct kevent64_s *eventlist, int nevents, - unsigned int flags, - const struct timespec *timeout); - - -__END_DECLS - - - - -#endif /* !_SYS_EVENT_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/fcntl.h b/lib/libc/include/x86_64-macos-gnu/sys/fcntl.h deleted file mode 100644 index 9326ed0dab..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/fcntl.h +++ /dev/null @@ -1,557 +0,0 @@ -/* - * Copyright (c) 2000-2013 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */ -/*- - * Copyright (c) 1983, 1990, 1993 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)fcntl.h 8.3 (Berkeley) 1/21/94 - */ - - -#ifndef _SYS_FCNTL_H_ -#define _SYS_FCNTL_H_ - -/* - * This file includes the definitions for open and fcntl - * described by POSIX for ; it also includes - * related kernel definitions. - */ -#include -#include -#include - -/* We should not be exporting size_t here. Temporary for gcc bootstrapping. */ -#include -#include -#include -#include - -/* - * File status flags: these are used by open(2), fcntl(2). - * They are also used (indirectly) in the kernel file structure f_flags, - * which is a superset of the open/fcntl flags. Open flags and f_flags - * are inter-convertible using OFLAGS(fflags) and FFLAGS(oflags). - * Open/fcntl flags begin with O_; kernel-internal flags begin with F. - */ -/* open-only flags */ -#define O_RDONLY 0x0000 /* open for reading only */ -#define O_WRONLY 0x0001 /* open for writing only */ -#define O_RDWR 0x0002 /* open for reading and writing */ -#define O_ACCMODE 0x0003 /* mask for above modes */ - -/* - * Kernel encoding of open mode; separate read and write bits that are - * independently testable: 1 greater than the above. - * - * XXX - * FREAD and FWRITE are excluded from the #ifdef KERNEL so that TIOCFLUSH, - * which was documented to use FREAD/FWRITE, continues to work. - */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define FREAD 0x0001 -#define FWRITE 0x0002 -#endif -#define O_NONBLOCK 0x0004 /* no delay */ -#define O_APPEND 0x0008 /* set append mode */ - -#include - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define O_SHLOCK 0x0010 /* open with shared file lock */ -#define O_EXLOCK 0x0020 /* open with exclusive file lock */ -#define O_ASYNC 0x0040 /* signal pgrp when data ready */ -#define O_FSYNC O_SYNC /* source compatibility: do not use */ -#define O_NOFOLLOW 0x0100 /* don't follow symlinks */ -#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ -#define O_CREAT 0x0200 /* create if nonexistant */ -#define O_TRUNC 0x0400 /* truncate to zero length */ -#define O_EXCL 0x0800 /* error if already exists */ - -#if __DARWIN_C_LEVEL >= 200809L -/* - * Descriptor value for the current working directory - */ -#define AT_FDCWD -2 - -/* - * Flags for the at functions - */ -#define AT_EACCESS 0x0010 /* Use effective ids in access check */ -#define AT_SYMLINK_NOFOLLOW 0x0020 /* Act on the symlink itself not the target */ -#define AT_SYMLINK_FOLLOW 0x0040 /* Act on target of symlink */ -#define AT_REMOVEDIR 0x0080 /* Path refers to directory */ -#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL -#define AT_REALDEV 0x0200 /* Return real device inodes resides on for fstatat(2) */ -#define AT_FDONLY 0x0400 /* Use only the fd and Ignore the path for fstatat(2) */ -#endif -#endif - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define O_EVTONLY 0x8000 /* descriptor requested for event notifications only */ -#endif - - -#define O_NOCTTY 0x20000 /* don't assign controlling terminal */ - - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define O_DIRECTORY 0x100000 -#define O_SYMLINK 0x200000 /* allow open of a symlink */ -#endif - -#include - - -#if __DARWIN_C_LEVEL >= 200809L -#define O_CLOEXEC 0x1000000 /* implicitly set FD_CLOEXEC */ -#endif - - - - - -/* Data Protection Flags */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define O_DP_GETRAWENCRYPTED 0x0001 -#define O_DP_GETRAWUNENCRYPTED 0x0002 -#endif - - - -/* - * The O_* flags used to have only F* names, which were used in the kernel - * and by fcntl. We retain the F* names for the kernel f_flags field - * and for backward compatibility for fcntl. - */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define FAPPEND O_APPEND /* kernel/compat */ -#define FASYNC O_ASYNC /* kernel/compat */ -#define FFSYNC O_FSYNC /* kernel */ -#define FFDSYNC O_DSYNC /* kernel */ -#define FNONBLOCK O_NONBLOCK /* kernel */ -#define FNDELAY O_NONBLOCK /* compat */ -#define O_NDELAY O_NONBLOCK /* compat */ -#endif - -/* - * Flags used for copyfile(2) - */ - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define CPF_OVERWRITE 0x0001 -#define CPF_IGNORE_MODE 0x0002 -#define CPF_MASK (CPF_OVERWRITE|CPF_IGNORE_MODE) -#endif - -/* - * Constants used for fcntl(2) - */ - -/* command values */ -#define F_DUPFD 0 /* duplicate file descriptor */ -#define F_GETFD 1 /* get file descriptor flags */ -#define F_SETFD 2 /* set file descriptor flags */ -#define F_GETFL 3 /* get file status flags */ -#define F_SETFL 4 /* set file status flags */ -#define F_GETOWN 5 /* get SIGIO/SIGURG proc/pgrp */ -#define F_SETOWN 6 /* set SIGIO/SIGURG proc/pgrp */ -#define F_GETLK 7 /* get record locking information */ -#define F_SETLK 8 /* set record locking information */ -#define F_SETLKW 9 /* F_SETLK; wait if blocked */ -#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL -#define F_SETLKWTIMEOUT 10 /* F_SETLK; wait if blocked, return on timeout */ -#endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define F_FLUSH_DATA 40 -#define F_CHKCLEAN 41 /* Used for regression test */ -#define F_PREALLOCATE 42 /* Preallocate storage */ -#define F_SETSIZE 43 /* Truncate a file without zeroing space */ -#define F_RDADVISE 44 /* Issue an advisory read async with no copy to user */ -#define F_RDAHEAD 45 /* turn read ahead off/on for this fd */ -/* - * 46,47 used to be F_READBOOTSTRAP and F_WRITEBOOTSTRAP - */ -#define F_NOCACHE 48 /* turn data caching off/on for this fd */ -#define F_LOG2PHYS 49 /* file offset to device offset */ -#define F_GETPATH 50 /* return the full path of the fd */ -#define F_FULLFSYNC 51 /* fsync + ask the drive to flush to the media */ -#define F_PATHPKG_CHECK 52 /* find which component (if any) is a package */ -#define F_FREEZE_FS 53 /* "freeze" all fs operations */ -#define F_THAW_FS 54 /* "thaw" all fs operations */ -#define F_GLOBAL_NOCACHE 55 /* turn data caching off/on (globally) for this file */ - - -#define F_ADDSIGS 59 /* add detached signatures */ - - -#define F_ADDFILESIGS 61 /* add signature from same file (used by dyld for shared libs) */ - -#define F_NODIRECT 62 /* used in conjunction with F_NOCACHE to indicate that DIRECT, synchonous writes */ - /* should not be used (i.e. its ok to temporaily create cached pages) */ - -#define F_GETPROTECTIONCLASS 63 /* Get the protection class of a file from the EA, returns int */ -#define F_SETPROTECTIONCLASS 64 /* Set the protection class of a file for the EA, requires int */ - -#define F_LOG2PHYS_EXT 65 /* file offset to device offset, extended */ - -#define F_GETLKPID 66 /* get record locking information, per-process */ - -/* See F_DUPFD_CLOEXEC below for 67 */ - - -#define F_SETBACKINGSTORE 70 /* Mark the file as being the backing store for another filesystem */ -#define F_GETPATH_MTMINFO 71 /* return the full path of the FD, but error in specific mtmd circumstances */ - -#define F_GETCODEDIR 72 /* Returns the code directory, with associated hashes, to the caller */ - -#define F_SETNOSIGPIPE 73 /* No SIGPIPE generated on EPIPE */ -#define F_GETNOSIGPIPE 74 /* Status of SIGPIPE for this fd */ - -#define F_TRANSCODEKEY 75 /* For some cases, we need to rewrap the key for AKS/MKB */ - -#define F_SINGLE_WRITER 76 /* file being written to a by single writer... if throttling enabled, writes */ - /* may be broken into smaller chunks with throttling in between */ - -#define F_GETPROTECTIONLEVEL 77 /* Get the protection version number for this filesystem */ - -#define F_FINDSIGS 78 /* Add detached code signatures (used by dyld for shared libs) */ - - -#define F_ADDFILESIGS_FOR_DYLD_SIM 83 /* Add signature from same file, only if it is signed by Apple (used by dyld for simulator) */ - - -#define F_BARRIERFSYNC 85 /* fsync + issue barrier to drive */ - - -#define F_ADDFILESIGS_RETURN 97 /* Add signature from same file, return end offset in structure on success */ -#define F_CHECK_LV 98 /* Check if Library Validation allows this Mach-O file to be mapped into the calling process */ - -#define F_PUNCHHOLE 99 /* Deallocate a range of the file */ - -#define F_TRIM_ACTIVE_FILE 100 /* Trim an active file */ - -#define F_SPECULATIVE_READ 101 /* Synchronous advisory read fcntl for regular and compressed file */ - -#define F_GETPATH_NOFIRMLINK 102 /* return the full path without firmlinks of the fd */ - -// FS-specific fcntl()'s numbers begin at 0x00010000 and go up -#define FCNTL_FS_SPECIFIC_BASE 0x00010000 - -#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ - -#if __DARWIN_C_LEVEL >= 200809L -#define F_DUPFD_CLOEXEC 67 /* mark the dup with FD_CLOEXEC */ -#endif - -/* file descriptor flags (F_GETFD, F_SETFD) */ -#define FD_CLOEXEC 1 /* close-on-exec flag */ - -/* record locking flags (F_GETLK, F_SETLK, F_SETLKW) */ -#define F_RDLCK 1 /* shared or read lock */ -#define F_UNLCK 2 /* unlock */ -#define F_WRLCK 3 /* exclusive or write lock */ - - -/* - * [XSI] The values used for l_whence shall be defined as described - * in - */ -#include - -/* - * [XSI] The symbolic names for file modes for use as values of mode_t - * shall be defined as described in - */ -#include - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -/* allocate flags (F_PREALLOCATE) */ - -#define F_ALLOCATECONTIG 0x00000002 /* allocate contigious space */ -#define F_ALLOCATEALL 0x00000004 /* allocate all requested space or no space at all */ - -/* Position Modes (fst_posmode) for F_PREALLOCATE */ - -#define F_PEOFPOSMODE 3 /* Make it past all of the SEEK pos modes so that */ - /* we can keep them in sync should we desire */ -#define F_VOLPOSMODE 4 /* specify volume starting postion */ -#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ - -/* - * Advisory file segment locking data type - - * information passed to system by user - */ -struct flock { - off_t l_start; /* starting offset */ - off_t l_len; /* len = 0 means until end of file */ - pid_t l_pid; /* lock owner */ - short l_type; /* lock type: read/write, etc. */ - short l_whence; /* type of l_start */ -}; - -#include - -#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL -/* - * Advisory file segment locking with time out - - * Information passed to system by user for F_SETLKWTIMEOUT - */ -struct flocktimeout { - struct flock fl; /* flock passed for file locking */ - struct timespec timeout; /* timespec struct for timeout */ -}; -#endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -/* - * advisory file read data type - - * information passed by user to system - */ - - -struct radvisory { - off_t ra_offset; - int ra_count; -}; - - -/** Information the user passes in to get the codeblobs out of the kernel */ -typedef struct fcodeblobs { - void *f_cd_hash; - size_t f_hash_size; - void *f_cd_buffer; - size_t f_cd_size; - unsigned int *f_out_size; - int f_arch; - int __padding; -} fcodeblobs_t; - - -/* - * detached code signatures data type - - * information passed by user to system used by F_ADDSIGS and F_ADDFILESIGS. - * F_ADDFILESIGS is a shortcut for files that contain their own signature and - * doesn't require mapping of the file in order to load the signature. - */ -typedef struct fsignatures { - off_t fs_file_start; - void *fs_blob_start; - size_t fs_blob_size; -} fsignatures_t; - -/* - * DYLD needs to check if the object is allowed to be combined - * into the main binary. This is done between the code signature - * is loaded and dyld is doing all the work to process the LOAD commands. - * - * While this could be done in F_ADDFILESIGS.* family the hook into - * the MAC module doesn't say no when LV isn't enabled and then that - * is cached on the vnode, and the MAC module never gets change once - * a process that library validation enabled. - */ -typedef struct fchecklv { - off_t lv_file_start; - size_t lv_error_message_size; - void *lv_error_message; -} fchecklv_t; - - - -/* lock operations for flock(2) */ -#define LOCK_SH 0x01 /* shared file lock */ -#define LOCK_EX 0x02 /* exclusive file lock */ -#define LOCK_NB 0x04 /* don't block when locking */ -#define LOCK_UN 0x08 /* unlock file */ - -/* fstore_t type used by F_PREALLOCATE command */ - -typedef struct fstore { - unsigned int fst_flags; /* IN: flags word */ - int fst_posmode; /* IN: indicates use of offset field */ - off_t fst_offset; /* IN: start of the region */ - off_t fst_length; /* IN: size of the region */ - off_t fst_bytesalloc; /* OUT: number of bytes allocated */ -} fstore_t; - -/* fpunchhole_t used by F_PUNCHHOLE */ -typedef struct fpunchhole { - unsigned int fp_flags; /* unused */ - unsigned int reserved; /* (to maintain 8-byte alignment) */ - off_t fp_offset; /* IN: start of the region */ - off_t fp_length; /* IN: size of the region */ -} fpunchhole_t; - -/* factive_file_trim_t used by F_TRIM_ACTIVE_FILE */ -typedef struct ftrimactivefile { - off_t fta_offset; /* IN: start of the region */ - off_t fta_length; /* IN: size of the region */ -} ftrimactivefile_t; - -/* fspecread_t used by F_SPECULATIVE_READ */ -typedef struct fspecread { - unsigned int fsr_flags; /* IN: flags word */ - unsigned int reserved; /* to maintain 8-byte alignment */ - off_t fsr_offset; /* IN: start of the region */ - off_t fsr_length; /* IN: size of the region */ -} fspecread_t; - -/* fbootstraptransfer_t used by F_READBOOTSTRAP and F_WRITEBOOTSTRAP commands */ - -typedef struct fbootstraptransfer { - off_t fbt_offset; /* IN: offset to start read/write */ - size_t fbt_length; /* IN: number of bytes to transfer */ - void *fbt_buffer; /* IN: buffer to be read/written */ -} fbootstraptransfer_t; - - -/* - * For F_LOG2PHYS this information is passed back to user - * Currently only devoffset is returned - that is the VOP_BMAP - * result - the disk device address corresponding to the - * current file offset (likely set with an lseek). - * - * The flags could hold an indication of whether the # of - * contiguous bytes reflects the true extent length on disk, - * or is an advisory value that indicates there is at least that - * many bytes contiguous. For some filesystems it might be too - * inefficient to provide anything beyond the advisory value. - * Flags and contiguous bytes return values are not yet implemented. - * For them the fcntl will nedd to switch from using BMAP to CMAP - * and a per filesystem type flag will be needed to interpret the - * contiguous bytes count result from CMAP. - * - * F_LOG2PHYS_EXT is a variant of F_LOG2PHYS that uses a passed in - * file offset and length instead of the current file offset. - * F_LOG2PHYS_EXT operates on the same structure as F_LOG2PHYS, but - * treats it as an in/out. - */ -#pragma pack(4) - -struct log2phys { - unsigned int l2p_flags; /* unused so far */ - off_t l2p_contigbytes; /* F_LOG2PHYS: unused so far */ - /* F_LOG2PHYS_EXT: IN: number of bytes to be queried */ - /* OUT: number of contiguous bytes at this position */ - off_t l2p_devoffset; /* F_LOG2PHYS: OUT: bytes into device */ - /* F_LOG2PHYS_EXT: IN: bytes into file */ - /* OUT: bytes into device */ -}; - -#pragma pack() - -#define O_POPUP 0x80000000 /* force window to popup on open */ -#define O_ALERT 0x20000000 /* small, clean popup window */ - - -#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ - - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) - -#include - -typedef enum { - FILESEC_OWNER = 1, - FILESEC_GROUP = 2, - FILESEC_UUID = 3, - FILESEC_MODE = 4, - FILESEC_ACL = 5, - FILESEC_GRPUUID = 6, - -/* XXX these are private to the implementation */ - FILESEC_ACL_RAW = 100, - FILESEC_ACL_ALLOCSIZE = 101 -} filesec_property_t; - -/* XXX backwards compatibility */ -#define FILESEC_GUID FILESEC_UUID -#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ - -__BEGIN_DECLS -int open(const char *, int, ...) __DARWIN_ALIAS_C(open); -#if __DARWIN_C_LEVEL >= 200809L -int openat(int, const char *, int, ...) __DARWIN_NOCANCEL(openat) __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0); -#endif -int creat(const char *, mode_t) __DARWIN_ALIAS_C(creat); -int fcntl(int, int, ...) __DARWIN_ALIAS_C(fcntl); -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) - -int openx_np(const char *, int, filesec_t); -/* - * data-protected non-portable open(2) : - * int open_dprotected_np(user_addr_t path, int flags, int class, int dpflags, int mode) - */ -int open_dprotected_np( const char *, int, int, int, ...); -int flock(int, int); -filesec_t filesec_init(void); -filesec_t filesec_dup(filesec_t); -void filesec_free(filesec_t); -int filesec_get_property(filesec_t, filesec_property_t, void *); -int filesec_query_property(filesec_t, filesec_property_t, int *); -int filesec_set_property(filesec_t, filesec_property_t, const void *); -int filesec_unset_property(filesec_t, filesec_property_t) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2); -#define _FILESEC_UNSET_PROPERTY ((void *)0) -#define _FILESEC_REMOVE_ACL ((void *)1) -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ -__END_DECLS - -#endif /* !_SYS_FCNTL_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/ioccom.h b/lib/libc/include/x86_64-macos-gnu/sys/ioccom.h deleted file mode 100644 index 39c6964568..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/ioccom.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */ -/*- - * Copyright (c) 1982, 1986, 1990, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)ioccom.h 8.2 (Berkeley) 3/28/94 - */ - -#ifndef _SYS_IOCCOM_H_ -#define _SYS_IOCCOM_H_ - -#include - -/* - * Ioctl's have the command encoded in the lower word, and the size of - * any in or out parameters in the upper word. The high 3 bits of the - * upper word are used to encode the in/out status of the parameter. - */ -#define IOCPARM_MASK 0x1fff /* parameter length, at most 13 bits */ -#define IOCPARM_LEN(x) (((x) >> 16) & IOCPARM_MASK) -#define IOCBASECMD(x) ((x) & ~(IOCPARM_MASK << 16)) -#define IOCGROUP(x) (((x) >> 8) & 0xff) - -#define IOCPARM_MAX (IOCPARM_MASK + 1) /* max size of ioctl args */ -/* no parameters */ -#define IOC_VOID (__uint32_t)0x20000000 -/* copy parameters out */ -#define IOC_OUT (__uint32_t)0x40000000 -/* copy parameters in */ -#define IOC_IN (__uint32_t)0x80000000 -/* copy paramters in and out */ -#define IOC_INOUT (IOC_IN|IOC_OUT) -/* mask for IN/OUT/VOID */ -#define IOC_DIRMASK (__uint32_t)0xe0000000 - -#define _IOC(inout, group, num, len) \ - (inout | ((len & IOCPARM_MASK) << 16) | ((group) << 8) | (num)) -#define _IO(g, n) _IOC(IOC_VOID, (g), (n), 0) -#define _IOR(g, n, t) _IOC(IOC_OUT, (g), (n), sizeof(t)) -#define _IOW(g, n, t) _IOC(IOC_IN, (g), (n), sizeof(t)) -/* this should be _IORW, but stdio got there first */ -#define _IOWR(g, n, t) _IOC(IOC_INOUT, (g), (n), sizeof(t)) - -#endif /* !_SYS_IOCCOM_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/kauth.h b/lib/libc/include/x86_64-macos-gnu/sys/kauth.h deleted file mode 100644 index 99784e35c8..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/kauth.h +++ /dev/null @@ -1,407 +0,0 @@ -/* - * Copyright (c) 2004-2010 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * NOTICE: This file was modified by SPARTA, Inc. in 2005 to introduce - * support for mandatory and extensible security protections. This notice - * is included in support of clause 2.2 (b) of the Apple Public License, - * Version 2.0. - */ - -#ifndef _SYS_KAUTH_H -#define _SYS_KAUTH_H - -#include -#include -#include -#include /* __offsetof() */ -#include /* NGROUPS_MAX */ - -#ifdef __APPLE_API_EVOLVING - -/* - * Identities. - */ - -#define KAUTH_UID_NONE (~(uid_t)0 - 100) /* not a valid UID */ -#define KAUTH_GID_NONE (~(gid_t)0 - 100) /* not a valid GID */ - -#include - -/* NT Security Identifier, structure as defined by Microsoft */ -#pragma pack(1) /* push packing of 1 byte */ -typedef struct { - u_int8_t sid_kind; - u_int8_t sid_authcount; - u_int8_t sid_authority[6]; -#define KAUTH_NTSID_MAX_AUTHORITIES 16 - u_int32_t sid_authorities[KAUTH_NTSID_MAX_AUTHORITIES]; -} ntsid_t; -#pragma pack() /* pop packing to previous packing level */ -#define _NTSID_T - -/* valid byte count inside a SID structure */ -#define KAUTH_NTSID_HDRSIZE (8) -#define KAUTH_NTSID_SIZE(_s) (KAUTH_NTSID_HDRSIZE + ((_s)->sid_authcount * sizeof(u_int32_t))) - -/* - * External lookup message payload; this structure is shared between the - * kernel group membership resolver, and the user space group membership - * resolver daemon, and is use to communicate resolution requests from the - * kernel to user space, and the result of that request from user space to - * the kernel. - */ -struct kauth_identity_extlookup { - u_int32_t el_seqno; /* request sequence number */ - u_int32_t el_result; /* lookup result */ -#define KAUTH_EXTLOOKUP_SUCCESS 0 /* results here are good */ -#define KAUTH_EXTLOOKUP_BADRQ 1 /* request badly formatted */ -#define KAUTH_EXTLOOKUP_FAILURE 2 /* transient failure during lookup */ -#define KAUTH_EXTLOOKUP_FATAL 3 /* permanent failure during lookup */ -#define KAUTH_EXTLOOKUP_INPROG 100 /* request in progress */ - u_int32_t el_flags; -#define KAUTH_EXTLOOKUP_VALID_UID (1<<0) -#define KAUTH_EXTLOOKUP_VALID_UGUID (1<<1) -#define KAUTH_EXTLOOKUP_VALID_USID (1<<2) -#define KAUTH_EXTLOOKUP_VALID_GID (1<<3) -#define KAUTH_EXTLOOKUP_VALID_GGUID (1<<4) -#define KAUTH_EXTLOOKUP_VALID_GSID (1<<5) -#define KAUTH_EXTLOOKUP_WANT_UID (1<<6) -#define KAUTH_EXTLOOKUP_WANT_UGUID (1<<7) -#define KAUTH_EXTLOOKUP_WANT_USID (1<<8) -#define KAUTH_EXTLOOKUP_WANT_GID (1<<9) -#define KAUTH_EXTLOOKUP_WANT_GGUID (1<<10) -#define KAUTH_EXTLOOKUP_WANT_GSID (1<<11) -#define KAUTH_EXTLOOKUP_WANT_MEMBERSHIP (1<<12) -#define KAUTH_EXTLOOKUP_VALID_MEMBERSHIP (1<<13) -#define KAUTH_EXTLOOKUP_ISMEMBER (1<<14) -#define KAUTH_EXTLOOKUP_VALID_PWNAM (1<<15) -#define KAUTH_EXTLOOKUP_WANT_PWNAM (1<<16) -#define KAUTH_EXTLOOKUP_VALID_GRNAM (1<<17) -#define KAUTH_EXTLOOKUP_WANT_GRNAM (1<<18) -#define KAUTH_EXTLOOKUP_VALID_SUPGRPS (1<<19) -#define KAUTH_EXTLOOKUP_WANT_SUPGRPS (1<<20) - - __darwin_pid_t el_info_pid; /* request on behalf of PID */ - u_int64_t el_extend; /* extension field */ - u_int32_t el_info_reserved_1; /* reserved (APPLE) */ - - uid_t el_uid; /* user ID */ - guid_t el_uguid; /* user GUID */ - u_int32_t el_uguid_valid; /* TTL on translation result (seconds) */ - ntsid_t el_usid; /* user NT SID */ - u_int32_t el_usid_valid; /* TTL on translation result (seconds) */ - gid_t el_gid; /* group ID */ - guid_t el_gguid; /* group GUID */ - u_int32_t el_gguid_valid; /* TTL on translation result (seconds) */ - ntsid_t el_gsid; /* group SID */ - u_int32_t el_gsid_valid; /* TTL on translation result (seconds) */ - u_int32_t el_member_valid; /* TTL on group lookup result */ - u_int32_t el_sup_grp_cnt; /* count of supplemental groups up to NGROUPS */ - gid_t el_sup_groups[NGROUPS_MAX]; /* supplemental group list */ -}; - -struct kauth_cache_sizes { - u_int32_t kcs_group_size; - u_int32_t kcs_id_size; -}; - -#define KAUTH_EXTLOOKUP_REGISTER (0) -#define KAUTH_EXTLOOKUP_RESULT (1<<0) -#define KAUTH_EXTLOOKUP_WORKER (1<<1) -#define KAUTH_EXTLOOKUP_DEREGISTER (1<<2) -#define KAUTH_GET_CACHE_SIZES (1<<3) -#define KAUTH_SET_CACHE_SIZES (1<<4) -#define KAUTH_CLEAR_CACHES (1<<5) - -#define IDENTITYSVC_ENTITLEMENT "com.apple.private.identitysvc" - - - -/* - * Generic Access Control Lists. - */ -#if defined(KERNEL) || defined (_SYS_ACL_H) - -typedef u_int32_t kauth_ace_rights_t; - -/* Access Control List Entry (ACE) */ -struct kauth_ace { - guid_t ace_applicable; - u_int32_t ace_flags; -#define KAUTH_ACE_KINDMASK 0xf -#define KAUTH_ACE_PERMIT 1 -#define KAUTH_ACE_DENY 2 -#define KAUTH_ACE_AUDIT 3 /* not implemented */ -#define KAUTH_ACE_ALARM 4 /* not implemented */ -#define KAUTH_ACE_INHERITED (1<<4) -#define KAUTH_ACE_FILE_INHERIT (1<<5) -#define KAUTH_ACE_DIRECTORY_INHERIT (1<<6) -#define KAUTH_ACE_LIMIT_INHERIT (1<<7) -#define KAUTH_ACE_ONLY_INHERIT (1<<8) -#define KAUTH_ACE_SUCCESS (1<<9) /* not implemented (AUDIT/ALARM) */ -#define KAUTH_ACE_FAILURE (1<<10) /* not implemented (AUDIT/ALARM) */ -/* All flag bits controlling ACE inheritance */ -#define KAUTH_ACE_INHERIT_CONTROL_FLAGS \ - (KAUTH_ACE_FILE_INHERIT | \ - KAUTH_ACE_DIRECTORY_INHERIT | \ - KAUTH_ACE_LIMIT_INHERIT | \ - KAUTH_ACE_ONLY_INHERIT) - kauth_ace_rights_t ace_rights; /* scope specific */ - /* These rights are never tested, but may be present in an ACL */ -#define KAUTH_ACE_GENERIC_ALL (1<<21) -#define KAUTH_ACE_GENERIC_EXECUTE (1<<22) -#define KAUTH_ACE_GENERIC_WRITE (1<<23) -#define KAUTH_ACE_GENERIC_READ (1<<24) -}; - -#ifndef _KAUTH_ACE -#define _KAUTH_ACE -typedef struct kauth_ace *kauth_ace_t; -#endif - - -/* Access Control List */ -struct kauth_acl { - u_int32_t acl_entrycount; - u_int32_t acl_flags; - - struct kauth_ace acl_ace[1]; -}; - -/* - * XXX this value needs to be raised - 3893388 - */ -#define KAUTH_ACL_MAX_ENTRIES 128 - -/* - * The low 16 bits of the flags field are reserved for filesystem - * internal use and must be preserved by all APIs. This includes - * round-tripping flags through user-space interfaces. - */ -#define KAUTH_ACL_FLAGS_PRIVATE (0xffff) - -/* - * The high 16 bits of the flags are used to store attributes and - * to request specific handling of the ACL. - */ - -/* inheritance will be deferred until the first rename operation */ -#define KAUTH_ACL_DEFER_INHERIT (1<<16) -/* this ACL must not be overwritten as part of an inheritance operation */ -#define KAUTH_ACL_NO_INHERIT (1<<17) - -/* acl_entrycount that tells us the ACL is not valid */ -#define KAUTH_FILESEC_NOACL ((u_int32_t)(-1)) - -/* - * If the acl_entrycount field is KAUTH_FILESEC_NOACL, then the size is the - * same as a kauth_acl structure; the intent is to put an actual entrycount of - * KAUTH_FILESEC_NOACL on disk to distinguish a kauth_filesec_t with an empty - * entry (Windows treats this as "deny all") from one that merely indicates a - * file group and/or owner guid values. - */ -#define KAUTH_ACL_SIZE(c) (__offsetof(struct kauth_acl, acl_ace) + ((u_int32_t)(c) != KAUTH_FILESEC_NOACL ? ((c) * sizeof(struct kauth_ace)) : 0)) -#define KAUTH_ACL_COPYSIZE(p) KAUTH_ACL_SIZE((p)->acl_entrycount) - - -#ifndef _KAUTH_ACL -#define _KAUTH_ACL -typedef struct kauth_acl *kauth_acl_t; -#endif - - - -/* - * Extended File Security. - */ - -/* File Security information */ -struct kauth_filesec { - u_int32_t fsec_magic; -#define KAUTH_FILESEC_MAGIC 0x012cc16d - guid_t fsec_owner; - guid_t fsec_group; - - struct kauth_acl fsec_acl; -}; - -/* backwards compatibility */ -#define fsec_entrycount fsec_acl.acl_entrycount -#define fsec_flags fsec_acl.acl_flags -#define fsec_ace fsec_acl.acl_ace -#define KAUTH_FILESEC_FLAGS_PRIVATE KAUTH_ACL_FLAGS_PRIVATE -#define KAUTH_FILESEC_DEFER_INHERIT KAUTH_ACL_DEFER_INHERIT -#define KAUTH_FILESEC_NO_INHERIT KAUTH_ACL_NO_INHERIT -#define KAUTH_FILESEC_NONE ((kauth_filesec_t)0) -#define KAUTH_FILESEC_WANTED ((kauth_filesec_t)1) - -#ifndef _KAUTH_FILESEC -#define _KAUTH_FILESEC -typedef struct kauth_filesec *kauth_filesec_t; -#endif - -#define KAUTH_FILESEC_SIZE(c) (__offsetof(struct kauth_filesec, fsec_acl) + __offsetof(struct kauth_acl, acl_ace) + (c) * sizeof(struct kauth_ace)) -#define KAUTH_FILESEC_COPYSIZE(p) KAUTH_FILESEC_SIZE(((p)->fsec_entrycount == KAUTH_FILESEC_NOACL) ? 0 : (p)->fsec_entrycount) -#define KAUTH_FILESEC_COUNT(s) (((s) - KAUTH_FILESEC_SIZE(0)) / sizeof(struct kauth_ace)) -#define KAUTH_FILESEC_VALID(s) ((s) >= KAUTH_FILESEC_SIZE(0) && (((s) - KAUTH_FILESEC_SIZE(0)) % sizeof(struct kauth_ace)) == 0) - -#define KAUTH_FILESEC_XATTR "com.apple.system.Security" - -/* Allowable first arguments to kauth_filesec_acl_setendian() */ -#define KAUTH_ENDIAN_HOST 0x00000001 /* set host endianness */ -#define KAUTH_ENDIAN_DISK 0x00000002 /* set disk endianness */ - -#endif /* KERNEL || */ - - - -/* Actions, also rights bits in an ACE */ - -#if defined(KERNEL) || defined (_SYS_ACL_H) -#define KAUTH_VNODE_READ_DATA (1U<<1) -#define KAUTH_VNODE_LIST_DIRECTORY KAUTH_VNODE_READ_DATA -#define KAUTH_VNODE_WRITE_DATA (1U<<2) -#define KAUTH_VNODE_ADD_FILE KAUTH_VNODE_WRITE_DATA -#define KAUTH_VNODE_EXECUTE (1U<<3) -#define KAUTH_VNODE_SEARCH KAUTH_VNODE_EXECUTE -#define KAUTH_VNODE_DELETE (1U<<4) -#define KAUTH_VNODE_APPEND_DATA (1U<<5) -#define KAUTH_VNODE_ADD_SUBDIRECTORY KAUTH_VNODE_APPEND_DATA -#define KAUTH_VNODE_DELETE_CHILD (1U<<6) -#define KAUTH_VNODE_READ_ATTRIBUTES (1U<<7) -#define KAUTH_VNODE_WRITE_ATTRIBUTES (1U<<8) -#define KAUTH_VNODE_READ_EXTATTRIBUTES (1U<<9) -#define KAUTH_VNODE_WRITE_EXTATTRIBUTES (1U<<10) -#define KAUTH_VNODE_READ_SECURITY (1U<<11) -#define KAUTH_VNODE_WRITE_SECURITY (1U<<12) -#define KAUTH_VNODE_TAKE_OWNERSHIP (1U<<13) - -/* backwards compatibility only */ -#define KAUTH_VNODE_CHANGE_OWNER KAUTH_VNODE_TAKE_OWNERSHIP - -/* For Windows interoperability only */ -#define KAUTH_VNODE_SYNCHRONIZE (1U<<20) - -/* (1<<21) - (1<<24) are reserved for generic rights bits */ - -/* Actions not expressed as rights bits */ -/* - * Authorizes the vnode as the target of a hard link. - */ -#define KAUTH_VNODE_LINKTARGET (1U<<25) - -/* - * Indicates that other steps have been taken to authorise the action, - * but authorisation should be denied for immutable objects. - */ -#define KAUTH_VNODE_CHECKIMMUTABLE (1U<<26) - -/* Action modifiers */ -/* - * The KAUTH_VNODE_ACCESS bit is passed to the callback if the authorisation - * request in progress is advisory, rather than authoritative. Listeners - * performing consequential work (i.e. not strictly checking authorisation) - * may test this flag to avoid performing unnecessary work. - * - * This bit will never be present in an ACE. - */ -#define KAUTH_VNODE_ACCESS (1U<<31) - -/* - * The KAUTH_VNODE_NOIMMUTABLE bit is passed to the callback along with the - * KAUTH_VNODE_WRITE_SECURITY bit (and no others) to indicate that the - * caller wishes to change one or more of the immutable flags, and the - * state of these flags should not be considered when authorizing the request. - * The system immutable flags are only ignored when the system securelevel - * is low enough to allow their removal. - */ -#define KAUTH_VNODE_NOIMMUTABLE (1U<<30) - - -/* - * fake right that is composed by the following... - * vnode must have search for owner, group and world allowed - * plus there must be no deny modes present for SEARCH... this fake - * right is used by the fast lookup path to avoid checking - * for an exact match on the last credential to lookup - * the component being acted on - */ -#define KAUTH_VNODE_SEARCHBYANYONE (1U<<29) - - -/* - * when passed as an 'action' to "vnode_uncache_authorized_actions" - * it indicates that all of the cached authorizations for that - * vnode should be invalidated - */ -#define KAUTH_INVALIDATE_CACHED_RIGHTS ((kauth_action_t)~0) - - - -/* The expansions of the GENERIC bits at evaluation time */ -#define KAUTH_VNODE_GENERIC_READ_BITS (KAUTH_VNODE_READ_DATA | \ - KAUTH_VNODE_READ_ATTRIBUTES | \ - KAUTH_VNODE_READ_EXTATTRIBUTES | \ - KAUTH_VNODE_READ_SECURITY) - -#define KAUTH_VNODE_GENERIC_WRITE_BITS (KAUTH_VNODE_WRITE_DATA | \ - KAUTH_VNODE_APPEND_DATA | \ - KAUTH_VNODE_DELETE | \ - KAUTH_VNODE_DELETE_CHILD | \ - KAUTH_VNODE_WRITE_ATTRIBUTES | \ - KAUTH_VNODE_WRITE_EXTATTRIBUTES | \ - KAUTH_VNODE_WRITE_SECURITY) - -#define KAUTH_VNODE_GENERIC_EXECUTE_BITS (KAUTH_VNODE_EXECUTE) - -#define KAUTH_VNODE_GENERIC_ALL_BITS (KAUTH_VNODE_GENERIC_READ_BITS | \ - KAUTH_VNODE_GENERIC_WRITE_BITS | \ - KAUTH_VNODE_GENERIC_EXECUTE_BITS) - -/* - * Some sets of bits, defined here for convenience. - */ -#define KAUTH_VNODE_WRITE_RIGHTS (KAUTH_VNODE_ADD_FILE | \ - KAUTH_VNODE_ADD_SUBDIRECTORY | \ - KAUTH_VNODE_DELETE_CHILD | \ - KAUTH_VNODE_WRITE_DATA | \ - KAUTH_VNODE_APPEND_DATA | \ - KAUTH_VNODE_DELETE | \ - KAUTH_VNODE_WRITE_ATTRIBUTES | \ - KAUTH_VNODE_WRITE_EXTATTRIBUTES | \ - KAUTH_VNODE_WRITE_SECURITY | \ - KAUTH_VNODE_TAKE_OWNERSHIP | \ - KAUTH_VNODE_LINKTARGET | \ - KAUTH_VNODE_CHECKIMMUTABLE) - - -#endif /* KERNEL || */ - - -#endif /* __APPLE_API_EVOLVING */ -#endif /* _SYS_KAUTH_H */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/kern_control.h b/lib/libc/include/x86_64-macos-gnu/sys/kern_control.h deleted file mode 100644 index be74e7d09e..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/kern_control.h +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright (c) 2000-2004, 2012-2016 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/*! - * @header kern_control.h - * This header defines an API to communicate between a kernel - * extension and a process outside of the kernel. - */ - -#ifndef KPI_KERN_CONTROL_H -#define KPI_KERN_CONTROL_H - - -#include -#include -#include -#include - -/* - * Define Controller event subclass, and associated events. - * Subclass of KEV_SYSTEM_CLASS - */ - -/*! - * @defined KEV_CTL_SUBCLASS - * @discussion The kernel event subclass for kernel control events. - */ -#define KEV_CTL_SUBCLASS 2 - -/*! - * @defined KEV_CTL_REGISTERED - * @discussion The event code indicating a new controller was - * registered. The data portion will contain a ctl_event_data. - */ -#define KEV_CTL_REGISTERED 1 /* a new controller appears */ - -/*! - * @defined KEV_CTL_DEREGISTERED - * @discussion The event code indicating a controller was unregistered. - * The data portion will contain a ctl_event_data. - */ -#define KEV_CTL_DEREGISTERED 2 /* a controller disappears */ - -/*! - * @struct ctl_event_data - * @discussion This structure is used for KEV_CTL_SUBCLASS kernel - * events. - * @field ctl_id The kernel control id. - * @field ctl_unit The kernel control unit. - */ -struct ctl_event_data { - u_int32_t ctl_id; /* Kernel Controller ID */ - u_int32_t ctl_unit; -}; - -/* - * Controls destined to the Controller Manager. - */ - -/*! - * @defined CTLIOCGCOUNT - * @discussion The CTLIOCGCOUNT ioctl can be used to determine the - * number of kernel controllers registered. - */ -#define CTLIOCGCOUNT _IOR('N', 2, int) /* get number of control structures registered */ - -/*! - * @defined CTLIOCGINFO - * @discussion The CTLIOCGINFO ioctl can be used to convert a kernel - * control name to a kernel control id. - */ -#define CTLIOCGINFO _IOWR('N', 3, struct ctl_info) /* get id from name */ - - -/*! - * @defined MAX_KCTL_NAME - * @discussion Kernel control names must be no longer than - * MAX_KCTL_NAME. - */ -#define MAX_KCTL_NAME 96 - -/* - * Controls destined to the Controller Manager. - */ - -/*! - * @struct ctl_info - * @discussion This structure is used with the CTLIOCGINFO ioctl to - * translate from a kernel control name to a control id. - * @field ctl_id The kernel control id, filled out upon return. - * @field ctl_name The kernel control name to find. - */ -struct ctl_info { - u_int32_t ctl_id; /* Kernel Controller ID */ - char ctl_name[MAX_KCTL_NAME]; /* Kernel Controller Name (a C string) */ -}; - - -/*! - * @struct sockaddr_ctl - * @discussion The controller address structure is used to establish - * contact between a user client and a kernel controller. The - * sc_id/sc_unit uniquely identify each controller. sc_id is a - * unique identifier assigned to the controller. The identifier can - * be assigned by the system at registration time or be a 32-bit - * creator code obtained from Apple Computer. sc_unit is a unit - * number for this sc_id, and is privately used by the kernel - * controller to identify several instances of the controller. - * @field sc_len The length of the structure. - * @field sc_family AF_SYSTEM. - * @field ss_sysaddr AF_SYS_KERNCONTROL. - * @field sc_id Controller unique identifier. - * @field sc_unit Kernel controller private unit number. - * @field sc_reserved Reserved, must be set to zero. - */ -struct sockaddr_ctl { - u_char sc_len; /* depends on size of bundle ID string */ - u_char sc_family; /* AF_SYSTEM */ - u_int16_t ss_sysaddr; /* AF_SYS_KERNCONTROL */ - u_int32_t sc_id; /* Controller unique identifier */ - u_int32_t sc_unit; /* Developer private unit number */ - u_int32_t sc_reserved[5]; -}; - - - -#endif /* KPI_KERN_CONTROL_H */ diff --git a/lib/libc/include/x86_64-macos-gnu/sys/mman.h b/lib/libc/include/x86_64-macos-gnu/sys/mman.h deleted file mode 100644 index fec1caac71..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/mman.h +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Copyright (c) 2000-2019 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */ -/*- - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)mman.h 8.1 (Berkeley) 6/2/93 - */ - -/* - * Currently unsupported: - * - * [TYM] POSIX_TYPED_MEM_ALLOCATE - * [TYM] POSIX_TYPED_MEM_ALLOCATE_CONTIG - * [TYM] POSIX_TYPED_MEM_MAP_ALLOCATABLE - * [TYM] struct posix_typed_mem_info - * [TYM] posix_mem_offset() - * [TYM] posix_typed_mem_get_info() - * [TYM] posix_typed_mem_open() - */ - -#ifndef _SYS_MMAN_H_ -#define _SYS_MMAN_H_ - -#include -#include - -#include - -/* - * [various] The mode_t, off_t, and size_t types shall be defined as - * described in - */ -#include -#include -#include - -/* - * Protections are chosen from these bits, or-ed together - */ -#define PROT_NONE 0x00 /* [MC2] no permissions */ -#define PROT_READ 0x01 /* [MC2] pages can be read */ -#define PROT_WRITE 0x02 /* [MC2] pages can be written */ -#define PROT_EXEC 0x04 /* [MC2] pages can be executed */ - -/* - * Flags contain sharing type and options. - * Sharing types; choose one. - */ -#define MAP_SHARED 0x0001 /* [MF|SHM] share changes */ -#define MAP_PRIVATE 0x0002 /* [MF|SHM] changes are private */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define MAP_COPY MAP_PRIVATE /* Obsolete */ -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ - -/* - * Other flags - */ -#define MAP_FIXED 0x0010 /* [MF|SHM] interpret addr exactly */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define MAP_RENAME 0x0020 /* Sun: rename private pages to file */ -#define MAP_NORESERVE 0x0040 /* Sun: don't reserve needed swap area */ -#define MAP_RESERVED0080 0x0080 /* previously unimplemented MAP_INHERIT */ -#define MAP_NOEXTEND 0x0100 /* for MAP_FILE, don't change file size */ -#define MAP_HASSEMAPHORE 0x0200 /* region may contain semaphores */ -#define MAP_NOCACHE 0x0400 /* don't cache pages for this mapping */ -#define MAP_JIT 0x0800 /* Allocate a region that will be used for JIT purposes */ - -/* - * Mapping type - */ -#define MAP_FILE 0x0000 /* map from file (default) */ -#define MAP_ANON 0x1000 /* allocated from memory, swap space */ -#define MAP_ANONYMOUS MAP_ANON - -/* - * The MAP_RESILIENT_* flags can be used when the caller wants to map some - * possibly unreliable memory and be able to access it safely, possibly - * getting the wrong contents rather than raising any exception. - * For safety reasons, such mappings have to be read-only (PROT_READ access - * only). - * - * MAP_RESILIENT_CODESIGN: - * accessing this mapping will not generate code-signing violations, - * even if the contents are tainted. - * MAP_RESILIENT_MEDIA: - * accessing this mapping will not generate an exception if the contents - * are not available (unreachable removable or remote media, access beyond - * end-of-file, ...). Missing contents will be replaced with zeroes. - */ -#define MAP_RESILIENT_CODESIGN 0x2000 /* no code-signing failures */ -#define MAP_RESILIENT_MEDIA 0x4000 /* no backing-store failures */ - -#if !defined(CONFIG_EMBEDDED) -#define MAP_32BIT 0x8000 /* Return virtual addresses <4G only: Requires entitlement */ -#endif /* !defined(CONFIG_EMBEDDED) */ - -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ - -/* - * Process memory locking - */ -#define MCL_CURRENT 0x0001 /* [ML] Lock only current memory */ -#define MCL_FUTURE 0x0002 /* [ML] Lock all future memory as well */ - -/* - * Error return from mmap() - */ -#define MAP_FAILED ((void *)-1) /* [MF|SHM] mmap failed */ - -/* - * msync() flags - */ -#define MS_ASYNC 0x0001 /* [MF|SIO] return immediately */ -#define MS_INVALIDATE 0x0002 /* [MF|SIO] invalidate all cached data */ -#define MS_SYNC 0x0010 /* [MF|SIO] msync synchronously */ - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define MS_KILLPAGES 0x0004 /* invalidate pages, leave mapped */ -#define MS_DEACTIVATE 0x0008 /* deactivate pages, leave mapped */ - -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ - - -/* - * Advice to madvise - */ -#define POSIX_MADV_NORMAL 0 /* [MC1] no further special treatment */ -#define POSIX_MADV_RANDOM 1 /* [MC1] expect random page refs */ -#define POSIX_MADV_SEQUENTIAL 2 /* [MC1] expect sequential page refs */ -#define POSIX_MADV_WILLNEED 3 /* [MC1] will need these pages */ -#define POSIX_MADV_DONTNEED 4 /* [MC1] dont need these pages */ - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define MADV_NORMAL POSIX_MADV_NORMAL -#define MADV_RANDOM POSIX_MADV_RANDOM -#define MADV_SEQUENTIAL POSIX_MADV_SEQUENTIAL -#define MADV_WILLNEED POSIX_MADV_WILLNEED -#define MADV_DONTNEED POSIX_MADV_DONTNEED -#define MADV_FREE 5 /* pages unneeded, discard contents */ -#define MADV_ZERO_WIRED_PAGES 6 /* zero the wired pages that have not been unwired before the entry is deleted */ -#define MADV_FREE_REUSABLE 7 /* pages can be reused (by anyone) */ -#define MADV_FREE_REUSE 8 /* caller wants to reuse those pages */ -#define MADV_CAN_REUSE 9 -#define MADV_PAGEOUT 10 /* page out now (internal only) */ - -/* - * Return bits from mincore - */ -#define MINCORE_INCORE 0x1 /* Page is incore */ -#define MINCORE_REFERENCED 0x2 /* Page has been referenced by us */ -#define MINCORE_MODIFIED 0x4 /* Page has been modified by us */ -#define MINCORE_REFERENCED_OTHER 0x8 /* Page has been referenced */ -#define MINCORE_MODIFIED_OTHER 0x10 /* Page has been modified */ -#define MINCORE_PAGED_OUT 0x20 /* Page has been paged out */ -#define MINCORE_COPIED 0x40 /* Page has been copied */ -#define MINCORE_ANONYMOUS 0x80 /* Page belongs to an anonymous object */ -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ - - - -__BEGIN_DECLS -/* [ML] */ -int mlockall(int); -int munlockall(void); -/* [MR] */ -int mlock(const void *, size_t); -#ifndef _MMAP -#define _MMAP -/* [MC3]*/ -void * mmap(void *, size_t, int, int, int, off_t) __DARWIN_ALIAS(mmap); -#endif -/* [MPR] */ -int mprotect(void *, size_t, int) __DARWIN_ALIAS(mprotect); -/* [MF|SIO] */ -int msync(void *, size_t, int) __DARWIN_ALIAS_C(msync); -/* [MR] */ -int munlock(const void *, size_t); -/* [MC3]*/ -int munmap(void *, size_t) __DARWIN_ALIAS(munmap); -/* [SHM] */ -int shm_open(const char *, int, ...); -int shm_unlink(const char *); -/* [ADV] */ -int posix_madvise(void *, size_t, int); - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -int madvise(void *, size_t, int); -int mincore(const void *, size_t, char *); -int minherit(void *, size_t, int); -#endif - - -__END_DECLS - -#endif /* !_SYS_MMAN_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/mount.h b/lib/libc/include/x86_64-macos-gnu/sys/mount.h deleted file mode 100644 index 0a77b455a6..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/mount.h +++ /dev/null @@ -1,423 +0,0 @@ -/* - * Copyright (c) 2000-2018 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */ -/* - * Copyright (c) 1989, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)mount.h 8.21 (Berkeley) 5/20/95 - */ -/* - * NOTICE: This file was modified by SPARTA, Inc. in 2005 to introduce - * support for mandatory and extensible security protections. This notice - * is included in support of clause 2.2 (b) of the Apple Public License, - * Version 2.0. - */ - - -#ifndef _SYS_MOUNT_H_ -#define _SYS_MOUNT_H_ - -#include -#include -#include /* needed for vol_capabilities_attr_t */ -#include - -#include -#include -#include /* XXX needed for user builds */ -#include - -#include /* file system id type */ - -/* - * file system statistics - */ - -#define MFSNAMELEN 15 /* length of fs type name, not inc. null */ -#define MFSTYPENAMELEN 16 /* length of fs type name including null */ - -#if __DARWIN_64_BIT_INO_T -#define MNAMELEN MAXPATHLEN /* length of buffer for returned name */ -#else /* ! __DARWIN_64_BIT_INO_T */ -#define MNAMELEN 90 /* length of buffer for returned name */ -#endif /* __DARWIN_64_BIT_INO_T */ - -#define MNT_EXT_ROOT_DATA_VOL 0x00000001 /* Data volume of root volume group */ - -#define __DARWIN_STRUCT_STATFS64 { \ - uint32_t f_bsize; /* fundamental file system block size */ \ - int32_t f_iosize; /* optimal transfer block size */ \ - uint64_t f_blocks; /* total data blocks in file system */ \ - uint64_t f_bfree; /* free blocks in fs */ \ - uint64_t f_bavail; /* free blocks avail to non-superuser */ \ - uint64_t f_files; /* total file nodes in file system */ \ - uint64_t f_ffree; /* free file nodes in fs */ \ - fsid_t f_fsid; /* file system id */ \ - uid_t f_owner; /* user that mounted the filesystem */ \ - uint32_t f_type; /* type of filesystem */ \ - uint32_t f_flags; /* copy of mount exported flags */ \ - uint32_t f_fssubtype; /* fs sub-type (flavor) */ \ - char f_fstypename[MFSTYPENAMELEN]; /* fs type name */ \ - char f_mntonname[MAXPATHLEN]; /* directory on which mounted */ \ - char f_mntfromname[MAXPATHLEN]; /* mounted filesystem */ \ - uint32_t f_flags_ext; /* extended flags */ \ - uint32_t f_reserved[7]; /* For future use */ \ -} - -#if !__DARWIN_ONLY_64_BIT_INO_T - -struct statfs64 __DARWIN_STRUCT_STATFS64; - -#endif /* !__DARWIN_ONLY_64_BIT_INO_T */ - -#if __DARWIN_64_BIT_INO_T - -struct statfs __DARWIN_STRUCT_STATFS64; - -#else /* !__DARWIN_64_BIT_INO_T */ - -/* - * LP64 - WARNING - must be kept in sync with struct user_statfs in mount_internal.h. - */ -struct statfs { - short f_otype; /* TEMPORARY SHADOW COPY OF f_type */ - short f_oflags; /* TEMPORARY SHADOW COPY OF f_flags */ - long f_bsize; /* fundamental file system block size */ - long f_iosize; /* optimal transfer block size */ - long f_blocks; /* total data blocks in file system */ - long f_bfree; /* free blocks in fs */ - long f_bavail; /* free blocks avail to non-superuser */ - long f_files; /* total file nodes in file system */ - long f_ffree; /* free file nodes in fs */ - fsid_t f_fsid; /* file system id */ - uid_t f_owner; /* user that mounted the filesystem */ - short f_reserved1; /* spare for later */ - short f_type; /* type of filesystem */ - long f_flags; /* copy of mount exported flags */ - long f_reserved2[2]; /* reserved for future use */ - char f_fstypename[MFSNAMELEN]; /* fs type name */ - char f_mntonname[MNAMELEN]; /* directory on which mounted */ - char f_mntfromname[MNAMELEN];/* mounted filesystem */ - char f_reserved3; /* For alignment */ - long f_reserved4[4]; /* For future use */ -}; - -#endif /* __DARWIN_64_BIT_INO_T */ - -#pragma pack(4) - -struct vfsstatfs { - uint32_t f_bsize; /* fundamental file system block size */ - size_t f_iosize; /* optimal transfer block size */ - uint64_t f_blocks; /* total data blocks in file system */ - uint64_t f_bfree; /* free blocks in fs */ - uint64_t f_bavail; /* free blocks avail to non-superuser */ - uint64_t f_bused; /* free blocks avail to non-superuser */ - uint64_t f_files; /* total file nodes in file system */ - uint64_t f_ffree; /* free file nodes in fs */ - fsid_t f_fsid; /* file system id */ - uid_t f_owner; /* user that mounted the filesystem */ - uint64_t f_flags; /* copy of mount exported flags */ - char f_fstypename[MFSTYPENAMELEN];/* fs type name inclus */ - char f_mntonname[MAXPATHLEN];/* directory on which mounted */ - char f_mntfromname[MAXPATHLEN];/* mounted filesystem */ - uint32_t f_fssubtype; /* fs sub-type (flavor) */ - void *f_reserved[2]; /* For future use == 0 */ -}; - -#pragma pack() - - -/* - * User specifiable flags. - * - * Unmount uses MNT_FORCE flag. - */ -#define MNT_RDONLY 0x00000001 /* read only filesystem */ -#define MNT_SYNCHRONOUS 0x00000002 /* file system written synchronously */ -#define MNT_NOEXEC 0x00000004 /* can't exec from filesystem */ -#define MNT_NOSUID 0x00000008 /* don't honor setuid bits on fs */ -#define MNT_NODEV 0x00000010 /* don't interpret special files */ -#define MNT_UNION 0x00000020 /* union with underlying filesystem */ -#define MNT_ASYNC 0x00000040 /* file system written asynchronously */ -#define MNT_CPROTECT 0x00000080 /* file system supports content protection */ - -/* - * NFS export related mount flags. - */ -#define MNT_EXPORTED 0x00000100 /* file system is exported */ - -/* - * Denotes storage which can be removed from the system by the user. - */ - -#define MNT_REMOVABLE 0x00000200 - -/* - * MAC labeled / "quarantined" flag - */ -#define MNT_QUARANTINE 0x00000400 /* file system is quarantined */ - -/* - * Flags set by internal operations. - */ -#define MNT_LOCAL 0x00001000 /* filesystem is stored locally */ -#define MNT_QUOTA 0x00002000 /* quotas are enabled on filesystem */ -#define MNT_ROOTFS 0x00004000 /* identifies the root filesystem */ -#define MNT_DOVOLFS 0x00008000 /* FS supports volfs (deprecated flag in Mac OS X 10.5) */ - - -#define MNT_DONTBROWSE 0x00100000 /* file system is not appropriate path to user data */ -#define MNT_IGNORE_OWNERSHIP 0x00200000 /* VFS will ignore ownership information on filesystem objects */ -#define MNT_AUTOMOUNTED 0x00400000 /* filesystem was mounted by automounter */ -#define MNT_JOURNALED 0x00800000 /* filesystem is journaled */ -#define MNT_NOUSERXATTR 0x01000000 /* Don't allow user extended attributes */ -#define MNT_DEFWRITE 0x02000000 /* filesystem should defer writes */ -#define MNT_MULTILABEL 0x04000000 /* MAC support for individual labels */ -#define MNT_NOATIME 0x10000000 /* disable update of file access time */ -#define MNT_SNAPSHOT 0x40000000 /* The mount is a snapshot */ -#define MNT_STRICTATIME 0x80000000 /* enable strict update of file access time */ - -/* backwards compatibility only */ -#define MNT_UNKNOWNPERMISSIONS MNT_IGNORE_OWNERSHIP - - -/* - * XXX I think that this could now become (~(MNT_CMDFLAGS)) - * but the 'mount' program may need changing to handle this. - */ -#define MNT_VISFLAGMASK (MNT_RDONLY | MNT_SYNCHRONOUS | MNT_NOEXEC | \ - MNT_NOSUID | MNT_NODEV | MNT_UNION | \ - MNT_ASYNC | MNT_EXPORTED | MNT_QUARANTINE | \ - MNT_LOCAL | MNT_QUOTA | MNT_REMOVABLE | \ - MNT_ROOTFS | MNT_DOVOLFS | MNT_DONTBROWSE | \ - MNT_IGNORE_OWNERSHIP | MNT_AUTOMOUNTED | MNT_JOURNALED | \ - MNT_NOUSERXATTR | MNT_DEFWRITE | MNT_MULTILABEL | \ - MNT_NOATIME | MNT_STRICTATIME | MNT_SNAPSHOT | MNT_CPROTECT) -/* - * External filesystem command modifier flags. - * Unmount can use the MNT_FORCE flag. - * XXX These are not STATES and really should be somewhere else. - * External filesystem control flags. - */ -#define MNT_UPDATE 0x00010000 /* not a real mount, just an update */ -#define MNT_NOBLOCK 0x00020000 /* don't block unmount if not responding */ -#define MNT_RELOAD 0x00040000 /* reload filesystem data */ -#define MNT_FORCE 0x00080000 /* force unmount or readonly change */ -#define MNT_CMDFLAGS (MNT_UPDATE|MNT_NOBLOCK|MNT_RELOAD|MNT_FORCE) - - - -/* - * Sysctl CTL_VFS definitions. - * - * Second level identifier specifies which filesystem. Second level - * identifier VFS_GENERIC returns information about all filesystems. - */ -#define VFS_GENERIC 0 /* generic filesystem information */ -#define VFS_NUMMNTOPS 1 /* int: total num of vfs mount/unmount operations */ -/* - * Third level identifiers for VFS_GENERIC are given below; third - * level identifiers for specific filesystems are given in their - * mount specific header files. - */ -#define VFS_MAXTYPENUM 1 /* int: highest defined filesystem type */ -#define VFS_CONF 2 /* struct: vfsconf for filesystem given - * as next argument */ - -/* - * Flags for various system call interfaces. - * - * waitfor flags to vfs_sync() and getfsstat() - */ -#define MNT_WAIT 1 /* synchronized I/O file integrity completion */ -#define MNT_NOWAIT 2 /* start all I/O, but do not wait for it */ -#define MNT_DWAIT 4 /* synchronized I/O data integrity completion */ - - -#if !defined(KERNEL) && !defined(_KERN_SYS_KERNELTYPES_H_) /* also defined in kernel_types.h */ -struct mount; -typedef struct mount * mount_t; -struct vnode; -typedef struct vnode * vnode_t; -#endif - -/* Reserved fields preserve binary compatibility */ -struct vfsconf { - uint32_t vfc_reserved1; /* opaque */ - char vfc_name[MFSNAMELEN]; /* filesystem type name */ - int vfc_typenum; /* historic filesystem type number */ - int vfc_refcount; /* number mounted of this type */ - int vfc_flags; /* permanent flags */ - uint32_t vfc_reserved2; /* opaque */ - uint32_t vfc_reserved3; /* opaque */ -}; - -struct vfsidctl { - int vc_vers; /* should be VFSIDCTL_VERS1 (below) */ - fsid_t vc_fsid; /* fsid to operate on. */ - void *vc_ptr; /* pointer to data structure. */ - size_t vc_len; /* sizeof said structure. */ - u_int32_t vc_spare[12]; /* spare (must be zero). */ -}; - - -/* vfsidctl API version. */ -#define VFS_CTL_VERS1 0x01 - - -/* - * New style VFS sysctls, do not reuse/conflict with the namespace for - * private sysctls. - */ -#define VFS_CTL_STATFS 0x00010001 /* statfs */ -#define VFS_CTL_UMOUNT 0x00010002 /* unmount */ -#define VFS_CTL_QUERY 0x00010003 /* anything wrong? (vfsquery) */ -#define VFS_CTL_NEWADDR 0x00010004 /* reconnect to new address */ -#define VFS_CTL_TIMEO 0x00010005 /* set timeout for vfs notification */ -#define VFS_CTL_NOLOCKS 0x00010006 /* disable file locking */ -#define VFS_CTL_SADDR 0x00010007 /* get server address */ -#define VFS_CTL_DISC 0x00010008 /* server disconnected */ -#define VFS_CTL_SERVERINFO 0x00010009 /* information about fs server */ -#define VFS_CTL_NSTATUS 0x0001000A /* netfs mount status */ - -struct vfsquery { - u_int32_t vq_flags; - u_int32_t vq_spare[31]; -}; - -struct vfs_server { - int32_t vs_minutes; /* minutes until server goes down. */ - u_int8_t vs_server_name[MAXHOSTNAMELEN * 3]; /* UTF8 server name to display (null terminated) */ -}; - -/* - * NetFS mount status - returned by VFS_CTL_NSTATUS - */ -struct netfs_status { - u_int32_t ns_status; // Current status of mount (vfsquery flags) - char ns_mountopts[512]; // Significant mount options - uint32_t ns_waittime; // Time waiting for reply (sec) - uint32_t ns_threadcount; // Number of threads blocked on network calls - uint64_t ns_threadids[0]; // Thread IDs of those blocked threads -}; - -/* vfsquery flags */ -#define VQ_NOTRESP 0x0001 /* server down */ -#define VQ_NEEDAUTH 0x0002 /* server bad auth */ -#define VQ_LOWDISK 0x0004 /* we're low on space */ -#define VQ_MOUNT 0x0008 /* new filesystem arrived */ -#define VQ_UNMOUNT 0x0010 /* filesystem has left */ -#define VQ_DEAD 0x0020 /* filesystem is dead, needs force unmount */ -#define VQ_ASSIST 0x0040 /* filesystem needs assistance from external program */ -#define VQ_NOTRESPLOCK 0x0080 /* server lockd down */ -#define VQ_UPDATE 0x0100 /* filesystem information has changed */ -#define VQ_VERYLOWDISK 0x0200 /* file system has *very* little disk space left */ -#define VQ_SYNCEVENT 0x0400 /* a sync just happened (not set by kernel starting Mac OS X 10.9) */ -#define VQ_SERVEREVENT 0x0800 /* server issued notification/warning */ -#define VQ_QUOTA 0x1000 /* a user quota has been hit */ -#define VQ_NEARLOWDISK 0x2000 /* Above lowdisk and below desired disk space */ -#define VQ_DESIRED_DISK 0x4000 /* the desired disk space */ -#define VQ_FREE_SPACE_CHANGE 0x8000 /* free disk space has significantly changed */ -#define VQ_FLAG10000 0x10000 /* placeholder */ - - - - -/* - * Generic file handle - */ -#define NFS_MAX_FH_SIZE NFSV4_MAX_FH_SIZE -#define NFSV4_MAX_FH_SIZE 128 -#define NFSV3_MAX_FH_SIZE 64 -#define NFSV2_MAX_FH_SIZE 32 -struct fhandle { - unsigned int fh_len; /* length of file handle */ - unsigned char fh_data[NFS_MAX_FH_SIZE]; /* file handle value */ -}; -typedef struct fhandle fhandle_t; - - -__BEGIN_DECLS -int fhopen(const struct fhandle *, int); -int fstatfs(int, struct statfs *) __DARWIN_INODE64(fstatfs); -#if !__DARWIN_ONLY_64_BIT_INO_T -int fstatfs64(int, struct statfs64 *) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5, __MAC_10_6, __IPHONE_NA, __IPHONE_NA); -#endif /* !__DARWIN_ONLY_64_BIT_INO_T */ -int getfh(const char *, fhandle_t *); -int getfsstat(struct statfs *, int, int) __DARWIN_INODE64(getfsstat); -#if !__DARWIN_ONLY_64_BIT_INO_T -int getfsstat64(struct statfs64 *, int, int) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5, __MAC_10_6, __IPHONE_NA, __IPHONE_NA); -#endif /* !__DARWIN_ONLY_64_BIT_INO_T */ -int getmntinfo(struct statfs **, int) __DARWIN_INODE64(getmntinfo); -int getmntinfo_r_np(struct statfs **, int) __DARWIN_INODE64(getmntinfo_r_np) -__OSX_AVAILABLE(10.13) __IOS_AVAILABLE(11.0) -__TVOS_AVAILABLE(11.0) __WATCHOS_AVAILABLE(4.0); -#if !__DARWIN_ONLY_64_BIT_INO_T -int getmntinfo64(struct statfs64 **, int) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5, __MAC_10_6, __IPHONE_NA, __IPHONE_NA); -#endif /* !__DARWIN_ONLY_64_BIT_INO_T */ -int mount(const char *, const char *, int, void *); -int fmount(const char *, int, int, void *) __OSX_AVAILABLE(10.13) __IOS_AVAILABLE(11.0) __TVOS_AVAILABLE(11.0) __WATCHOS_AVAILABLE(4.0); -int statfs(const char *, struct statfs *) __DARWIN_INODE64(statfs); -#if !__DARWIN_ONLY_64_BIT_INO_T -int statfs64(const char *, struct statfs64 *) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5, __MAC_10_6, __IPHONE_NA, __IPHONE_NA); -#endif /* !__DARWIN_ONLY_64_BIT_INO_T */ -int unmount(const char *, int); -int getvfsbyname(const char *, struct vfsconf *); -__END_DECLS - -#endif /* !_SYS_MOUNT_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/param.h b/lib/libc/include/x86_64-macos-gnu/sys/param.h deleted file mode 100644 index 88330ebbe7..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/param.h +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* Copyright (c) 1995, 1997 Apple Computer, Inc. All Rights Reserved */ -/*- - * Copyright (c) 1982, 1986, 1989, 1993 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)param.h 8.3 (Berkeley) 4/4/95 - */ - -#ifndef _SYS_PARAM_H_ -#define _SYS_PARAM_H_ - -#define BSD 199506 /* System version (year & month). */ -#define BSD4_3 1 -#define BSD4_4 1 - -#define NeXTBSD 1995064 /* NeXTBSD version (year, month, release) */ -#define NeXTBSD4_0 0 /* NeXTBSD 4.0 */ - -#include -#include - -#ifndef LOCORE -#include -#endif - -/* - * Machine-independent constants (some used in following include files). - * Redefined constants are from POSIX 1003.1 limits file. - * - * MAXCOMLEN should be >= sizeof(ac_comm) (see ) - * MAXLOGNAME should be >= UT_NAMESIZE (see ) - */ -#include - -#define MAXCOMLEN 16 /* max command name remembered */ -#define MAXINTERP 64 /* max interpreter file name length */ -#define MAXLOGNAME 255 /* max login name length */ -#define MAXUPRC CHILD_MAX /* max simultaneous processes */ -#define NCARGS ARG_MAX /* max bytes for an exec function */ -#define NGROUPS NGROUPS_MAX /* max number groups */ -#define NOFILE 256 /* default max open files per process */ -#define NOGROUP 65535 /* marker for empty group set member */ -#define MAXHOSTNAMELEN 256 /* max hostname size */ -#define MAXDOMNAMELEN 256 /* maximum domain name length */ - -/* Machine type dependent parameters. */ -#include - -/* More types and definitions used throughout the kernel. */ -#include - -/* Signals. */ -#include - -/* - * Priorities. Note that with 32 run queues, differences less than 4 are - * insignificant. - */ -#define PSWP 0 -#define PVM 4 -#define PINOD 8 -#define PRIBIO 16 -#define PVFS 20 -#define PZERO 22 /* No longer magic, shouldn't be here. XXX */ -#define PSOCK 24 -#define PWAIT 32 -#define PLOCK 36 -#define PPAUSE 40 -#define PUSER 50 -#define MAXPRI 127 /* Priorities range from 0 through MAXPRI. */ - -#define PRIMASK 0x0ff -#define PCATCH 0x100 /* OR'd with pri for tsleep to check signals */ -#define PTTYBLOCK 0x200 /* for tty SIGTTOU and SIGTTIN blocking */ -#define PDROP 0x400 /* OR'd with pri to stop re-aquistion of mutex upon wakeup */ -#define PSPIN 0x800 /* OR'd with pri to require mutex in spin mode upon wakeup */ - -#define NBPW sizeof(int) /* number of bytes per word (integer) */ - -#define CMASK 022 /* default file mask: S_IWGRP|S_IWOTH */ -#define NODEV (dev_t)(-1) /* non-existent device */ - -/* - * Clustering of hardware pages on machines with ridiculously small - * page sizes is done here. The paging subsystem deals with units of - * CLSIZE pte's describing NBPG (from machine/param.h) pages each. - */ -#define CLBYTES (CLSIZE*NBPG) -#define CLOFSET (CLSIZE*NBPG-1) /* for clusters, like PGOFSET */ -#define claligned(x) ((((int)(x))&CLOFSET)==0) -#define CLOFF CLOFSET -#define CLSHIFT (PGSHIFT+CLSIZELOG2) - -#if CLSIZE == 1 -#define clbase(i) (i) -#define clrnd(i) (i) -#else -/* Give the base virtual address (first of CLSIZE). */ -#define clbase(i) ((i) &~ (CLSIZE-1)) -/* Round a number of clicks up to a whole cluster. */ -#define clrnd(i) (((i) + (CLSIZE-1)) &~ (CLSIZE-1)) -#endif - -#define CBLOCK 64 /* Clist block size, must be a power of 2. */ -#define CBQSIZE (CBLOCK/NBBY) /* Quote bytes/cblock - can do better. */ - /* Data chars/clist. */ -#define CBSIZE (CBLOCK - sizeof(struct cblock *) - CBQSIZE) -#define CROUND (CBLOCK - 1) /* Clist rounding. */ - -/* - * File system parameters and macros. - * - * The file system is made out of blocks of at most MAXPHYS units, with - * smaller units (fragments) only in the last direct block. MAXBSIZE - * primarily determines the size of buffers in the buffer pool. It may be - * made larger than MAXPHYS without any effect on existing file systems; - * however making it smaller may make some file systems unmountable. - * We set this to track the value of MAX_UPL_TRANSFER_BYTES from - * osfmk/mach/memory_object_types.h to bound it at the maximum UPL size. - */ -#define MAXBSIZE (256 * 4096) -#define MAXPHYSIO MAXPHYS -#define MAXFRAG 8 - -#define MAXPHYSIO_WIRED (16 * 1024 * 1024) - -/* - * MAXPATHLEN defines the longest permissable path length after expanding - * symbolic links. It is used to allocate a temporary buffer from the buffer - * pool in which to do the name expansion, hence should be a power of two, - * and must be less than or equal to MAXBSIZE. MAXSYMLINKS defines the - * maximum number of symbolic links that may be expanded in a path name. - * It should be set high enough to allow all legitimate uses, but halt - * infinite loops reasonably quickly. - */ -#define MAXPATHLEN PATH_MAX -#define MAXSYMLINKS 32 - -/* Bit map related macros. */ -#define setbit(a, i) (((char *)(a))[(i)/NBBY] |= 1<<((i)%NBBY)) -#define clrbit(a, i) (((char *)(a))[(i)/NBBY] &= ~(1<<((i)%NBBY))) -#define isset(a, i) (((char *)(a))[(i)/NBBY] & (1<<((i)%NBBY))) -#define isclr(a, i) ((((char *)(a))[(i)/NBBY] & (1<<((i)%NBBY))) == 0) - -/* Macros for counting and rounding. */ -#ifndef howmany -#define howmany(x, y) ((((x) % (y)) == 0) ? ((x) / (y)) : (((x) / (y)) + 1)) -#endif -#define roundup(x, y) ((((x) % (y)) == 0) ? \ - (x) : ((x) + ((y) - ((x) % (y))))) -#define powerof2(x) ((((x)-1)&(x))==0) - -/* Macros for min/max. */ -#ifndef MIN -#define MIN(a, b) (((a)<(b))?(a):(b)) -#endif /* MIN */ -#ifndef MAX -#define MAX(a, b) (((a)>(b))?(a):(b)) -#endif /* MAX */ - -/* - * Constants for setting the parameters of the kernel memory allocator. - * - * 2 ** MINBUCKET is the smallest unit of memory that will be - * allocated. It must be at least large enough to hold a pointer. - * - * Units of memory less or equal to MAXALLOCSAVE will permanently - * allocate physical memory; requests for these size pieces of - * memory are quite fast. Allocations greater than MAXALLOCSAVE must - * always allocate and free physical memory; requests for these - * size allocations should be done infrequently as they will be slow. - * - * Constraints: CLBYTES <= MAXALLOCSAVE <= 2 ** (MINBUCKET + 14), and - * MAXALLOCSIZE must be a power of two. - */ -#define MINBUCKET 4 /* 4 => min allocation of 16 bytes */ -#define MAXALLOCSAVE (2 * CLBYTES) - -/* - * Scale factor for scaled integers used to count %cpu time and load avgs. - * - * The number of CPU `tick's that map to a unique `%age' can be expressed - * by the formula (1 / (2 ^ (FSHIFT - 11))). The maximum load average that - * can be calculated (assuming 32 bits) can be closely approximated using - * the formula (2 ^ (2 * (16 - FSHIFT))) for (FSHIFT < 15). - * - * For the scheduler to maintain a 1:1 mapping of CPU `tick' to `%age', - * FSHIFT must be at least 11; this gives us a maximum load avg of ~1024. - */ -#define FSHIFT 11 /* bits to right of fixed binary point */ -#define FSCALE (1< -#include -#include /* For struct selinfo. */ -#include -#include -#include -#include -#include -#include - - - -struct session; -struct pgrp; -struct proc; - -/* Exported fields for kern sysctls */ -struct extern_proc { - union { - struct { - struct proc *__p_forw; /* Doubly-linked run/sleep queue. */ - struct proc *__p_back; - } p_st1; - struct timeval __p_starttime; /* process start time */ - } p_un; -#define p_forw p_un.p_st1.__p_forw -#define p_back p_un.p_st1.__p_back -#define p_starttime p_un.__p_starttime - struct vmspace *p_vmspace; /* Address space. */ - struct sigacts *p_sigacts; /* Signal actions, state (PROC ONLY). */ - int p_flag; /* P_* flags. */ - char p_stat; /* S* process status. */ - pid_t p_pid; /* Process identifier. */ - pid_t p_oppid; /* Save parent pid during ptrace. XXX */ - int p_dupfd; /* Sideways return value from fdopen. XXX */ - /* Mach related */ - caddr_t user_stack; /* where user stack was allocated */ - void *exit_thread; /* XXX Which thread is exiting? */ - int p_debugger; /* allow to debug */ - boolean_t sigwait; /* indication to suspend */ - /* scheduling */ - u_int p_estcpu; /* Time averaged value of p_cpticks. */ - int p_cpticks; /* Ticks of cpu time. */ - fixpt_t p_pctcpu; /* %cpu for this process during p_swtime */ - void *p_wchan; /* Sleep address. */ - char *p_wmesg; /* Reason for sleep. */ - u_int p_swtime; /* Time swapped in or out. */ - u_int p_slptime; /* Time since last blocked. */ - struct itimerval p_realtimer; /* Alarm timer. */ - struct timeval p_rtime; /* Real time. */ - u_quad_t p_uticks; /* Statclock hits in user mode. */ - u_quad_t p_sticks; /* Statclock hits in system mode. */ - u_quad_t p_iticks; /* Statclock hits processing intr. */ - int p_traceflag; /* Kernel trace points. */ - struct vnode *p_tracep; /* Trace to vnode. */ - int p_siglist; /* DEPRECATED. */ - struct vnode *p_textvp; /* Vnode of executable. */ - int p_holdcnt; /* If non-zero, don't swap. */ - sigset_t p_sigmask; /* DEPRECATED. */ - sigset_t p_sigignore; /* Signals being ignored. */ - sigset_t p_sigcatch; /* Signals being caught by user. */ - u_char p_priority; /* Process priority. */ - u_char p_usrpri; /* User-priority based on p_cpu and p_nice. */ - char p_nice; /* Process "nice" value. */ - char p_comm[MAXCOMLEN + 1]; - struct pgrp *p_pgrp; /* Pointer to process group. */ - struct user *p_addr; /* Kernel virtual addr of u-area (PROC ONLY). */ - u_short p_xstat; /* Exit status for wait; also stop signal. */ - u_short p_acflag; /* Accounting flags. */ - struct rusage *p_ru; /* Exit information. XXX */ -}; - - -/* Status values. */ -#define SIDL 1 /* Process being created by fork. */ -#define SRUN 2 /* Currently runnable. */ -#define SSLEEP 3 /* Sleeping on an address. */ -#define SSTOP 4 /* Process debugging or suspension. */ -#define SZOMB 5 /* Awaiting collection by parent. */ - -/* These flags are kept in extern_proc.p_flag. */ -#define P_ADVLOCK 0x00000001 /* Process may hold POSIX adv. lock */ -#define P_CONTROLT 0x00000002 /* Has a controlling terminal */ -#define P_LP64 0x00000004 /* Process is LP64 */ -#define P_NOCLDSTOP 0x00000008 /* No SIGCHLD when children stop */ - -#define P_PPWAIT 0x00000010 /* Parent waiting for chld exec/exit */ -#define P_PROFIL 0x00000020 /* Has started profiling */ -#define P_SELECT 0x00000040 /* Selecting; wakeup/waiting danger */ -#define P_CONTINUED 0x00000080 /* Process was stopped and continued */ - -#define P_SUGID 0x00000100 /* Has set privileges since last exec */ -#define P_SYSTEM 0x00000200 /* Sys proc: no sigs, stats or swap */ -#define P_TIMEOUT 0x00000400 /* Timing out during sleep */ -#define P_TRACED 0x00000800 /* Debugged process being traced */ - -#define P_DISABLE_ASLR 0x00001000 /* Disable address space layout randomization */ -#define P_WEXIT 0x00002000 /* Working on exiting */ -#define P_EXEC 0x00004000 /* Process called exec. */ - -/* Should be moved to machine-dependent areas. */ -#define P_OWEUPC 0x00008000 /* Owe process an addupc() call at next ast. */ - -#define P_AFFINITY 0x00010000 /* xxx */ -#define P_TRANSLATED 0x00020000 /* xxx */ -#define P_CLASSIC P_TRANSLATED /* xxx */ - -#define P_DELAYIDLESLEEP 0x00040000 /* Process is marked to delay idle sleep on disk IO */ -#define P_CHECKOPENEVT 0x00080000 /* check if a vnode has the OPENEVT flag set on open */ - -#define P_DEPENDENCY_CAPABLE 0x00100000 /* process is ok to call vfs_markdependency() */ -#define P_REBOOT 0x00200000 /* Process called reboot() */ -#define P_RESV6 0x00400000 /* used to be P_TBE */ -#define P_RESV7 0x00800000 /* (P_SIGEXC)signal exceptions */ - -#define P_THCWD 0x01000000 /* process has thread cwd */ -#define P_RESV9 0x02000000 /* (P_VFORK)process has vfork children */ -#define P_ADOPTPERSONA 0x04000000 /* process adopted a persona (used to be P_NOATTACH) */ -#define P_RESV11 0x08000000 /* (P_INVFORK) proc in vfork */ - -#define P_NOSHLIB 0x10000000 /* no shared libs are in use for proc */ - /* flag set on exec */ -#define P_FORCEQUOTA 0x20000000 /* Force quota for root */ -#define P_NOCLDWAIT 0x40000000 /* No zombies when chil procs exit */ -#define P_NOREMOTEHANG 0x80000000 /* Don't hang on remote FS ops */ - -#define P_INMEM 0 /* Obsolete: retained for compilation */ -#define P_NOSWAP 0 /* Obsolete: retained for compilation */ -#define P_PHYSIO 0 /* Obsolete: retained for compilation */ -#define P_FSTRACE 0 /* Obsolete: retained for compilation */ -#define P_SSTEP 0 /* Obsolete: retained for compilation */ - -#define P_DIRTY_TRACK 0x00000001 /* track dirty state */ -#define P_DIRTY_ALLOW_IDLE_EXIT 0x00000002 /* process can be idle-exited when clean */ -#define P_DIRTY_DEFER 0x00000004 /* defer initial opt-in to idle-exit */ -#define P_DIRTY 0x00000008 /* process is dirty */ -#define P_DIRTY_SHUTDOWN 0x00000010 /* process is dirty during shutdown */ -#define P_DIRTY_TERMINATED 0x00000020 /* process has been marked for termination */ -#define P_DIRTY_BUSY 0x00000040 /* serialization flag */ -#define P_DIRTY_MARKED 0x00000080 /* marked dirty previously */ -#define P_DIRTY_AGING_IN_PROGRESS 0x00000100 /* aging in one of the 'aging bands' */ -#define P_DIRTY_LAUNCH_IN_PROGRESS 0x00000200 /* launch is in progress */ -#define P_DIRTY_DEFER_ALWAYS 0x00000400 /* defer going to idle-exit after every dirty->clean transition. - * For legacy jetsam policy only. This is the default with the other policies.*/ - -#define P_DIRTY_IS_DIRTY (P_DIRTY | P_DIRTY_SHUTDOWN) -#define P_DIRTY_IDLE_EXIT_ENABLED (P_DIRTY_TRACK|P_DIRTY_ALLOW_IDLE_EXIT) - - - - -#endif /* !_SYS_PROC_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/proc_info.h b/lib/libc/include/x86_64-macos-gnu/sys/proc_info.h deleted file mode 100644 index b6809a463b..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/proc_info.h +++ /dev/null @@ -1,799 +0,0 @@ -/* - * Copyright (c) 2005-2020 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ - -#ifndef _SYS_PROC_INFO_H -#define _SYS_PROC_INFO_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -__BEGIN_DECLS - - -#define PROC_ALL_PIDS 1 -#define PROC_PGRP_ONLY 2 -#define PROC_TTY_ONLY 3 -#define PROC_UID_ONLY 4 -#define PROC_RUID_ONLY 5 -#define PROC_PPID_ONLY 6 -#define PROC_KDBG_ONLY 7 - -struct proc_bsdinfo { - uint32_t pbi_flags; /* 64bit; emulated etc */ - uint32_t pbi_status; - uint32_t pbi_xstatus; - uint32_t pbi_pid; - uint32_t pbi_ppid; - uid_t pbi_uid; - gid_t pbi_gid; - uid_t pbi_ruid; - gid_t pbi_rgid; - uid_t pbi_svuid; - gid_t pbi_svgid; - uint32_t rfu_1; /* reserved */ - char pbi_comm[MAXCOMLEN]; - char pbi_name[2 * MAXCOMLEN]; /* empty if no name is registered */ - uint32_t pbi_nfiles; - uint32_t pbi_pgid; - uint32_t pbi_pjobc; - uint32_t e_tdev; /* controlling tty dev */ - uint32_t e_tpgid; /* tty process group id */ - int32_t pbi_nice; - uint64_t pbi_start_tvsec; - uint64_t pbi_start_tvusec; -}; - - -struct proc_bsdshortinfo { - uint32_t pbsi_pid; /* process id */ - uint32_t pbsi_ppid; /* process parent id */ - uint32_t pbsi_pgid; /* process perp id */ - uint32_t pbsi_status; /* p_stat value, SZOMB, SRUN, etc */ - char pbsi_comm[MAXCOMLEN]; /* upto 16 characters of process name */ - uint32_t pbsi_flags; /* 64bit; emulated etc */ - uid_t pbsi_uid; /* current uid on process */ - gid_t pbsi_gid; /* current gid on process */ - uid_t pbsi_ruid; /* current ruid on process */ - gid_t pbsi_rgid; /* current tgid on process */ - uid_t pbsi_svuid; /* current svuid on process */ - gid_t pbsi_svgid; /* current svgid on process */ - uint32_t pbsi_rfu; /* reserved for future use*/ -}; - - - - -/* pbi_flags values */ -#define PROC_FLAG_SYSTEM 1 /* System process */ -#define PROC_FLAG_TRACED 2 /* process currently being traced, possibly by gdb */ -#define PROC_FLAG_INEXIT 4 /* process is working its way in exit() */ -#define PROC_FLAG_PPWAIT 8 -#define PROC_FLAG_LP64 0x10 /* 64bit process */ -#define PROC_FLAG_SLEADER 0x20 /* The process is the session leader */ -#define PROC_FLAG_CTTY 0x40 /* process has a control tty */ -#define PROC_FLAG_CONTROLT 0x80 /* Has a controlling terminal */ -#define PROC_FLAG_THCWD 0x100 /* process has a thread with cwd */ -/* process control bits for resource starvation */ -#define PROC_FLAG_PC_THROTTLE 0x200 /* In resource starvation situations, this process is to be throttled */ -#define PROC_FLAG_PC_SUSP 0x400 /* In resource starvation situations, this process is to be suspended */ -#define PROC_FLAG_PC_KILL 0x600 /* In resource starvation situations, this process is to be terminated */ -#define PROC_FLAG_PC_MASK 0x600 -/* process action bits for resource starvation */ -#define PROC_FLAG_PA_THROTTLE 0x800 /* The process is currently throttled due to resource starvation */ -#define PROC_FLAG_PA_SUSP 0x1000 /* The process is currently suspended due to resource starvation */ -#define PROC_FLAG_PSUGID 0x2000 /* process has set privileges since last exec */ -#define PROC_FLAG_EXEC 0x4000 /* process has called exec */ - - -struct proc_taskinfo { - uint64_t pti_virtual_size; /* virtual memory size (bytes) */ - uint64_t pti_resident_size; /* resident memory size (bytes) */ - uint64_t pti_total_user; /* total time */ - uint64_t pti_total_system; - uint64_t pti_threads_user; /* existing threads only */ - uint64_t pti_threads_system; - int32_t pti_policy; /* default policy for new threads */ - int32_t pti_faults; /* number of page faults */ - int32_t pti_pageins; /* number of actual pageins */ - int32_t pti_cow_faults; /* number of copy-on-write faults */ - int32_t pti_messages_sent; /* number of messages sent */ - int32_t pti_messages_received; /* number of messages received */ - int32_t pti_syscalls_mach; /* number of mach system calls */ - int32_t pti_syscalls_unix; /* number of unix system calls */ - int32_t pti_csw; /* number of context switches */ - int32_t pti_threadnum; /* number of threads in the task */ - int32_t pti_numrunning; /* number of running threads */ - int32_t pti_priority; /* task priority*/ -}; - -struct proc_taskallinfo { - struct proc_bsdinfo pbsd; - struct proc_taskinfo ptinfo; -}; - -#define MAXTHREADNAMESIZE 64 - -struct proc_threadinfo { - uint64_t pth_user_time; /* user run time */ - uint64_t pth_system_time; /* system run time */ - int32_t pth_cpu_usage; /* scaled cpu usage percentage */ - int32_t pth_policy; /* scheduling policy in effect */ - int32_t pth_run_state; /* run state (see below) */ - int32_t pth_flags; /* various flags (see below) */ - int32_t pth_sleep_time; /* number of seconds that thread */ - int32_t pth_curpri; /* cur priority*/ - int32_t pth_priority; /* priority*/ - int32_t pth_maxpriority; /* max priority*/ - char pth_name[MAXTHREADNAMESIZE]; /* thread name, if any */ -}; - -struct proc_regioninfo { - uint32_t pri_protection; - uint32_t pri_max_protection; - uint32_t pri_inheritance; - uint32_t pri_flags; /* shared, external pager, is submap */ - uint64_t pri_offset; - uint32_t pri_behavior; - uint32_t pri_user_wired_count; - uint32_t pri_user_tag; - uint32_t pri_pages_resident; - uint32_t pri_pages_shared_now_private; - uint32_t pri_pages_swapped_out; - uint32_t pri_pages_dirtied; - uint32_t pri_ref_count; - uint32_t pri_shadow_depth; - uint32_t pri_share_mode; - uint32_t pri_private_pages_resident; - uint32_t pri_shared_pages_resident; - uint32_t pri_obj_id; - uint32_t pri_depth; - uint64_t pri_address; - uint64_t pri_size; -}; - -#define PROC_REGION_SUBMAP 1 -#define PROC_REGION_SHARED 2 - -#define SM_COW 1 -#define SM_PRIVATE 2 -#define SM_EMPTY 3 -#define SM_SHARED 4 -#define SM_TRUESHARED 5 -#define SM_PRIVATE_ALIASED 6 -#define SM_SHARED_ALIASED 7 -#define SM_LARGE_PAGE 8 - - -/* - * Thread run states (state field). - */ - -#define TH_STATE_RUNNING 1 /* thread is running normally */ -#define TH_STATE_STOPPED 2 /* thread is stopped */ -#define TH_STATE_WAITING 3 /* thread is waiting normally */ -#define TH_STATE_UNINTERRUPTIBLE 4 /* thread is in an uninterruptible - * wait */ -#define TH_STATE_HALTED 5 /* thread is halted at a - * clean point */ - -/* - * Thread flags (flags field). - */ -#define TH_FLAGS_SWAPPED 0x1 /* thread is swapped out */ -#define TH_FLAGS_IDLE 0x2 /* thread is an idle thread */ - - -struct proc_workqueueinfo { - uint32_t pwq_nthreads; /* total number of workqueue threads */ - uint32_t pwq_runthreads; /* total number of running workqueue threads */ - uint32_t pwq_blockedthreads; /* total number of blocked workqueue threads */ - uint32_t pwq_state; -}; - -/* - * workqueue state (pwq_state field) - */ -#define WQ_EXCEEDED_CONSTRAINED_THREAD_LIMIT 0x1 -#define WQ_EXCEEDED_TOTAL_THREAD_LIMIT 0x2 -#define WQ_FLAGS_AVAILABLE 0x4 - -struct proc_fileinfo { - uint32_t fi_openflags; - uint32_t fi_status; - off_t fi_offset; - int32_t fi_type; - uint32_t fi_guardflags; -}; - -/* stats flags in proc_fileinfo */ -#define PROC_FP_SHARED 1 /* shared by more than one fd */ -#define PROC_FP_CLEXEC 2 /* close on exec */ -#define PROC_FP_GUARDED 4 /* guarded fd */ -#define PROC_FP_CLFORK 8 /* close on fork */ - -#define PROC_FI_GUARD_CLOSE (1u << 0) -#define PROC_FI_GUARD_DUP (1u << 1) -#define PROC_FI_GUARD_SOCKET_IPC (1u << 2) -#define PROC_FI_GUARD_FILEPORT (1u << 3) - -struct proc_exitreasonbasicinfo { - uint32_t beri_namespace; - uint64_t beri_code; - uint64_t beri_flags; - uint32_t beri_reason_buf_size; -} __attribute__((packed)); - -struct proc_exitreasoninfo { - uint32_t eri_namespace; - uint64_t eri_code; - uint64_t eri_flags; - uint32_t eri_reason_buf_size; - uint64_t eri_kcd_buf; -} __attribute__((packed)); - -/* - * A copy of stat64 with static sized fields. - */ -struct vinfo_stat { - uint32_t vst_dev; /* [XSI] ID of device containing file */ - uint16_t vst_mode; /* [XSI] Mode of file (see below) */ - uint16_t vst_nlink; /* [XSI] Number of hard links */ - uint64_t vst_ino; /* [XSI] File serial number */ - uid_t vst_uid; /* [XSI] User ID of the file */ - gid_t vst_gid; /* [XSI] Group ID of the file */ - int64_t vst_atime; /* [XSI] Time of last access */ - int64_t vst_atimensec; /* nsec of last access */ - int64_t vst_mtime; /* [XSI] Last data modification time */ - int64_t vst_mtimensec; /* last data modification nsec */ - int64_t vst_ctime; /* [XSI] Time of last status change */ - int64_t vst_ctimensec; /* nsec of last status change */ - int64_t vst_birthtime; /* File creation time(birth) */ - int64_t vst_birthtimensec; /* nsec of File creation time */ - off_t vst_size; /* [XSI] file size, in bytes */ - int64_t vst_blocks; /* [XSI] blocks allocated for file */ - int32_t vst_blksize; /* [XSI] optimal blocksize for I/O */ - uint32_t vst_flags; /* user defined flags for file */ - uint32_t vst_gen; /* file generation number */ - uint32_t vst_rdev; /* [XSI] Device ID */ - int64_t vst_qspare[2]; /* RESERVED: DO NOT USE! */ -}; - -struct vnode_info { - struct vinfo_stat vi_stat; - int vi_type; - int vi_pad; - fsid_t vi_fsid; -}; - -struct vnode_info_path { - struct vnode_info vip_vi; - char vip_path[MAXPATHLEN]; /* tail end of it */ -}; - -struct vnode_fdinfo { - struct proc_fileinfo pfi; - struct vnode_info pvi; -}; - -struct vnode_fdinfowithpath { - struct proc_fileinfo pfi; - struct vnode_info_path pvip; -}; - -struct proc_regionwithpathinfo { - struct proc_regioninfo prp_prinfo; - struct vnode_info_path prp_vip; -}; - -struct proc_regionpath { - uint64_t prpo_addr; - uint64_t prpo_regionlength; - char prpo_path[MAXPATHLEN]; -}; - -struct proc_vnodepathinfo { - struct vnode_info_path pvi_cdir; - struct vnode_info_path pvi_rdir; -}; - -struct proc_threadwithpathinfo { - struct proc_threadinfo pt; - struct vnode_info_path pvip; -}; - -/* - * Socket - */ - - -/* - * IPv4 and IPv6 Sockets - */ - -#define INI_IPV4 0x1 -#define INI_IPV6 0x2 - -struct in4in6_addr { - u_int32_t i46a_pad32[3]; - struct in_addr i46a_addr4; -}; - -struct in_sockinfo { - int insi_fport; /* foreign port */ - int insi_lport; /* local port */ - uint64_t insi_gencnt; /* generation count of this instance */ - uint32_t insi_flags; /* generic IP/datagram flags */ - uint32_t insi_flow; - - uint8_t insi_vflag; /* ini_IPV4 or ini_IPV6 */ - uint8_t insi_ip_ttl; /* time to live proto */ - uint32_t rfu_1; /* reserved */ - /* protocol dependent part */ - union { - struct in4in6_addr ina_46; - struct in6_addr ina_6; - } insi_faddr; /* foreign host table entry */ - union { - struct in4in6_addr ina_46; - struct in6_addr ina_6; - } insi_laddr; /* local host table entry */ - struct { - u_char in4_tos; /* type of service */ - } insi_v4; - struct { - uint8_t in6_hlim; - int in6_cksum; - u_short in6_ifindex; - short in6_hops; - } insi_v6; -}; - -/* - * TCP Sockets - */ - -#define TSI_T_REXMT 0 /* retransmit */ -#define TSI_T_PERSIST 1 /* retransmit persistence */ -#define TSI_T_KEEP 2 /* keep alive */ -#define TSI_T_2MSL 3 /* 2*msl quiet time timer */ -#define TSI_T_NTIMERS 4 - -#define TSI_S_CLOSED 0 /* closed */ -#define TSI_S_LISTEN 1 /* listening for connection */ -#define TSI_S_SYN_SENT 2 /* active, have sent syn */ -#define TSI_S_SYN_RECEIVED 3 /* have send and received syn */ -#define TSI_S_ESTABLISHED 4 /* established */ -#define TSI_S__CLOSE_WAIT 5 /* rcvd fin, waiting for close */ -#define TSI_S_FIN_WAIT_1 6 /* have closed, sent fin */ -#define TSI_S_CLOSING 7 /* closed xchd FIN; await FIN ACK */ -#define TSI_S_LAST_ACK 8 /* had fin and close; await FIN ACK */ -#define TSI_S_FIN_WAIT_2 9 /* have closed, fin is acked */ -#define TSI_S_TIME_WAIT 10 /* in 2*msl quiet wait after close */ -#define TSI_S_RESERVED 11 /* pseudo state: reserved */ - -struct tcp_sockinfo { - struct in_sockinfo tcpsi_ini; - int tcpsi_state; - int tcpsi_timer[TSI_T_NTIMERS]; - int tcpsi_mss; - uint32_t tcpsi_flags; - uint32_t rfu_1; /* reserved */ - uint64_t tcpsi_tp; /* opaque handle of TCP protocol control block */ -}; - -/* - * Unix Domain Sockets - */ - - -struct un_sockinfo { - uint64_t unsi_conn_so; /* opaque handle of connected socket */ - uint64_t unsi_conn_pcb; /* opaque handle of connected protocol control block */ - union { - struct sockaddr_un ua_sun; - char ua_dummy[SOCK_MAXADDRLEN]; - } unsi_addr; /* bound address */ - union { - struct sockaddr_un ua_sun; - char ua_dummy[SOCK_MAXADDRLEN]; - } unsi_caddr; /* address of socket connected to */ -}; - -/* - * PF_NDRV Sockets - */ - -struct ndrv_info { - uint32_t ndrvsi_if_family; - uint32_t ndrvsi_if_unit; - char ndrvsi_if_name[IF_NAMESIZE]; -}; - -/* - * Kernel Event Sockets - */ - -struct kern_event_info { - uint32_t kesi_vendor_code_filter; - uint32_t kesi_class_filter; - uint32_t kesi_subclass_filter; -}; - -/* - * Kernel Control Sockets - */ - -struct kern_ctl_info { - uint32_t kcsi_id; - uint32_t kcsi_reg_unit; - uint32_t kcsi_flags; /* support flags */ - uint32_t kcsi_recvbufsize; /* request more than the default buffer size */ - uint32_t kcsi_sendbufsize; /* request more than the default buffer size */ - uint32_t kcsi_unit; - char kcsi_name[MAX_KCTL_NAME]; /* unique nke identifier, provided by DTS */ -}; - -/* - * VSock Sockets - */ - -struct vsock_sockinfo { - uint32_t local_cid; - uint32_t local_port; - uint32_t remote_cid; - uint32_t remote_port; -}; - -/* soi_state */ - -#define SOI_S_NOFDREF 0x0001 /* no file table ref any more */ -#define SOI_S_ISCONNECTED 0x0002 /* socket connected to a peer */ -#define SOI_S_ISCONNECTING 0x0004 /* in process of connecting to peer */ -#define SOI_S_ISDISCONNECTING 0x0008 /* in process of disconnecting */ -#define SOI_S_CANTSENDMORE 0x0010 /* can't send more data to peer */ -#define SOI_S_CANTRCVMORE 0x0020 /* can't receive more data from peer */ -#define SOI_S_RCVATMARK 0x0040 /* at mark on input */ -#define SOI_S_PRIV 0x0080 /* privileged for broadcast, raw... */ -#define SOI_S_NBIO 0x0100 /* non-blocking ops */ -#define SOI_S_ASYNC 0x0200 /* async i/o notify */ -#define SOI_S_INCOMP 0x0800 /* Unaccepted, incomplete connection */ -#define SOI_S_COMP 0x1000 /* unaccepted, complete connection */ -#define SOI_S_ISDISCONNECTED 0x2000 /* socket disconnected from peer */ -#define SOI_S_DRAINING 0x4000 /* close waiting for blocked system calls to drain */ - -struct sockbuf_info { - uint32_t sbi_cc; - uint32_t sbi_hiwat; /* SO_RCVBUF, SO_SNDBUF */ - uint32_t sbi_mbcnt; - uint32_t sbi_mbmax; - uint32_t sbi_lowat; - short sbi_flags; - short sbi_timeo; -}; - -enum { - SOCKINFO_GENERIC = 0, - SOCKINFO_IN = 1, - SOCKINFO_TCP = 2, - SOCKINFO_UN = 3, - SOCKINFO_NDRV = 4, - SOCKINFO_KERN_EVENT = 5, - SOCKINFO_KERN_CTL = 6, - SOCKINFO_VSOCK = 7, -}; - -struct socket_info { - struct vinfo_stat soi_stat; - uint64_t soi_so; /* opaque handle of socket */ - uint64_t soi_pcb; /* opaque handle of protocol control block */ - int soi_type; - int soi_protocol; - int soi_family; - short soi_options; - short soi_linger; - short soi_state; - short soi_qlen; - short soi_incqlen; - short soi_qlimit; - short soi_timeo; - u_short soi_error; - uint32_t soi_oobmark; - struct sockbuf_info soi_rcv; - struct sockbuf_info soi_snd; - int soi_kind; - uint32_t rfu_1; /* reserved */ - union { - struct in_sockinfo pri_in; /* SOCKINFO_IN */ - struct tcp_sockinfo pri_tcp; /* SOCKINFO_TCP */ - struct un_sockinfo pri_un; /* SOCKINFO_UN */ - struct ndrv_info pri_ndrv; /* SOCKINFO_NDRV */ - struct kern_event_info pri_kern_event; /* SOCKINFO_KERN_EVENT */ - struct kern_ctl_info pri_kern_ctl; /* SOCKINFO_KERN_CTL */ - struct vsock_sockinfo pri_vsock; /* SOCKINFO_VSOCK */ - } soi_proto; -}; - -struct socket_fdinfo { - struct proc_fileinfo pfi; - struct socket_info psi; -}; - - - -struct psem_info { - struct vinfo_stat psem_stat; - char psem_name[MAXPATHLEN]; -}; - -struct psem_fdinfo { - struct proc_fileinfo pfi; - struct psem_info pseminfo; -}; - - - -struct pshm_info { - struct vinfo_stat pshm_stat; - uint64_t pshm_mappaddr; - char pshm_name[MAXPATHLEN]; -}; - -struct pshm_fdinfo { - struct proc_fileinfo pfi; - struct pshm_info pshminfo; -}; - - -struct pipe_info { - struct vinfo_stat pipe_stat; - uint64_t pipe_handle; - uint64_t pipe_peerhandle; - int pipe_status; - int rfu_1; /* reserved */ -}; - -struct pipe_fdinfo { - struct proc_fileinfo pfi; - struct pipe_info pipeinfo; -}; - - -struct kqueue_info { - struct vinfo_stat kq_stat; - uint32_t kq_state; - uint32_t rfu_1; /* reserved */ -}; - -struct kqueue_dyninfo { - struct kqueue_info kqdi_info; - uint64_t kqdi_servicer; - uint64_t kqdi_owner; - uint32_t kqdi_sync_waiters; - uint8_t kqdi_sync_waiter_qos; - uint8_t kqdi_async_qos; - uint16_t kqdi_request_state; - uint8_t kqdi_events_qos; - uint8_t kqdi_pri; - uint8_t kqdi_pol; - uint8_t kqdi_cpupercent; - uint8_t _kqdi_reserved0[4]; - uint64_t _kqdi_reserved1[4]; -}; - -/* keep in sync with KQ_* in sys/eventvar.h */ -#define PROC_KQUEUE_SELECT 0x01 -#define PROC_KQUEUE_SLEEP 0x02 -#define PROC_KQUEUE_32 0x08 -#define PROC_KQUEUE_64 0x10 -#define PROC_KQUEUE_QOS 0x20 - - -struct kqueue_fdinfo { - struct proc_fileinfo pfi; - struct kqueue_info kqueueinfo; -}; - -struct appletalk_info { - struct vinfo_stat atalk_stat; -}; - -struct appletalk_fdinfo { - struct proc_fileinfo pfi; - struct appletalk_info appletalkinfo; -}; - -typedef uint64_t proc_info_udata_t; - -/* defns of process file desc type */ -#define PROX_FDTYPE_ATALK 0 -#define PROX_FDTYPE_VNODE 1 -#define PROX_FDTYPE_SOCKET 2 -#define PROX_FDTYPE_PSHM 3 -#define PROX_FDTYPE_PSEM 4 -#define PROX_FDTYPE_KQUEUE 5 -#define PROX_FDTYPE_PIPE 6 -#define PROX_FDTYPE_FSEVENTS 7 -#define PROX_FDTYPE_NETPOLICY 9 - -struct proc_fdinfo { - int32_t proc_fd; - uint32_t proc_fdtype; -}; - -struct proc_fileportinfo { - uint32_t proc_fileport; - uint32_t proc_fdtype; -}; - - -/* Flavors for proc_pidinfo() */ -#define PROC_PIDLISTFDS 1 -#define PROC_PIDLISTFD_SIZE (sizeof(struct proc_fdinfo)) - -#define PROC_PIDTASKALLINFO 2 -#define PROC_PIDTASKALLINFO_SIZE (sizeof(struct proc_taskallinfo)) - -#define PROC_PIDTBSDINFO 3 -#define PROC_PIDTBSDINFO_SIZE (sizeof(struct proc_bsdinfo)) - -#define PROC_PIDTASKINFO 4 -#define PROC_PIDTASKINFO_SIZE (sizeof(struct proc_taskinfo)) - -#define PROC_PIDTHREADINFO 5 -#define PROC_PIDTHREADINFO_SIZE (sizeof(struct proc_threadinfo)) - -#define PROC_PIDLISTTHREADS 6 -#define PROC_PIDLISTTHREADS_SIZE (2* sizeof(uint32_t)) - -#define PROC_PIDREGIONINFO 7 -#define PROC_PIDREGIONINFO_SIZE (sizeof(struct proc_regioninfo)) - -#define PROC_PIDREGIONPATHINFO 8 -#define PROC_PIDREGIONPATHINFO_SIZE (sizeof(struct proc_regionwithpathinfo)) - -#define PROC_PIDVNODEPATHINFO 9 -#define PROC_PIDVNODEPATHINFO_SIZE (sizeof(struct proc_vnodepathinfo)) - -#define PROC_PIDTHREADPATHINFO 10 -#define PROC_PIDTHREADPATHINFO_SIZE (sizeof(struct proc_threadwithpathinfo)) - -#define PROC_PIDPATHINFO 11 -#define PROC_PIDPATHINFO_SIZE (MAXPATHLEN) -#define PROC_PIDPATHINFO_MAXSIZE (4*MAXPATHLEN) - -#define PROC_PIDWORKQUEUEINFO 12 -#define PROC_PIDWORKQUEUEINFO_SIZE (sizeof(struct proc_workqueueinfo)) - -#define PROC_PIDT_SHORTBSDINFO 13 -#define PROC_PIDT_SHORTBSDINFO_SIZE (sizeof(struct proc_bsdshortinfo)) - -#define PROC_PIDLISTFILEPORTS 14 -#define PROC_PIDLISTFILEPORTS_SIZE (sizeof(struct proc_fileportinfo)) - -#define PROC_PIDTHREADID64INFO 15 -#define PROC_PIDTHREADID64INFO_SIZE (sizeof(struct proc_threadinfo)) - -#define PROC_PID_RUSAGE 16 -#define PROC_PID_RUSAGE_SIZE 0 - -/* Flavors for proc_pidfdinfo */ - -#define PROC_PIDFDVNODEINFO 1 -#define PROC_PIDFDVNODEINFO_SIZE (sizeof(struct vnode_fdinfo)) - -#define PROC_PIDFDVNODEPATHINFO 2 -#define PROC_PIDFDVNODEPATHINFO_SIZE (sizeof(struct vnode_fdinfowithpath)) - -#define PROC_PIDFDSOCKETINFO 3 -#define PROC_PIDFDSOCKETINFO_SIZE (sizeof(struct socket_fdinfo)) - -#define PROC_PIDFDPSEMINFO 4 -#define PROC_PIDFDPSEMINFO_SIZE (sizeof(struct psem_fdinfo)) - -#define PROC_PIDFDPSHMINFO 5 -#define PROC_PIDFDPSHMINFO_SIZE (sizeof(struct pshm_fdinfo)) - -#define PROC_PIDFDPIPEINFO 6 -#define PROC_PIDFDPIPEINFO_SIZE (sizeof(struct pipe_fdinfo)) - -#define PROC_PIDFDKQUEUEINFO 7 -#define PROC_PIDFDKQUEUEINFO_SIZE (sizeof(struct kqueue_fdinfo)) - -#define PROC_PIDFDATALKINFO 8 -#define PROC_PIDFDATALKINFO_SIZE (sizeof(struct appletalk_fdinfo)) - - - -/* Flavors for proc_pidfileportinfo */ - -#define PROC_PIDFILEPORTVNODEPATHINFO 2 /* out: vnode_fdinfowithpath */ -#define PROC_PIDFILEPORTVNODEPATHINFO_SIZE \ - PROC_PIDFDVNODEPATHINFO_SIZE - -#define PROC_PIDFILEPORTSOCKETINFO 3 /* out: socket_fdinfo */ -#define PROC_PIDFILEPORTSOCKETINFO_SIZE PROC_PIDFDSOCKETINFO_SIZE - -#define PROC_PIDFILEPORTPSHMINFO 5 /* out: pshm_fdinfo */ -#define PROC_PIDFILEPORTPSHMINFO_SIZE PROC_PIDFDPSHMINFO_SIZE - -#define PROC_PIDFILEPORTPIPEINFO 6 /* out: pipe_fdinfo */ -#define PROC_PIDFILEPORTPIPEINFO_SIZE PROC_PIDFDPIPEINFO_SIZE - -/* used for proc_setcontrol */ -#define PROC_SELFSET_PCONTROL 1 - -#define PROC_SELFSET_THREADNAME 2 -#define PROC_SELFSET_THREADNAME_SIZE (MAXTHREADNAMESIZE -1) - -#define PROC_SELFSET_VMRSRCOWNER 3 - -#define PROC_SELFSET_DELAYIDLESLEEP 4 - -/* used for proc_dirtycontrol */ -#define PROC_DIRTYCONTROL_TRACK 1 -#define PROC_DIRTYCONTROL_SET 2 -#define PROC_DIRTYCONTROL_GET 3 -#define PROC_DIRTYCONTROL_CLEAR 4 - -/* proc_track_dirty() flags */ -#define PROC_DIRTY_TRACK 0x1 -#define PROC_DIRTY_ALLOW_IDLE_EXIT 0x2 -#define PROC_DIRTY_DEFER 0x4 -#define PROC_DIRTY_LAUNCH_IN_PROGRESS 0x8 -#define PROC_DIRTY_DEFER_ALWAYS 0x10 - -/* proc_get_dirty() flags */ -#define PROC_DIRTY_TRACKED 0x1 -#define PROC_DIRTY_ALLOWS_IDLE_EXIT 0x2 -#define PROC_DIRTY_IS_DIRTY 0x4 -#define PROC_DIRTY_LAUNCH_IS_IN_PROGRESS 0x8 - -/* Flavors for proc_udata_info */ -#define PROC_UDATA_INFO_GET 1 -#define PROC_UDATA_INFO_SET 2 - - - - -__END_DECLS - -#endif /*_SYS_PROC_INFO_H */ diff --git a/lib/libc/include/x86_64-macos-gnu/sys/resource.h b/lib/libc/include/x86_64-macos-gnu/sys/resource.h deleted file mode 100644 index b6bf678d37..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/resource.h +++ /dev/null @@ -1,458 +0,0 @@ -/* - * Copyright (c) 2000-2018 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */ -/* - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)resource.h 8.2 (Berkeley) 1/4/94 - */ - -#ifndef _SYS_RESOURCE_H_ -#define _SYS_RESOURCE_H_ - -#include -#include -#include - -#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL -#include -#endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ - -#include - -/* [XSI] The timeval structure shall be defined as described in - * - */ -#include - -/* The id_t type shall be defined as described in */ -#include - - -/* - * Resource limit type (low 63 bits, excluding the sign bit) - */ -typedef __uint64_t rlim_t; - - -/***** - * PRIORITY - */ - -/* - * Possible values of the first parameter to getpriority()/setpriority(), - * used to indicate the type of the second parameter. - */ -#define PRIO_PROCESS 0 /* Second argument is a PID */ -#define PRIO_PGRP 1 /* Second argument is a GID */ -#define PRIO_USER 2 /* Second argument is a UID */ - -#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL -#define PRIO_DARWIN_THREAD 3 /* Second argument is always 0 (current thread) */ -#define PRIO_DARWIN_PROCESS 4 /* Second argument is a PID */ - - -/* - * Range limitations for the value of the third parameter to setpriority(). - */ -#define PRIO_MIN -20 -#define PRIO_MAX 20 - -/* - * use PRIO_DARWIN_BG to set the current thread into "background" state - * which lowers CPU, disk IO, and networking priorites until thread terminates - * or "background" state is revoked - */ -#define PRIO_DARWIN_BG 0x1000 - -/* - * use PRIO_DARWIN_NONUI to restrict a process's ability to make calls to - * the GPU. (deprecated) - */ -#define PRIO_DARWIN_NONUI 0x1001 - -#endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ - - - -/***** - * RESOURCE USAGE - */ - -/* - * Possible values of the first parameter to getrusage(), used to indicate - * the scope of the information to be returned. - */ -#define RUSAGE_SELF 0 /* Current process information */ -#define RUSAGE_CHILDREN -1 /* Current process' children */ - -/* - * A structure representing an accounting of resource utilization. The - * address of an instance of this structure is the second parameter to - * getrusage(). - * - * Note: All values other than ru_utime and ru_stime are implementaiton - * defined and subject to change in a future release. Their use - * is discouraged for standards compliant programs. - */ -struct rusage { - struct timeval ru_utime; /* user time used (PL) */ - struct timeval ru_stime; /* system time used (PL) */ -#if __DARWIN_C_LEVEL < __DARWIN_C_FULL - long ru_opaque[14]; /* implementation defined */ -#else - /* - * Informational aliases for source compatibility with programs - * that need more information than that provided by standards, - * and which do not mind being OS-dependent. - */ - long ru_maxrss; /* max resident set size (PL) */ -#define ru_first ru_ixrss /* internal: ruadd() range start */ - long ru_ixrss; /* integral shared memory size (NU) */ - long ru_idrss; /* integral unshared data (NU) */ - long ru_isrss; /* integral unshared stack (NU) */ - long ru_minflt; /* page reclaims (NU) */ - long ru_majflt; /* page faults (NU) */ - long ru_nswap; /* swaps (NU) */ - long ru_inblock; /* block input operations (atomic) */ - long ru_oublock; /* block output operations (atomic) */ - long ru_msgsnd; /* messages sent (atomic) */ - long ru_msgrcv; /* messages received (atomic) */ - long ru_nsignals; /* signals received (atomic) */ - long ru_nvcsw; /* voluntary context switches (atomic) */ - long ru_nivcsw; /* involuntary " */ -#define ru_last ru_nivcsw /* internal: ruadd() range end */ -#endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ -}; - -#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL -/* - * Flavors for proc_pid_rusage(). - */ -#define RUSAGE_INFO_V0 0 -#define RUSAGE_INFO_V1 1 -#define RUSAGE_INFO_V2 2 -#define RUSAGE_INFO_V3 3 -#define RUSAGE_INFO_V4 4 -#define RUSAGE_INFO_CURRENT RUSAGE_INFO_V4 - -typedef void *rusage_info_t; - -struct rusage_info_v0 { - uint8_t ri_uuid[16]; - uint64_t ri_user_time; - uint64_t ri_system_time; - uint64_t ri_pkg_idle_wkups; - uint64_t ri_interrupt_wkups; - uint64_t ri_pageins; - uint64_t ri_wired_size; - uint64_t ri_resident_size; - uint64_t ri_phys_footprint; - uint64_t ri_proc_start_abstime; - uint64_t ri_proc_exit_abstime; -}; - -struct rusage_info_v1 { - uint8_t ri_uuid[16]; - uint64_t ri_user_time; - uint64_t ri_system_time; - uint64_t ri_pkg_idle_wkups; - uint64_t ri_interrupt_wkups; - uint64_t ri_pageins; - uint64_t ri_wired_size; - uint64_t ri_resident_size; - uint64_t ri_phys_footprint; - uint64_t ri_proc_start_abstime; - uint64_t ri_proc_exit_abstime; - uint64_t ri_child_user_time; - uint64_t ri_child_system_time; - uint64_t ri_child_pkg_idle_wkups; - uint64_t ri_child_interrupt_wkups; - uint64_t ri_child_pageins; - uint64_t ri_child_elapsed_abstime; -}; - -struct rusage_info_v2 { - uint8_t ri_uuid[16]; - uint64_t ri_user_time; - uint64_t ri_system_time; - uint64_t ri_pkg_idle_wkups; - uint64_t ri_interrupt_wkups; - uint64_t ri_pageins; - uint64_t ri_wired_size; - uint64_t ri_resident_size; - uint64_t ri_phys_footprint; - uint64_t ri_proc_start_abstime; - uint64_t ri_proc_exit_abstime; - uint64_t ri_child_user_time; - uint64_t ri_child_system_time; - uint64_t ri_child_pkg_idle_wkups; - uint64_t ri_child_interrupt_wkups; - uint64_t ri_child_pageins; - uint64_t ri_child_elapsed_abstime; - uint64_t ri_diskio_bytesread; - uint64_t ri_diskio_byteswritten; -}; - -struct rusage_info_v3 { - uint8_t ri_uuid[16]; - uint64_t ri_user_time; - uint64_t ri_system_time; - uint64_t ri_pkg_idle_wkups; - uint64_t ri_interrupt_wkups; - uint64_t ri_pageins; - uint64_t ri_wired_size; - uint64_t ri_resident_size; - uint64_t ri_phys_footprint; - uint64_t ri_proc_start_abstime; - uint64_t ri_proc_exit_abstime; - uint64_t ri_child_user_time; - uint64_t ri_child_system_time; - uint64_t ri_child_pkg_idle_wkups; - uint64_t ri_child_interrupt_wkups; - uint64_t ri_child_pageins; - uint64_t ri_child_elapsed_abstime; - uint64_t ri_diskio_bytesread; - uint64_t ri_diskio_byteswritten; - uint64_t ri_cpu_time_qos_default; - uint64_t ri_cpu_time_qos_maintenance; - uint64_t ri_cpu_time_qos_background; - uint64_t ri_cpu_time_qos_utility; - uint64_t ri_cpu_time_qos_legacy; - uint64_t ri_cpu_time_qos_user_initiated; - uint64_t ri_cpu_time_qos_user_interactive; - uint64_t ri_billed_system_time; - uint64_t ri_serviced_system_time; -}; - -struct rusage_info_v4 { - uint8_t ri_uuid[16]; - uint64_t ri_user_time; - uint64_t ri_system_time; - uint64_t ri_pkg_idle_wkups; - uint64_t ri_interrupt_wkups; - uint64_t ri_pageins; - uint64_t ri_wired_size; - uint64_t ri_resident_size; - uint64_t ri_phys_footprint; - uint64_t ri_proc_start_abstime; - uint64_t ri_proc_exit_abstime; - uint64_t ri_child_user_time; - uint64_t ri_child_system_time; - uint64_t ri_child_pkg_idle_wkups; - uint64_t ri_child_interrupt_wkups; - uint64_t ri_child_pageins; - uint64_t ri_child_elapsed_abstime; - uint64_t ri_diskio_bytesread; - uint64_t ri_diskio_byteswritten; - uint64_t ri_cpu_time_qos_default; - uint64_t ri_cpu_time_qos_maintenance; - uint64_t ri_cpu_time_qos_background; - uint64_t ri_cpu_time_qos_utility; - uint64_t ri_cpu_time_qos_legacy; - uint64_t ri_cpu_time_qos_user_initiated; - uint64_t ri_cpu_time_qos_user_interactive; - uint64_t ri_billed_system_time; - uint64_t ri_serviced_system_time; - uint64_t ri_logical_writes; - uint64_t ri_lifetime_max_phys_footprint; - uint64_t ri_instructions; - uint64_t ri_cycles; - uint64_t ri_billed_energy; - uint64_t ri_serviced_energy; - uint64_t ri_interval_max_phys_footprint; - uint64_t ri_runnable_time; -}; - -typedef struct rusage_info_v4 rusage_info_current; - -#endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ - - - -/***** - * RESOURCE LIMITS - */ - -/* - * Symbolic constants for resource limits; since all limits are representable - * as a type rlim_t, we are permitted to define RLIM_SAVED_* in terms of - * RLIM_INFINITY. - */ -#define RLIM_INFINITY (((__uint64_t)1 << 63) - 1) /* no limit */ -#define RLIM_SAVED_MAX RLIM_INFINITY /* Unrepresentable hard limit */ -#define RLIM_SAVED_CUR RLIM_INFINITY /* Unrepresentable soft limit */ - -/* - * Possible values of the first parameter to getrlimit()/setrlimit(), to - * indicate for which resource the operation is being performed. - */ -#define RLIMIT_CPU 0 /* cpu time per process */ -#define RLIMIT_FSIZE 1 /* file size */ -#define RLIMIT_DATA 2 /* data segment size */ -#define RLIMIT_STACK 3 /* stack size */ -#define RLIMIT_CORE 4 /* core file size */ -#define RLIMIT_AS 5 /* address space (resident set size) */ -#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL -#define RLIMIT_RSS RLIMIT_AS /* source compatibility alias */ -#define RLIMIT_MEMLOCK 6 /* locked-in-memory address space */ -#define RLIMIT_NPROC 7 /* number of processes */ -#endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ -#define RLIMIT_NOFILE 8 /* number of open files */ -#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL -#define RLIM_NLIMITS 9 /* total number of resource limits */ -#endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ -#define _RLIMIT_POSIX_FLAG 0x1000 /* Set bit for strict POSIX */ - -/* - * A structure representing a resource limit. The address of an instance - * of this structure is the second parameter to getrlimit()/setrlimit(). - */ -struct rlimit { - rlim_t rlim_cur; /* current (soft) limit */ - rlim_t rlim_max; /* maximum value for rlim_cur */ -}; - -#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL -/* - * proc_rlimit_control() - * - * Resource limit flavors - */ -#define RLIMIT_WAKEUPS_MONITOR 0x1 /* Configure the wakeups monitor. */ -#define RLIMIT_CPU_USAGE_MONITOR 0x2 /* Configure the CPU usage monitor. */ -#define RLIMIT_THREAD_CPULIMITS 0x3 /* Configure a blocking, per-thread, CPU limits. */ -#define RLIMIT_FOOTPRINT_INTERVAL 0x4 /* Configure memory footprint interval tracking */ - -/* - * Flags for wakeups monitor control. - */ -#define WAKEMON_ENABLE 0x01 -#define WAKEMON_DISABLE 0x02 -#define WAKEMON_GET_PARAMS 0x04 -#define WAKEMON_SET_DEFAULTS 0x08 -#define WAKEMON_MAKE_FATAL 0x10 /* Configure the task so that violations are fatal. */ - -/* - * Flags for CPU usage monitor control. - */ -#define CPUMON_MAKE_FATAL 0x1000 - -/* - * Flags for memory footprint interval tracking. - */ -#define FOOTPRINT_INTERVAL_RESET 0x1 /* Reset the footprint interval counter to zero */ - -struct proc_rlimit_control_wakeupmon { - uint32_t wm_flags; - int32_t wm_rate; -}; - - - -/* I/O type */ -#define IOPOL_TYPE_DISK 0 -#define IOPOL_TYPE_VFS_ATIME_UPDATES 2 -#define IOPOL_TYPE_VFS_MATERIALIZE_DATALESS_FILES 3 -#define IOPOL_TYPE_VFS_STATFS_NO_DATA_VOLUME 4 - -/* scope */ -#define IOPOL_SCOPE_PROCESS 0 -#define IOPOL_SCOPE_THREAD 1 -#define IOPOL_SCOPE_DARWIN_BG 2 - -/* I/O Priority */ -#define IOPOL_DEFAULT 0 -#define IOPOL_IMPORTANT 1 -#define IOPOL_PASSIVE 2 -#define IOPOL_THROTTLE 3 -#define IOPOL_UTILITY 4 -#define IOPOL_STANDARD 5 - -/* compatibility with older names */ -#define IOPOL_APPLICATION IOPOL_STANDARD -#define IOPOL_NORMAL IOPOL_IMPORTANT - - -#define IOPOL_ATIME_UPDATES_DEFAULT 0 -#define IOPOL_ATIME_UPDATES_OFF 1 - -#define IOPOL_MATERIALIZE_DATALESS_FILES_DEFAULT 0 -#define IOPOL_MATERIALIZE_DATALESS_FILES_OFF 1 -#define IOPOL_MATERIALIZE_DATALESS_FILES_ON 2 - -#define IOPOL_VFS_STATFS_NO_DATA_VOLUME_DEFAULT 0 -#define IOPOL_VFS_STATFS_FORCE_NO_DATA_VOLUME 1 - -#endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ - - -__BEGIN_DECLS -int getpriority(int, id_t); -#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL -int getiopolicy_np(int, int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); -#endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ -int getrlimit(int, struct rlimit *) __DARWIN_ALIAS(getrlimit); -int getrusage(int, struct rusage *); -int setpriority(int, id_t, int); -#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL -int setiopolicy_np(int, int, int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); -#endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ -int setrlimit(int, const struct rlimit *) __DARWIN_ALIAS(setrlimit); -__END_DECLS - -#endif /* !_SYS_RESOURCE_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/shm.h b/lib/libc/include/x86_64-macos-gnu/sys/shm.h deleted file mode 100644 index 0e5070a03b..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/shm.h +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Copyright (c) 2000-2002 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* $NetBSD: shm.h,v 1.15 1994/06/29 06:45:17 cgd Exp $ */ - -/* - * Copyright (c) 1994 Adam Glass - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Adam Glass. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * As defined+described in "X/Open System Interfaces and Headers" - * Issue 4, p. XXX - */ - -#ifndef _SYS_SHM_H_ -#define _SYS_SHM_H_ - -#include -#include - -/* - * [XSI] All of the symbols from SHALL be defined - * when this header is included - */ -#include - -/* - * [XSI] The pid_t, time_t, key_t, and size_t types shall be defined as - * described in . - * - * NOTE: The definition of the key_t type is implicit from the - * inclusion of - */ -#include -#include -#include - -/* - * [XSI] The unsigned integer type used for the number of current attaches - * that MUST be able to store values at least as large as a type unsigned - * short. - */ -typedef unsigned short shmatt_t; - - -/* - * Possible flag values which may be OR'ed into the third argument to - * shmat() - */ -#define SHM_RDONLY 010000 /* [XSI] Attach read-only (else read-write) */ -#define SHM_RND 020000 /* [XSI] Round attach address to SHMLBA */ - -/* - * This value is symbolic, and generally not expected to be sed by user - * programs directly, although such ise is permitted by the standard. Its - * value in our implementation is equal to the number of bytes per page. - * - * NOTE: We DO NOT obtain this value from the appropriate system - * headers at this time, to avoid the resulting namespace - * pollution, which is why we discourages its use. - */ -#define SHMLBA 4096 /* [XSI] Segment low boundary address multiple*/ - -/* "official" access mode definitions; somewhat braindead since you have - * to specify (SHM_* >> 3) for group and (SHM_* >> 6) for world permissions */ -#define SHM_R (IPC_R) -#define SHM_W (IPC_W) - -#pragma pack(4) - -/* - * Technically, we should force all code references to the new structure - * definition, not in just the standards conformance case, and leave the - * legacy interface there for binary compatibility only. Currently, we - * are only forcing this for programs requesting standards conformance. - */ -#if __DARWIN_UNIX03 || defined(KERNEL) -/* - * Structure used internally. - * - * This structure is exposed because standards dictate that it is used as - * the third argment to shmctl(). - * - * NOTE: The field shm_internal is not meaningful in user space, - * and must not be used there. - */ -#if (defined(_POSIX_C_SOURCE) && !defined(_DARWIN_C_SOURCE)) -struct shmid_ds -#else -#define shmid_ds __shmid_ds_new -struct __shmid_ds_new -#endif -{ - struct __ipc_perm_new shm_perm; /* [XSI] Operation permission value */ - size_t shm_segsz; /* [XSI] Size of segment in bytes */ - pid_t shm_lpid; /* [XSI] PID of last shared memory op */ - pid_t shm_cpid; /* [XSI] PID of creator */ - shmatt_t shm_nattch; /* [XSI] Number of current attaches */ - time_t shm_atime; /* [XSI] Time of last shmat() */ - time_t shm_dtime; /* [XSI] Time of last shmdt() */ - time_t shm_ctime; /* [XSI] Time of last shmctl() change */ - void *shm_internal; /* reserved for kernel use */ -}; -#else /* !__DARWIN_UNIX03 */ -#define shmid_ds __shmid_ds_old -#endif /* !__DARWIN_UNIX03 */ - -#if !__DARWIN_UNIX03 -struct __shmid_ds_old { - struct __ipc_perm_old shm_perm; /* [XSI] Operation permission value */ - size_t shm_segsz; /* [XSI] Size of segment in bytes */ - pid_t shm_lpid; /* [XSI] PID of last shared memory op */ - pid_t shm_cpid; /* [XSI] PID of creator */ - shmatt_t shm_nattch; /* [XSI] Number of current attaches */ - time_t shm_atime; /* [XSI] Time of last shmat() */ - time_t shm_dtime; /* [XSI] Time of last shmdt() */ - time_t shm_ctime; /* [XSI] Time of last shmctl() change */ - void *shm_internal; /* reserved for kernel use */ -}; -#endif /* !__DARWIN_UNIX03 */ - -#pragma pack() - - -__BEGIN_DECLS -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -int shmsys(int, ...); -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ -void *shmat(int, const void *, int); -int shmctl(int, int, struct shmid_ds *) __DARWIN_ALIAS(shmctl); -int shmdt(const void *); -int shmget(key_t, size_t, int); -__END_DECLS - - -#endif /* !_SYS_SHM_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/socket.h b/lib/libc/include/x86_64-macos-gnu/sys/socket.h deleted file mode 100644 index c8a0d27615..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/socket.h +++ /dev/null @@ -1,732 +0,0 @@ -/* - * Copyright (c) 2000-2019 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* Copyright (c) 1998, 1999 Apple Computer, Inc. All Rights Reserved */ -/* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */ -/* - * Copyright (c) 1982, 1985, 1986, 1988, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)socket.h 8.4 (Berkeley) 2/21/94 - * $FreeBSD: src/sys/sys/socket.h,v 1.39.2.7 2001/07/03 11:02:01 ume Exp $ - */ -/* - * NOTICE: This file was modified by SPARTA, Inc. in 2005 to introduce - * support for mandatory and extensible security protections. This notice - * is included in support of clause 2.2 (b) of the Apple Public License, - * Version 2.0. - */ - -#ifndef _SYS_SOCKET_H_ -#define _SYS_SOCKET_H_ - -#include -#include -#include -#include - - -#include - -/* - * Definitions related to sockets: types, address families, options. - */ - -/* - * Data types. - */ - -#include -#include -#include -#include -#include - -/* XXX Not explicitly defined by POSIX, but function return types are */ -#include - -/* XXX Not explicitly defined by POSIX, but function return types are */ -#include - -/* - * [XSI] The iovec structure shall be defined as described in . - */ -#include - -/* - * Types - */ -#define SOCK_STREAM 1 /* stream socket */ -#define SOCK_DGRAM 2 /* datagram socket */ -#define SOCK_RAW 3 /* raw-protocol interface */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define SOCK_RDM 4 /* reliably-delivered message */ -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ -#define SOCK_SEQPACKET 5 /* sequenced packet stream */ - -/* - * Option flags per-socket. - */ -#define SO_DEBUG 0x0001 /* turn on debugging info recording */ -#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */ -#define SO_REUSEADDR 0x0004 /* allow local address reuse */ -#define SO_KEEPALIVE 0x0008 /* keep connections alive */ -#define SO_DONTROUTE 0x0010 /* just use interface addresses */ -#define SO_BROADCAST 0x0020 /* permit sending of broadcast msgs */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define SO_USELOOPBACK 0x0040 /* bypass hardware when possible */ -#define SO_LINGER 0x0080 /* linger on close if data present (in ticks) */ -#else -#define SO_LINGER 0x1080 /* linger on close if data present (in seconds) */ -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ -#define SO_OOBINLINE 0x0100 /* leave received OOB data in line */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define SO_REUSEPORT 0x0200 /* allow local address & port reuse */ -#define SO_TIMESTAMP 0x0400 /* timestamp received dgram traffic */ -#define SO_TIMESTAMP_MONOTONIC 0x0800 /* Monotonically increasing timestamp on rcvd dgram */ -#ifndef __APPLE__ -#define SO_ACCEPTFILTER 0x1000 /* there is an accept filter */ -#else -#define SO_DONTTRUNC 0x2000 /* APPLE: Retain unread data */ - /* (ATOMIC proto) */ -#define SO_WANTMORE 0x4000 /* APPLE: Give hint when more data ready */ -#define SO_WANTOOBFLAG 0x8000 /* APPLE: Want OOB in MSG_FLAG on receive */ - - -#endif /* (!__APPLE__) */ -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ - -/* - * Additional options, not kept in so_options. - */ -#define SO_SNDBUF 0x1001 /* send buffer size */ -#define SO_RCVBUF 0x1002 /* receive buffer size */ -#define SO_SNDLOWAT 0x1003 /* send low-water mark */ -#define SO_RCVLOWAT 0x1004 /* receive low-water mark */ -#define SO_SNDTIMEO 0x1005 /* send timeout */ -#define SO_RCVTIMEO 0x1006 /* receive timeout */ -#define SO_ERROR 0x1007 /* get error status and clear */ -#define SO_TYPE 0x1008 /* get socket type */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define SO_LABEL 0x1010 /* socket's MAC label */ -#define SO_PEERLABEL 0x1011 /* socket's peer MAC label */ -#ifdef __APPLE__ -#define SO_NREAD 0x1020 /* APPLE: get 1st-packet byte count */ -#define SO_NKE 0x1021 /* APPLE: Install socket-level NKE */ -#define SO_NOSIGPIPE 0x1022 /* APPLE: No SIGPIPE on EPIPE */ -#define SO_NOADDRERR 0x1023 /* APPLE: Returns EADDRNOTAVAIL when src is not available anymore */ -#define SO_NWRITE 0x1024 /* APPLE: Get number of bytes currently in send socket buffer */ -#define SO_REUSESHAREUID 0x1025 /* APPLE: Allow reuse of port/socket by different userids */ -#ifdef __APPLE_API_PRIVATE -#define SO_NOTIFYCONFLICT 0x1026 /* APPLE: send notification if there is a bind on a port which is already in use */ -#define SO_UPCALLCLOSEWAIT 0x1027 /* APPLE: block on close until an upcall returns */ -#endif -#define SO_LINGER_SEC 0x1080 /* linger on close if data present (in seconds) */ -#define SO_RANDOMPORT 0x1082 /* APPLE: request local port randomization */ -#define SO_NP_EXTENSIONS 0x1083 /* To turn off some POSIX behavior */ -#endif - -#define SO_NUMRCVPKT 0x1112 /* number of datagrams in receive socket buffer */ -#define SO_NET_SERVICE_TYPE 0x1116 /* Network service type */ - - -#define SO_NETSVC_MARKING_LEVEL 0x1119 /* Get QoS marking in effect for socket */ - -/* - * Network Service Type for option SO_NET_SERVICE_TYPE - * - * The vast majority of sockets should use Best Effort that is the default - * Network Service Type. Other Network Service Types have to be used only if - * the traffic actually matches the description of the Network Service Type. - * - * Network Service Types do not represent priorities but rather describe - * different categories of delay, jitter and loss parameters. - * Those parameters may influence protocols from layer 4 protocols like TCP - * to layer 2 protocols like Wi-Fi. The Network Service Type can determine - * how the traffic is queued and scheduled by the host networking stack and - * by other entities on the network like switches and routers. For example - * for Wi-Fi, the Network Service Type can select the marking of the - * layer 2 packet with the appropriate WMM Access Category. - * - * There is no point in attempting to game the system and use - * a Network Service Type that does not correspond to the actual - * traffic characteristic but one that seems to have a higher precedence. - * The reason is that for service classes that have lower tolerance - * for delay and jitter, the queues size is lower than for service - * classes that are more tolerant to delay and jitter. - * - * For example using a voice service type for bulk data transfer will lead - * to disastrous results as soon as congestion happens because the voice - * queue overflows and packets get dropped. This is not only bad for the bulk - * data transfer but it is also bad for VoIP apps that legitimately are using - * the voice service type. - * - * The characteristics of the Network Service Types are based on the service - * classes defined in RFC 4594 "Configuration Guidelines for DiffServ Service - * Classes" - * - * When system detects the outgoing interface belongs to a DiffServ domain - * that follows the recommendation of the IETF draft "Guidelines for DiffServ to - * IEEE 802.11 Mapping", the packet will marked at layer 3 with a DSCP value - * that corresponds to Network Service Type. - * - * NET_SERVICE_TYPE_BE - * "Best Effort", unclassified/standard. This is the default service - * class and cover the majority of the traffic. - * - * NET_SERVICE_TYPE_BK - * "Background", high delay tolerant, loss tolerant. elastic flow, - * variable size & long-lived. E.g: non-interactive network bulk transfer - * like synching or backup. - * - * NET_SERVICE_TYPE_RD - * "Responsive Data", a notch higher than "Best Effort", medium delay - * tolerant, elastic & inelastic flow, bursty, long-lived. E.g. email, - * instant messaging, for which there is a sense of interactivity and - * urgency (user waiting for output). - * - * NET_SERVICE_TYPE_OAM - * "Operations, Administration, and Management", medium delay tolerant, - * low-medium loss tolerant, elastic & inelastic flows, variable size. - * E.g. VPN tunnels. - * - * NET_SERVICE_TYPE_AV - * "Multimedia Audio/Video Streaming", medium delay tolerant, low-medium - * loss tolerant, elastic flow, constant packet interval, variable rate - * and size. E.g. video and audio playback with buffering. - * - * NET_SERVICE_TYPE_RV - * "Responsive Multimedia Audio/Video", low delay tolerant, low-medium - * loss tolerant, elastic flow, variable packet interval, rate and size. - * E.g. screen sharing. - * - * NET_SERVICE_TYPE_VI - * "Interactive Video", low delay tolerant, low-medium loss tolerant, - * elastic flow, constant packet interval, variable rate & size. E.g. - * video telephony. - * - * NET_SERVICE_TYPE_SIG - * "Signaling", low delay tolerant, low loss tolerant, inelastic flow, - * jitter tolerant, rate is bursty but short, variable size. E.g. SIP. - * - * NET_SERVICE_TYPE_VO - * "Interactive Voice", very low delay tolerant, very low loss tolerant, - * inelastic flow, constant packet rate, somewhat fixed size. - * E.g. VoIP. - */ - -#define NET_SERVICE_TYPE_BE 0 /* Best effort */ -#define NET_SERVICE_TYPE_BK 1 /* Background system initiated */ -#define NET_SERVICE_TYPE_SIG 2 /* Signaling */ -#define NET_SERVICE_TYPE_VI 3 /* Interactive Video */ -#define NET_SERVICE_TYPE_VO 4 /* Interactive Voice */ -#define NET_SERVICE_TYPE_RV 5 /* Responsive Multimedia Audio/Video */ -#define NET_SERVICE_TYPE_AV 6 /* Multimedia Audio/Video Streaming */ -#define NET_SERVICE_TYPE_OAM 7 /* Operations, Administration, and Management */ -#define NET_SERVICE_TYPE_RD 8 /* Responsive Data */ - - -/* These are supported values for SO_NETSVC_MARKING_LEVEL */ -#define NETSVC_MRKNG_UNKNOWN 0 /* The outgoing network interface is not known */ -#define NETSVC_MRKNG_LVL_L2 1 /* Default marking at layer 2 (for example Wi-Fi WMM) */ -#define NETSVC_MRKNG_LVL_L3L2_ALL 2 /* Layer 3 DSCP marking and layer 2 marking for all Network Service Types */ -#define NETSVC_MRKNG_LVL_L3L2_BK 3 /* The system policy limits layer 3 DSCP marking and layer 2 marking - * to background Network Service Types */ - - -typedef __uint32_t sae_associd_t; -#define SAE_ASSOCID_ANY 0 -#define SAE_ASSOCID_ALL ((sae_associd_t)(-1ULL)) - -typedef __uint32_t sae_connid_t; -#define SAE_CONNID_ANY 0 -#define SAE_CONNID_ALL ((sae_connid_t)(-1ULL)) - -/* connectx() flag parameters */ -#define CONNECT_RESUME_ON_READ_WRITE 0x1 /* resume connect() on read/write */ -#define CONNECT_DATA_IDEMPOTENT 0x2 /* data is idempotent */ -#define CONNECT_DATA_AUTHENTICATED 0x4 /* data includes security that replaces the TFO-cookie */ - -/* sockaddr endpoints */ -typedef struct sa_endpoints { - unsigned int sae_srcif; /* optional source interface */ - const struct sockaddr *sae_srcaddr; /* optional source address */ - socklen_t sae_srcaddrlen; /* size of source address */ - const struct sockaddr *sae_dstaddr; /* destination address */ - socklen_t sae_dstaddrlen; /* size of destination address */ -} sa_endpoints_t; -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ - -/* - * Structure used for manipulating linger option. - */ -struct linger { - int l_onoff; /* option on/off */ - int l_linger; /* linger time */ -}; - -#ifndef __APPLE__ -struct accept_filter_arg { - char af_name[16]; - char af_arg[256 - 16]; -}; -#endif - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#ifdef __APPLE__ - -/* - * Structure to control non-portable Sockets extension to POSIX - */ -struct so_np_extensions { - u_int32_t npx_flags; - u_int32_t npx_mask; -}; - -#define SONPX_SETOPTSHUT 0x000000001 /* flag for allowing setsockopt after shutdown */ - - - -#endif -#endif - -/* - * Level number for (get/set)sockopt() to apply to socket itself. - */ -#define SOL_SOCKET 0xffff /* options for socket level */ - - -/* - * Address families. - */ -#define AF_UNSPEC 0 /* unspecified */ -#define AF_UNIX 1 /* local to host (pipes) */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define AF_LOCAL AF_UNIX /* backward compatibility */ -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ -#define AF_INET 2 /* internetwork: UDP, TCP, etc. */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define AF_IMPLINK 3 /* arpanet imp addresses */ -#define AF_PUP 4 /* pup protocols: e.g. BSP */ -#define AF_CHAOS 5 /* mit CHAOS protocols */ -#define AF_NS 6 /* XEROX NS protocols */ -#define AF_ISO 7 /* ISO protocols */ -#define AF_OSI AF_ISO -#define AF_ECMA 8 /* European computer manufacturers */ -#define AF_DATAKIT 9 /* datakit protocols */ -#define AF_CCITT 10 /* CCITT protocols, X.25 etc */ -#define AF_SNA 11 /* IBM SNA */ -#define AF_DECnet 12 /* DECnet */ -#define AF_DLI 13 /* DEC Direct data link interface */ -#define AF_LAT 14 /* LAT */ -#define AF_HYLINK 15 /* NSC Hyperchannel */ -#define AF_APPLETALK 16 /* Apple Talk */ -#define AF_ROUTE 17 /* Internal Routing Protocol */ -#define AF_LINK 18 /* Link layer interface */ -#define pseudo_AF_XTP 19 /* eXpress Transfer Protocol (no AF) */ -#define AF_COIP 20 /* connection-oriented IP, aka ST II */ -#define AF_CNT 21 /* Computer Network Technology */ -#define pseudo_AF_RTIP 22 /* Help Identify RTIP packets */ -#define AF_IPX 23 /* Novell Internet Protocol */ -#define AF_SIP 24 /* Simple Internet Protocol */ -#define pseudo_AF_PIP 25 /* Help Identify PIP packets */ -#define AF_NDRV 27 /* Network Driver 'raw' access */ -#define AF_ISDN 28 /* Integrated Services Digital Network */ -#define AF_E164 AF_ISDN /* CCITT E.164 recommendation */ -#define pseudo_AF_KEY 29 /* Internal key-management function */ -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ -#define AF_INET6 30 /* IPv6 */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define AF_NATM 31 /* native ATM access */ -#define AF_SYSTEM 32 /* Kernel event messages */ -#define AF_NETBIOS 33 /* NetBIOS */ -#define AF_PPP 34 /* PPP communication protocol */ -#define pseudo_AF_HDRCMPLT 35 /* Used by BPF to not rewrite headers - * in interface output routine */ -#define AF_RESERVED_36 36 /* Reserved for internal usage */ -#define AF_IEEE80211 37 /* IEEE 802.11 protocol */ -#define AF_UTUN 38 -#define AF_MAX 40 -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ - -/* - * [XSI] Structure used by kernel to store most addresses. - */ -struct sockaddr { - __uint8_t sa_len; /* total length */ - sa_family_t sa_family; /* [XSI] address family */ - char sa_data[14]; /* [XSI] addr value (actually larger) */ -}; - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define SOCK_MAXADDRLEN 255 /* longest possible addresses */ - -/* - * Structure used by kernel to pass protocol - * information in raw sockets. - */ -struct sockproto { - __uint16_t sp_family; /* address family */ - __uint16_t sp_protocol; /* protocol */ -}; -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ - -/* - * RFC 2553: protocol-independent placeholder for socket addresses - */ -#define _SS_MAXSIZE 128 -#define _SS_ALIGNSIZE (sizeof(__int64_t)) -#define _SS_PAD1SIZE \ - (_SS_ALIGNSIZE - sizeof(__uint8_t) - sizeof(sa_family_t)) -#define _SS_PAD2SIZE \ - (_SS_MAXSIZE - sizeof(__uint8_t) - sizeof(sa_family_t) - \ - _SS_PAD1SIZE - _SS_ALIGNSIZE) - -/* - * [XSI] sockaddr_storage - */ -struct sockaddr_storage { - __uint8_t ss_len; /* address length */ - sa_family_t ss_family; /* [XSI] address family */ - char __ss_pad1[_SS_PAD1SIZE]; - __int64_t __ss_align; /* force structure storage alignment */ - char __ss_pad2[_SS_PAD2SIZE]; -}; - -/* - * Protocol families, same as address families for now. - */ -#define PF_UNSPEC AF_UNSPEC -#define PF_LOCAL AF_LOCAL -#define PF_UNIX PF_LOCAL /* backward compatibility */ -#define PF_INET AF_INET -#define PF_IMPLINK AF_IMPLINK -#define PF_PUP AF_PUP -#define PF_CHAOS AF_CHAOS -#define PF_NS AF_NS -#define PF_ISO AF_ISO -#define PF_OSI AF_ISO -#define PF_ECMA AF_ECMA -#define PF_DATAKIT AF_DATAKIT -#define PF_CCITT AF_CCITT -#define PF_SNA AF_SNA -#define PF_DECnet AF_DECnet -#define PF_DLI AF_DLI -#define PF_LAT AF_LAT -#define PF_HYLINK AF_HYLINK -#define PF_APPLETALK AF_APPLETALK -#define PF_ROUTE AF_ROUTE -#define PF_LINK AF_LINK -#define PF_XTP pseudo_AF_XTP /* really just proto family, no AF */ -#define PF_COIP AF_COIP -#define PF_CNT AF_CNT -#define PF_SIP AF_SIP -#define PF_IPX AF_IPX /* same format as AF_NS */ -#define PF_RTIP pseudo_AF_RTIP /* same format as AF_INET */ -#define PF_PIP pseudo_AF_PIP -#define PF_NDRV AF_NDRV -#define PF_ISDN AF_ISDN -#define PF_KEY pseudo_AF_KEY -#define PF_INET6 AF_INET6 -#define PF_NATM AF_NATM -#define PF_SYSTEM AF_SYSTEM -#define PF_NETBIOS AF_NETBIOS -#define PF_PPP AF_PPP -#define PF_RESERVED_36 AF_RESERVED_36 -#define PF_UTUN AF_UTUN -#define PF_MAX AF_MAX - -/* - * These do not have socket-layer support: - */ -#define PF_VLAN ((uint32_t)0x766c616e) /* 'vlan' */ -#define PF_BOND ((uint32_t)0x626f6e64) /* 'bond' */ - -/* - * Definitions for network related sysctl, CTL_NET. - * - * Second level is protocol family. - * Third level is protocol number. - * - * Further levels are defined by the individual families below. - */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define NET_MAXID AF_MAX -#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ - - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -/* - * PF_ROUTE - Routing table - * - * Three additional levels are defined: - * Fourth: address family, 0 is wildcard - * Fifth: type of info, defined below - * Sixth: flag(s) to mask with for NET_RT_FLAGS - */ -#define NET_RT_DUMP 1 /* dump; may limit to a.f. */ -#define NET_RT_FLAGS 2 /* by flags, e.g. RESOLVING */ -#define NET_RT_IFLIST 3 /* survey interface list */ -#define NET_RT_STAT 4 /* routing statistics */ -#define NET_RT_TRASH 5 /* routes not in table but not freed */ -#define NET_RT_IFLIST2 6 /* interface list with addresses */ -#define NET_RT_DUMP2 7 /* dump; may limit to a.f. */ -/* - * Allows read access non-local host's MAC address - * if the process has neighbor cache entitlement. - */ -#define NET_RT_FLAGS_PRIV 10 -#define NET_RT_MAXID 11 -#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ - - - - -/* - * Maximum queue length specifiable by listen. - */ -#define SOMAXCONN 128 - -/* - * [XSI] Message header for recvmsg and sendmsg calls. - * Used value-result for recvmsg, value only for sendmsg. - */ -struct msghdr { - void *msg_name; /* [XSI] optional address */ - socklen_t msg_namelen; /* [XSI] size of address */ - struct iovec *msg_iov; /* [XSI] scatter/gather array */ - int msg_iovlen; /* [XSI] # elements in msg_iov */ - void *msg_control; /* [XSI] ancillary data, see below */ - socklen_t msg_controllen; /* [XSI] ancillary data buffer len */ - int msg_flags; /* [XSI] flags on received message */ -}; - - - -#define MSG_OOB 0x1 /* process out-of-band data */ -#define MSG_PEEK 0x2 /* peek at incoming message */ -#define MSG_DONTROUTE 0x4 /* send without using routing tables */ -#define MSG_EOR 0x8 /* data completes record */ -#define MSG_TRUNC 0x10 /* data discarded before delivery */ -#define MSG_CTRUNC 0x20 /* control data lost before delivery */ -#define MSG_WAITALL 0x40 /* wait for full request or error */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define MSG_DONTWAIT 0x80 /* this message should be nonblocking */ -#define MSG_EOF 0x100 /* data completes connection */ -#ifdef __APPLE__ -#ifdef __APPLE_API_OBSOLETE -#define MSG_WAITSTREAM 0x200 /* wait up to full request.. may return partial */ -#endif -#define MSG_FLUSH 0x400 /* Start of 'hold' seq; dump so_temp, deprecated */ -#define MSG_HOLD 0x800 /* Hold frag in so_temp, deprecated */ -#define MSG_SEND 0x1000 /* Send the packet in so_temp, deprecated */ -#define MSG_HAVEMORE 0x2000 /* Data ready to be read */ -#define MSG_RCVMORE 0x4000 /* Data remains in current pkt */ -#endif -#define MSG_NEEDSA 0x10000 /* Fail receive if socket address cannot be allocated */ -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ - -/* - * Header for ancillary data objects in msg_control buffer. - * Used for additional information with/about a datagram - * not expressible by flags. The format is a sequence - * of message elements headed by cmsghdr structures. - */ -struct cmsghdr { - socklen_t cmsg_len; /* [XSI] data byte count, including hdr */ - int cmsg_level; /* [XSI] originating protocol */ - int cmsg_type; /* [XSI] protocol-specific type */ -/* followed by unsigned char cmsg_data[]; */ -}; - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#ifndef __APPLE__ -/* - * While we may have more groups than this, the cmsgcred struct must - * be able to fit in an mbuf, and NGROUPS_MAX is too large to allow - * this. - */ -#define CMGROUP_MAX 16 - -/* - * Credentials structure, used to verify the identity of a peer - * process that has sent us a message. This is allocated by the - * peer process but filled in by the kernel. This prevents the - * peer from lying about its identity. (Note that cmcred_groups[0] - * is the effective GID.) - */ -struct cmsgcred { - pid_t cmcred_pid; /* PID of sending process */ - uid_t cmcred_uid; /* real UID of sending process */ - uid_t cmcred_euid; /* effective UID of sending process */ - gid_t cmcred_gid; /* real GID of sending process */ - short cmcred_ngroups; /* number or groups */ - gid_t cmcred_groups[CMGROUP_MAX]; /* groups */ -}; -#endif -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ - -/* given pointer to struct cmsghdr, return pointer to data */ -#define CMSG_DATA(cmsg) ((unsigned char *)(cmsg) + \ - __DARWIN_ALIGN32(sizeof(struct cmsghdr))) - -/* - * RFC 2292 requires to check msg_controllen, in case that the kernel returns - * an empty list for some reasons. - */ -#define CMSG_FIRSTHDR(mhdr) \ - ((mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \ - (struct cmsghdr *)(mhdr)->msg_control : \ - (struct cmsghdr *)0L) - - -/* - * Given pointer to struct cmsghdr, return pointer to next cmsghdr - * RFC 2292 says that CMSG_NXTHDR(mhdr, NULL) is equivalent to CMSG_FIRSTHDR(mhdr) - */ -#define CMSG_NXTHDR(mhdr, cmsg) \ - ((char *)(cmsg) == (char *)0L ? CMSG_FIRSTHDR(mhdr) : \ - ((((unsigned char *)(cmsg) + \ - __DARWIN_ALIGN32((__uint32_t)(cmsg)->cmsg_len) + \ - __DARWIN_ALIGN32(sizeof(struct cmsghdr))) > \ - ((unsigned char *)(mhdr)->msg_control + \ - (mhdr)->msg_controllen)) ? \ - (struct cmsghdr *)0L /* NULL */ : \ - (struct cmsghdr *)(void *)((unsigned char *)(cmsg) + \ - __DARWIN_ALIGN32((__uint32_t)(cmsg)->cmsg_len)))) - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -/* RFC 2292 additions */ -#define CMSG_SPACE(l) (__DARWIN_ALIGN32(sizeof(struct cmsghdr)) + __DARWIN_ALIGN32(l)) -#define CMSG_LEN(l) (__DARWIN_ALIGN32(sizeof(struct cmsghdr)) + (l)) - -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ - -/* "Socket"-level control message types: */ -#define SCM_RIGHTS 0x01 /* access rights (array of int) */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define SCM_TIMESTAMP 0x02 /* timestamp (struct timeval) */ -#define SCM_CREDS 0x03 /* process creds (struct cmsgcred) */ -#define SCM_TIMESTAMP_MONOTONIC 0x04 /* timestamp (uint64_t) */ - - -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ - -/* - * howto arguments for shutdown(2), specified by Posix.1g. - */ -#define SHUT_RD 0 /* shut down the reading side */ -#define SHUT_WR 1 /* shut down the writing side */ -#define SHUT_RDWR 2 /* shut down both sides */ - -#if !defined(_POSIX_C_SOURCE) -/* - * sendfile(2) header/trailer struct - */ -struct sf_hdtr { - struct iovec *headers; /* pointer to an array of header struct iovec's */ - int hdr_cnt; /* number of header iovec's */ - struct iovec *trailers; /* pointer to an array of trailer struct iovec's */ - int trl_cnt; /* number of trailer iovec's */ -}; - - -#endif /* !_POSIX_C_SOURCE */ - - -__BEGIN_DECLS - -int accept(int, struct sockaddr * __restrict, socklen_t * __restrict) -__DARWIN_ALIAS_C(accept); -int bind(int, const struct sockaddr *, socklen_t) __DARWIN_ALIAS(bind); -int connect(int, const struct sockaddr *, socklen_t) __DARWIN_ALIAS_C(connect); -int getpeername(int, struct sockaddr * __restrict, socklen_t * __restrict) -__DARWIN_ALIAS(getpeername); -int getsockname(int, struct sockaddr * __restrict, socklen_t * __restrict) -__DARWIN_ALIAS(getsockname); -int getsockopt(int, int, int, void * __restrict, socklen_t * __restrict); -int listen(int, int) __DARWIN_ALIAS(listen); -ssize_t recv(int, void *, size_t, int) __DARWIN_ALIAS_C(recv); -ssize_t recvfrom(int, void *, size_t, int, struct sockaddr * __restrict, - socklen_t * __restrict) __DARWIN_ALIAS_C(recvfrom); -ssize_t recvmsg(int, struct msghdr *, int) __DARWIN_ALIAS_C(recvmsg); -ssize_t send(int, const void *, size_t, int) __DARWIN_ALIAS_C(send); -ssize_t sendmsg(int, const struct msghdr *, int) __DARWIN_ALIAS_C(sendmsg); -ssize_t sendto(int, const void *, size_t, - int, const struct sockaddr *, socklen_t) __DARWIN_ALIAS_C(sendto); -int setsockopt(int, int, int, const void *, socklen_t); -int shutdown(int, int); -int sockatmark(int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); -int socket(int, int, int); -int socketpair(int, int, int, int *) __DARWIN_ALIAS(socketpair); - -#if !defined(_POSIX_C_SOURCE) -int sendfile(int, int, off_t, off_t *, struct sf_hdtr *, int); -#endif /* !_POSIX_C_SOURCE */ - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -void pfctlinput(int, struct sockaddr *); - -__API_AVAILABLE(macosx(10.11), ios(9.0), tvos(9.0), watchos(2.0)) -int connectx(int, const sa_endpoints_t *, sae_associd_t, unsigned int, - const struct iovec *, unsigned int, size_t *, sae_connid_t *); - -__API_AVAILABLE(macosx(10.11), ios(9.0), tvos(9.0), watchos(2.0)) -int disconnectx(int, sae_associd_t, sae_connid_t); -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ -__END_DECLS - - -#endif /* !_SYS_SOCKET_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/sockio.h b/lib/libc/include/x86_64-macos-gnu/sys/sockio.h deleted file mode 100644 index c18d55b522..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/sockio.h +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright (c) 2000-2019 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */ -/*- - * Copyright (c) 1982, 1986, 1990, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)sockio.h 8.1 (Berkeley) 3/28/94 - */ - -#ifndef _SYS_SOCKIO_H_ -#define _SYS_SOCKIO_H_ - -#include - -#include - -/* Socket ioctl's. */ -#define SIOCSHIWAT _IOW('s', 0, int) /* set high watermark */ -#define SIOCGHIWAT _IOR('s', 1, int) /* get high watermark */ -#define SIOCSLOWAT _IOW('s', 2, int) /* set low watermark */ -#define SIOCGLOWAT _IOR('s', 3, int) /* get low watermark */ -#define SIOCATMARK _IOR('s', 7, int) /* at oob mark? */ -#define SIOCSPGRP _IOW('s', 8, int) /* set process group */ -#define SIOCGPGRP _IOR('s', 9, int) /* get process group */ - -/* - * OSIOCGIF* ioctls are deprecated; they are kept for binary compatibility. - */ -#define SIOCSIFADDR _IOW('i', 12, struct ifreq) /* set ifnet address */ -#define SIOCSIFDSTADDR _IOW('i', 14, struct ifreq) /* set p-p address */ -#define SIOCSIFFLAGS _IOW('i', 16, struct ifreq) /* set ifnet flags */ -#define SIOCGIFFLAGS _IOWR('i', 17, struct ifreq) /* get ifnet flags */ -#define SIOCSIFBRDADDR _IOW('i', 19, struct ifreq) /* set broadcast addr */ -#define SIOCSIFNETMASK _IOW('i', 22, struct ifreq) /* set net addr mask */ -#define SIOCGIFMETRIC _IOWR('i', 23, struct ifreq) /* get IF metric */ -#define SIOCSIFMETRIC _IOW('i', 24, struct ifreq) /* set IF metric */ -#define SIOCDIFADDR _IOW('i', 25, struct ifreq) /* delete IF addr */ -#define SIOCAIFADDR _IOW('i', 26, struct ifaliasreq)/* add/chg IF alias */ - -#define SIOCGIFADDR _IOWR('i', 33, struct ifreq) /* get ifnet address */ -#define SIOCGIFDSTADDR _IOWR('i', 34, struct ifreq) /* get p-p address */ -#define SIOCGIFBRDADDR _IOWR('i', 35, struct ifreq) /* get broadcast addr */ -#define SIOCGIFCONF _IOWR('i', 36, struct ifconf) /* get ifnet list */ -#define SIOCGIFNETMASK _IOWR('i', 37, struct ifreq) /* get net addr mask */ -#define SIOCAUTOADDR _IOWR('i', 38, struct ifreq) /* autoconf address */ -#define SIOCAUTONETMASK _IOW('i', 39, struct ifreq) /* autoconf netmask */ -#define SIOCARPIPLL _IOWR('i', 40, struct ifreq) /* arp for IPv4LL address */ - -#define SIOCADDMULTI _IOW('i', 49, struct ifreq) /* add m'cast addr */ -#define SIOCDELMULTI _IOW('i', 50, struct ifreq) /* del m'cast addr */ -#define SIOCGIFMTU _IOWR('i', 51, struct ifreq) /* get IF mtu */ -#define SIOCSIFMTU _IOW('i', 52, struct ifreq) /* set IF mtu */ -#define SIOCGIFPHYS _IOWR('i', 53, struct ifreq) /* get IF wire */ -#define SIOCSIFPHYS _IOW('i', 54, struct ifreq) /* set IF wire */ -#define SIOCSIFMEDIA _IOWR('i', 55, struct ifreq) /* set net media */ - -/* - * The command SIOCGIFMEDIA does not allow a process to access the extended - * media subtype and extended subtype values are returned as IFM_OTHER. - */ -#define SIOCGIFMEDIA _IOWR('i', 56, struct ifmediareq) /* get compatible net media */ - -#define SIOCSIFGENERIC _IOW('i', 57, struct ifreq) /* generic IF set op */ -#define SIOCGIFGENERIC _IOWR('i', 58, struct ifreq) /* generic IF get op */ -#define SIOCRSLVMULTI _IOWR('i', 59, struct rslvmulti_req) - -#define SIOCSIFLLADDR _IOW('i', 60, struct ifreq) /* set link level addr */ -#define SIOCGIFSTATUS _IOWR('i', 61, struct ifstat) /* get IF status */ -#define SIOCSIFPHYADDR _IOW('i', 62, struct ifaliasreq) /* set gif addres */ -#define SIOCGIFPSRCADDR _IOWR('i', 63, struct ifreq) /* get gif psrc addr */ -#define SIOCGIFPDSTADDR _IOWR('i', 64, struct ifreq) /* get gif pdst addr */ -#define SIOCDIFPHYADDR _IOW('i', 65, struct ifreq) /* delete gif addrs */ - -#define SIOCGIFDEVMTU _IOWR('i', 68, struct ifreq) /* get if ifdevmtu */ -#define SIOCSIFALTMTU _IOW('i', 69, struct ifreq) /* set if alternate mtu */ -#define SIOCGIFALTMTU _IOWR('i', 72, struct ifreq) /* get if alternate mtu */ -#define SIOCSIFBOND _IOW('i', 70, struct ifreq) /* set bond if config */ -#define SIOCGIFBOND _IOWR('i', 71, struct ifreq) /* get bond if config */ - -/* - * The command SIOCGIFXMEDIA is meant to be used by processes only to be able - * to access the extended media subtypes with the extended IFM_TMASK. - * - * An ifnet must not implement SIOCGIFXMEDIA as it gets the extended - * media subtypes by simply compiling with - */ -#define SIOCGIFXMEDIA _IOWR('i', 72, struct ifmediareq) /* get net extended media */ - - -#define SIOCSIFCAP _IOW('i', 90, struct ifreq) /* set IF features */ -#define SIOCGIFCAP _IOWR('i', 91, struct ifreq) /* get IF features */ - -#define SIOCIFCREATE _IOWR('i', 120, struct ifreq) /* create clone if */ -#define SIOCIFDESTROY _IOW('i', 121, struct ifreq) /* destroy clone if */ -#define SIOCIFCREATE2 _IOWR('i', 122, struct ifreq) /* create clone if with data */ - -#define SIOCSDRVSPEC _IOW('i', 123, struct ifdrv) /* set driver-specific - * parameters */ -#define SIOCGDRVSPEC _IOWR('i', 123, struct ifdrv) /* get driver-specific - * parameters */ -#define SIOCSIFVLAN _IOW('i', 126, struct ifreq) /* set VLAN config */ -#define SIOCGIFVLAN _IOWR('i', 127, struct ifreq) /* get VLAN config */ -#define SIOCSETVLAN SIOCSIFVLAN -#define SIOCGETVLAN SIOCGIFVLAN - -#define SIOCIFGCLONERS _IOWR('i', 129, struct if_clonereq) /* get cloners */ - -#define SIOCGIFASYNCMAP _IOWR('i', 124, struct ifreq) /* get ppp asyncmap */ -#define SIOCSIFASYNCMAP _IOW('i', 125, struct ifreq) /* set ppp asyncmap */ - - - -#define SIOCGIFMAC _IOWR('i', 130, struct ifreq) /* get IF MAC label */ -#define SIOCSIFMAC _IOW('i', 131, struct ifreq) /* set IF MAC label */ -#define SIOCSIFKPI _IOW('i', 134, struct ifreq) /* set interface kext param - root only */ -#define SIOCGIFKPI _IOWR('i', 135, struct ifreq) /* get interface kext param */ - -#define SIOCGIFWAKEFLAGS _IOWR('i', 136, struct ifreq) /* get interface wake property flags */ - -#define SIOCGIFFUNCTIONALTYPE _IOWR('i', 173, struct ifreq) /* get interface functional type */ - -#define SIOCSIF6LOWPAN _IOW('i', 196, struct ifreq) /* set 6LOWPAN config */ -#define SIOCGIF6LOWPAN _IOWR('i', 197, struct ifreq) /* get 6LOWPAN config */ - - -#endif /* !_SYS_SOCKIO_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/spawn.h b/lib/libc/include/x86_64-macos-gnu/sys/spawn.h deleted file mode 100644 index 483f017b69..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/spawn.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2006 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ - -/* - * [SPN] Support for _POSIX_SPAWN - * - * This header contains information that is shared between the user space - * and kernel versions of the posix_spawn() code. Shared elements are all - * manifest constants, at the current time. - */ - -#ifndef _SYS_SPAWN_H_ -#define _SYS_SPAWN_H_ - -/* - * Possible bit values which may be OR'ed together and provided as the second - * parameter to posix_spawnattr_setflags() or implicit returned in the value of - * the second parameter to posix_spawnattr_getflags(). - */ -#define POSIX_SPAWN_RESETIDS 0x0001 /* [SPN] R[UG]ID not E[UG]ID */ -#define POSIX_SPAWN_SETPGROUP 0x0002 /* [SPN] set non-parent PGID */ -#define POSIX_SPAWN_SETSIGDEF 0x0004 /* [SPN] reset sigset default */ -#define POSIX_SPAWN_SETSIGMASK 0x0008 /* [SPN] set signal mask */ - -#if 0 /* _POSIX_PRIORITY_SCHEDULING [PS] : not supported */ -#define POSIX_SPAWN_SETSCHEDPARAM 0x0010 -#define POSIX_SPAWN_SETSCHEDULER 0x0020 -#endif /* 0 */ - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -/* - * Darwin-specific flags - */ -#define POSIX_SPAWN_SETEXEC 0x0040 -#define POSIX_SPAWN_START_SUSPENDED 0x0080 -#define POSIX_SPAWN_SETSID 0x0400 -#define POSIX_SPAWN_CLOEXEC_DEFAULT 0x4000 - -/* - * Possible values to be set for the process control actions on resource starvation. - * POSIX_SPAWN_PCONTROL_THROTTLE indicates that the process is to be throttled on starvation. - * POSIX_SPAWN_PCONTROL_SUSPEND indicates that the process is to be suspended on starvation. - * POSIX_SPAWN_PCONTROL_KILL indicates that the process is to be terminated on starvation. - */ -#define POSIX_SPAWN_PCONTROL_NONE 0x0000 -#define POSIX_SPAWN_PCONTROL_THROTTLE 0x0001 -#define POSIX_SPAWN_PCONTROL_SUSPEND 0x0002 -#define POSIX_SPAWN_PCONTROL_KILL 0x0003 - -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ - -#endif /* _SYS_SPAWN_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/stat.h b/lib/libc/include/x86_64-macos-gnu/sys/stat.h deleted file mode 100644 index 7f2a490ee1..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/stat.h +++ /dev/null @@ -1,430 +0,0 @@ -/* - * Copyright (c) 2000-2014 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */ -/*- - * Copyright (c) 1982, 1986, 1989, 1993 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)stat.h 8.9 (Berkeley) 8/17/94 - */ - - -#ifndef _SYS_STAT_H_ -#define _SYS_STAT_H_ - -#include -#include -#include - -/* [XSI] The timespec structure may be defined as described in */ -#include - -/* - * [XSI] The blkcnt_t, blksize_t, dev_t, ino_t, mode_t, nlink_t, uid_t, - * gid_t, off_t, and time_t types shall be defined as described in - * . - */ -#include -#include -#include /* device number */ -#include - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#include -#endif /* !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) */ - -#include -#include -#include -#include -#include -#include - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -/* - * XXX So deprecated, it would make your head spin - * - * The old stat structure. In fact, this is not used by the kernel at all, - * and should not be used by user space, and should be removed from this - * header file entirely (along with the unused cvtstat() prototype in - * vnode_internal.h). - */ -struct ostat { - __uint16_t st_dev; /* inode's device */ - ino_t st_ino; /* inode's number */ - mode_t st_mode; /* inode protection mode */ - nlink_t st_nlink; /* number of hard links */ - __uint16_t st_uid; /* user ID of the file's owner */ - __uint16_t st_gid; /* group ID of the file's group */ - __uint16_t st_rdev; /* device type */ - __int32_t st_size; /* file size, in bytes */ - struct timespec st_atimespec; /* time of last access */ - struct timespec st_mtimespec; /* time of last data modification */ - struct timespec st_ctimespec; /* time of last file status change */ - __int32_t st_blksize; /* optimal blocksize for I/O */ - __int32_t st_blocks; /* blocks allocated for file */ - __uint32_t st_flags; /* user defined flags for file */ - __uint32_t st_gen; /* file generation number */ -}; - -#define __DARWIN_STRUCT_STAT64_TIMES \ - struct timespec st_atimespec; /* time of last access */ \ - struct timespec st_mtimespec; /* time of last data modification */ \ - struct timespec st_ctimespec; /* time of last status change */ \ - struct timespec st_birthtimespec; /* time of file creation(birth) */ - -#else /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ - -#define __DARWIN_STRUCT_STAT64_TIMES \ - time_t st_atime; /* [XSI] Time of last access */ \ - long st_atimensec; /* nsec of last access */ \ - time_t st_mtime; /* [XSI] Last data modification time */ \ - long st_mtimensec; /* last data modification nsec */ \ - time_t st_ctime; /* [XSI] Time of last status change */ \ - long st_ctimensec; /* nsec of last status change */ \ - time_t st_birthtime; /* File creation time(birth) */ \ - long st_birthtimensec; /* nsec of File creation time */ - -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ - -/* - * This structure is used as the second parameter to the fstat64(), - * lstat64(), and stat64() functions, and for struct stat when - * __DARWIN_64_BIT_INO_T is set. __DARWIN_STRUCT_STAT64 is defined - * above, depending on whether we use struct timespec or the direct - * components. - * - * This is simillar to stat except for 64bit inode number - * number instead of 32bit ino_t and the addition of create(birth) time. - */ -#define __DARWIN_STRUCT_STAT64 { \ - dev_t st_dev; /* [XSI] ID of device containing file */ \ - mode_t st_mode; /* [XSI] Mode of file (see below) */ \ - nlink_t st_nlink; /* [XSI] Number of hard links */ \ - __darwin_ino64_t st_ino; /* [XSI] File serial number */ \ - uid_t st_uid; /* [XSI] User ID of the file */ \ - gid_t st_gid; /* [XSI] Group ID of the file */ \ - dev_t st_rdev; /* [XSI] Device ID */ \ - __DARWIN_STRUCT_STAT64_TIMES \ - off_t st_size; /* [XSI] file size, in bytes */ \ - blkcnt_t st_blocks; /* [XSI] blocks allocated for file */ \ - blksize_t st_blksize; /* [XSI] optimal blocksize for I/O */ \ - __uint32_t st_flags; /* user defined flags for file */ \ - __uint32_t st_gen; /* file generation number */ \ - __int32_t st_lspare; /* RESERVED: DO NOT USE! */ \ - __int64_t st_qspare[2]; /* RESERVED: DO NOT USE! */ \ -} - -/* - * [XSI] This structure is used as the second parameter to the fstat(), - * lstat(), and stat() functions. - */ -#if __DARWIN_64_BIT_INO_T - -struct stat __DARWIN_STRUCT_STAT64; - -#else /* !__DARWIN_64_BIT_INO_T */ - -struct stat { - dev_t st_dev; /* [XSI] ID of device containing file */ - ino_t st_ino; /* [XSI] File serial number */ - mode_t st_mode; /* [XSI] Mode of file (see below) */ - nlink_t st_nlink; /* [XSI] Number of hard links */ - uid_t st_uid; /* [XSI] User ID of the file */ - gid_t st_gid; /* [XSI] Group ID of the file */ - dev_t st_rdev; /* [XSI] Device ID */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) - struct timespec st_atimespec; /* time of last access */ - struct timespec st_mtimespec; /* time of last data modification */ - struct timespec st_ctimespec; /* time of last status change */ -#else - time_t st_atime; /* [XSI] Time of last access */ - long st_atimensec; /* nsec of last access */ - time_t st_mtime; /* [XSI] Last data modification time */ - long st_mtimensec; /* last data modification nsec */ - time_t st_ctime; /* [XSI] Time of last status change */ - long st_ctimensec; /* nsec of last status change */ -#endif - off_t st_size; /* [XSI] file size, in bytes */ - blkcnt_t st_blocks; /* [XSI] blocks allocated for file */ - blksize_t st_blksize; /* [XSI] optimal blocksize for I/O */ - __uint32_t st_flags; /* user defined flags for file */ - __uint32_t st_gen; /* file generation number */ - __int32_t st_lspare; /* RESERVED: DO NOT USE! */ - __int64_t st_qspare[2]; /* RESERVED: DO NOT USE! */ -}; - -#endif /* __DARWIN_64_BIT_INO_T */ - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) - -#if !__DARWIN_ONLY_64_BIT_INO_T - -struct stat64 __DARWIN_STRUCT_STAT64; - -#endif /* !__DARWIN_ONLY_64_BIT_INO_T */ - -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ - - - - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define st_atime st_atimespec.tv_sec -#define st_mtime st_mtimespec.tv_sec -#define st_ctime st_ctimespec.tv_sec -#define st_birthtime st_birthtimespec.tv_sec -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ - -/* - * [XSI] The following are symbolic names for the values of type mode_t. They - * are bitmap values. - */ -#include - -/* - * [XSI] The following macros shall be provided to test whether a file is - * of the specified type. The value m supplied to the macros is the value - * of st_mode from a stat structure. The macro shall evaluate to a non-zero - * value if the test is true; 0 if the test is false. - */ -#define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) /* block special */ -#define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) /* char special */ -#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) /* directory */ -#define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) /* fifo or socket */ -#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) /* regular file */ -#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) /* symbolic link */ -#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) /* socket */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define S_ISWHT(m) (((m) & S_IFMT) == S_IFWHT) /* OBSOLETE: whiteout */ -#endif - -/* - * [XSI] The implementation may implement message queues, semaphores, or - * shared memory objects as distinct file types. The following macros - * shall be provided to test whether a file is of the specified type. - * The value of the buf argument supplied to the macros is a pointer to - * a stat structure. The macro shall evaluate to a non-zero value if - * the specified object is implemented as a distinct file type and the - * specified file type is contained in the stat structure referenced by - * buf. Otherwise, the macro shall evaluate to zero. - * - * NOTE: The current implementation does not do this, although - * this may change in future revisions, and co currently only - * provides these macros to ensure source compatability with - * implementations which do. - */ -#define S_TYPEISMQ(buf) (0) /* Test for a message queue */ -#define S_TYPEISSEM(buf) (0) /* Test for a semaphore */ -#define S_TYPEISSHM(buf) (0) /* Test for a shared memory object */ - -/* - * [TYM] The implementation may implement typed memory objects as distinct - * file types, and the following macro shall test whether a file is of the - * specified type. The value of the buf argument supplied to the macros is - * a pointer to a stat structure. The macro shall evaluate to a non-zero - * value if the specified object is implemented as a distinct file type and - * the specified file type is contained in the stat structure referenced by - * buf. Otherwise, the macro shall evaluate to zero. - * - * NOTE: The current implementation does not do this, although - * this may change in future revisions, and co currently only - * provides this macro to ensure source compatability with - * implementations which do. - */ -#define S_TYPEISTMO(buf) (0) /* Test for a typed memory object */ - - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define ACCESSPERMS (S_IRWXU|S_IRWXG|S_IRWXO) /* 0777 */ - /* 7777 */ -#define ALLPERMS (S_ISUID|S_ISGID|S_ISTXT|S_IRWXU|S_IRWXG|S_IRWXO) -/* 0666 */ -#define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) - -#define S_BLKSIZE 512 /* block size used in the stat struct */ - -/* - * Definitions of flags stored in file flags word. - * - * Super-user and owner changeable flags. - */ -#define UF_SETTABLE 0x0000ffff /* mask of owner changeable flags */ -#define UF_NODUMP 0x00000001 /* do not dump file */ -#define UF_IMMUTABLE 0x00000002 /* file may not be changed */ -#define UF_APPEND 0x00000004 /* writes to file may only append */ -#define UF_OPAQUE 0x00000008 /* directory is opaque wrt. union */ -/* - * The following bit is reserved for FreeBSD. It is not implemented - * in Mac OS X. - */ -/* #define UF_NOUNLINK 0x00000010 */ /* file may not be removed or renamed */ -#define UF_COMPRESSED 0x00000020 /* file is compressed (some file-systems) */ - -/* UF_TRACKED is used for dealing with document IDs. We no longer issue - * notifications for deletes or renames for files which have UF_TRACKED set. */ -#define UF_TRACKED 0x00000040 - -#define UF_DATAVAULT 0x00000080 /* entitlement required for reading */ - /* and writing */ - -/* Bits 0x0100 through 0x4000 are currently undefined. */ -#define UF_HIDDEN 0x00008000 /* hint that this item should not be */ - /* displayed in a GUI */ -/* - * Super-user changeable flags. - */ -#define SF_SUPPORTED 0x009f0000 /* mask of superuser supported flags */ -#define SF_SETTABLE 0x3fff0000 /* mask of superuser changeable flags */ -#define SF_SYNTHETIC 0xc0000000 /* mask of system read-only synthetic flags */ -#define SF_ARCHIVED 0x00010000 /* file is archived */ -#define SF_IMMUTABLE 0x00020000 /* file may not be changed */ -#define SF_APPEND 0x00040000 /* writes to file may only append */ -#define SF_RESTRICTED 0x00080000 /* entitlement required for writing */ -#define SF_NOUNLINK 0x00100000 /* Item may not be removed, renamed or mounted on */ - -/* - * The following two bits are reserved for FreeBSD. They are not - * implemented in Mac OS X. - */ -/* #define SF_SNAPSHOT 0x00200000 */ /* snapshot inode */ -/* NOTE: There is no SF_HIDDEN bit. */ - -#define SF_FIRMLINK 0x00800000 /* file is a firmlink */ - -/* - * Synthetic flags. - * - * These are read-only. We keep them out of SF_SUPPORTED so that - * attempts to set them will fail. - */ -#define SF_DATALESS 0x40000000 /* file is dataless object */ - - -#endif - -/* - * Extended flags ("EF") returned by ATTR_CMNEXT_EXT_FLAGS from getattrlist/getattrlistbulk - */ -#define EF_MAY_SHARE_BLOCKS 0x00000001 /* file may share blocks with another file */ -#define EF_NO_XATTRS 0x00000002 /* file has no xattrs at all */ -#define EF_IS_SYNC_ROOT 0x00000004 /* file is a sync root for iCloud */ -#define EF_IS_PURGEABLE 0x00000008 /* file is purgeable */ -#define EF_IS_SPARSE 0x00000010 /* file has at least one sparse region */ - - - - -__BEGIN_DECLS -/* [XSI] */ -int chmod(const char *, mode_t) __DARWIN_ALIAS(chmod); -int fchmod(int, mode_t) __DARWIN_ALIAS(fchmod); -int fstat(int, struct stat *) __DARWIN_INODE64(fstat); -int lstat(const char *, struct stat *) __DARWIN_INODE64(lstat); -int mkdir(const char *, mode_t); -int mkfifo(const char *, mode_t); -int stat(const char *, struct stat *) __DARWIN_INODE64(stat); -int mknod(const char *, mode_t, dev_t); -mode_t umask(mode_t); - -#if __DARWIN_C_LEVEL >= 200809L -int fchmodat(int, const char *, mode_t, int) __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0); -int fstatat(int, const char *, struct stat *, int) __DARWIN_INODE64(fstatat) __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0); -int mkdirat(int, const char *, mode_t) __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0); - -#define UTIME_NOW -1 -#define UTIME_OMIT -2 - -int futimens(int __fd, const struct timespec __times[2]) __API_AVAILABLE(macosx(10.13), ios(11.0), tvos(11.0), watchos(4.0)); -int utimensat(int __fd, const char *__path, const struct timespec __times[2], - int __flag) __API_AVAILABLE(macosx(10.13), ios(11.0), tvos(11.0), watchos(4.0)); -#endif - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) - -#include - -int chflags(const char *, __uint32_t); -int chmodx_np(const char *, filesec_t); -int fchflags(int, __uint32_t); -int fchmodx_np(int, filesec_t); -int fstatx_np(int, struct stat *, filesec_t) __DARWIN_INODE64(fstatx_np); -int lchflags(const char *, __uint32_t) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); -int lchmod(const char *, mode_t) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); -int lstatx_np(const char *, struct stat *, filesec_t) __DARWIN_INODE64(lstatx_np); -int mkdirx_np(const char *, filesec_t); -int mkfifox_np(const char *, filesec_t); -int statx_np(const char *, struct stat *, filesec_t) __DARWIN_INODE64(statx_np); -int umaskx_np(filesec_t) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_4, __MAC_10_6, __IPHONE_NA, __IPHONE_NA); - -#if !__DARWIN_ONLY_64_BIT_INO_T -/* The following deprecated routines are simillar to stat and friends except provide struct stat64 instead of struct stat */ -int fstatx64_np(int, struct stat64 *, filesec_t) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5, __MAC_10_6, __IPHONE_NA, __IPHONE_NA); -int lstatx64_np(const char *, struct stat64 *, filesec_t) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5, __MAC_10_6, __IPHONE_NA, __IPHONE_NA); -int statx64_np(const char *, struct stat64 *, filesec_t) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5, __MAC_10_6, __IPHONE_NA, __IPHONE_NA); -int fstat64(int, struct stat64 *) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5, __MAC_10_6, __IPHONE_NA, __IPHONE_NA); -int lstat64(const char *, struct stat64 *) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5, __MAC_10_6, __IPHONE_NA, __IPHONE_NA); -int stat64(const char *, struct stat64 *) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5, __MAC_10_6, __IPHONE_NA, __IPHONE_NA); -#endif /* !__DARWIN_ONLY_64_BIT_INO_T */ -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ - -__END_DECLS -#endif /* !_SYS_STAT_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/sysctl.h b/lib/libc/include/x86_64-macos-gnu/sys/sysctl.h deleted file mode 100644 index 9e3d84e04c..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/sysctl.h +++ /dev/null @@ -1,775 +0,0 @@ -/* - * Copyright (c) 2000-2019 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */ -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Mike Karels at Berkeley Software Design, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)sysctl.h 8.1 (Berkeley) 6/2/93 - */ -/* - * NOTICE: This file was modified by SPARTA, Inc. in 2005 to introduce - * support for mandatory and extensible security protections. This notice - * is included in support of clause 2.2 (b) of the Apple Public License, - * Version 2.0. - */ - -#ifndef _SYS_SYSCTL_H_ -#define _SYS_SYSCTL_H_ - -/* - * These are for the eproc structure defined below. - */ -#include - -#include -#include -#include -#include -#include - - -/* - * Definitions for sysctl call. The sysctl call uses a hierarchical name - * for objects that can be examined or modified. The name is expressed as - * a sequence of integers. Like a file path name, the meaning of each - * component depends on its place in the hierarchy. The top-level and kern - * identifiers are defined here, and other identifiers are defined in the - * respective subsystem header files. - */ - -#define CTL_MAXNAME 12 /* largest number of components supported */ - -/* - * Each subsystem defined by sysctl defines a list of variables - * for that subsystem. Each name is either a node with further - * levels defined below it, or it is a leaf of some particular - * type given below. Each sysctl level defines a set of name/type - * pairs to be used by sysctl(1) in manipulating the subsystem. - * - * When declaring new sysctl names, use the CTLFLAG_LOCKED flag in the - * type to indicate that all necessary locking will be handled - * within the sysctl. - * - * Any sysctl defined without CTLFLAG_LOCKED is considered legacy - * and will be protected by a global mutex. - * - * Note: This is not optimal, so it is best to handle locking - * yourself, if you are able to do so. A simple design - * pattern for use to avoid in a single function known - * to potentially be in the paging path ot doing a DMA - * to physical memory in a user space process is: - * - * lock - * perform operation vs. local buffer - * unlock - * SYSCTL_OUT(rey, local buffer, length) - * - * ...this assumes you are not using a deep call graph - * or are unable to pass a local buffer address as a - * parameter into your deep call graph. - * - * Note that very large user buffers can fail the wire - * if to do so would require more physical pages than - * are available (the caller will get an ENOMEM error, - * see sysctl_mem_hold() for details). - */ -struct ctlname { - char *ctl_name; /* subsystem name */ - int ctl_type; /* type of name */ -}; - -#define CTLTYPE 0xf /* Mask for the type */ -#define CTLTYPE_NODE 1 /* name is a node */ -#define CTLTYPE_INT 2 /* name describes an integer */ -#define CTLTYPE_STRING 3 /* name describes a string */ -#define CTLTYPE_QUAD 4 /* name describes a 64-bit number */ -#define CTLTYPE_OPAQUE 5 /* name describes a structure */ -#define CTLTYPE_STRUCT CTLTYPE_OPAQUE /* name describes a structure */ - -#define CTLFLAG_RD 0x80000000 /* Allow reads of variable */ -#define CTLFLAG_WR 0x40000000 /* Allow writes to the variable */ -#define CTLFLAG_RW (CTLFLAG_RD|CTLFLAG_WR) -#define CTLFLAG_NOLOCK 0x20000000 /* XXX Don't Lock */ -#define CTLFLAG_ANYBODY 0x10000000 /* All users can set this var */ -#define CTLFLAG_SECURE 0x08000000 /* Permit set only if securelevel<=0 */ -#define CTLFLAG_MASKED 0x04000000 /* deprecated variable, do not display */ -#define CTLFLAG_NOAUTO 0x02000000 /* do not auto-register */ -#define CTLFLAG_KERN 0x01000000 /* valid inside the kernel */ -#define CTLFLAG_LOCKED 0x00800000 /* node will handle locking itself */ -#define CTLFLAG_OID2 0x00400000 /* struct sysctl_oid has version info */ - -/* - * USE THIS instead of a hardwired number from the categories below - * to get dynamically assigned sysctl entries using the linker-set - * technology. This is the way nearly all new sysctl variables should - * be implemented. - * - * e.g. SYSCTL_INT(_parent, OID_AUTO, name, CTLFLAG_RW, &variable, 0, ""); - * - * Note that linker set technology will automatically register all nodes - * declared like this on kernel initialization, UNLESS they are defined - * in I/O-Kit. In this case, you have to call sysctl_register_oid() - * manually - just like in a KEXT. - */ -#define OID_AUTO (-1) -#define OID_AUTO_START 100 /* conventional */ - - -#define SYSCTL_DEF_ENABLED - -#ifdef SYSCTL_DEF_ENABLED -/* - * Top-level identifiers - */ -#define CTL_UNSPEC 0 /* unused */ -#define CTL_KERN 1 /* "high kernel": proc, limits */ -#define CTL_VM 2 /* virtual memory */ -#define CTL_VFS 3 /* file system, mount type is next */ -#define CTL_NET 4 /* network, see socket.h */ -#define CTL_DEBUG 5 /* debugging parameters */ -#define CTL_HW 6 /* generic cpu/io */ -#define CTL_MACHDEP 7 /* machine dependent */ -#define CTL_USER 8 /* user-level */ -#define CTL_MAXID 9 /* number of valid top-level ids */ - -#define CTL_NAMES { \ - { 0, 0 }, \ - { "kern", CTLTYPE_NODE }, \ - { "vm", CTLTYPE_NODE }, \ - { "vfs", CTLTYPE_NODE }, \ - { "net", CTLTYPE_NODE }, \ - { "debug", CTLTYPE_NODE }, \ - { "hw", CTLTYPE_NODE }, \ - { "machdep", CTLTYPE_NODE }, \ - { "user", CTLTYPE_NODE }, \ -} - -/* - * CTL_KERN identifiers - */ -#define KERN_OSTYPE 1 /* string: system version */ -#define KERN_OSRELEASE 2 /* string: system release */ -#define KERN_OSREV 3 /* int: system revision */ -#define KERN_VERSION 4 /* string: compile time info */ -#define KERN_MAXVNODES 5 /* int: max vnodes */ -#define KERN_MAXPROC 6 /* int: max processes */ -#define KERN_MAXFILES 7 /* int: max open files */ -#define KERN_ARGMAX 8 /* int: max arguments to exec */ -#define KERN_SECURELVL 9 /* int: system security level */ -#define KERN_HOSTNAME 10 /* string: hostname */ -#define KERN_HOSTID 11 /* int: host identifier */ -#define KERN_CLOCKRATE 12 /* struct: struct clockrate */ -#define KERN_VNODE 13 /* struct: vnode structures */ -#define KERN_PROC 14 /* struct: process entries */ -#define KERN_FILE 15 /* struct: file entries */ -#define KERN_PROF 16 /* node: kernel profiling info */ -#define KERN_POSIX1 17 /* int: POSIX.1 version */ -#define KERN_NGROUPS 18 /* int: # of supplemental group ids */ -#define KERN_JOB_CONTROL 19 /* int: is job control available */ -#define KERN_SAVED_IDS 20 /* int: saved set-user/group-ID */ -#define KERN_BOOTTIME 21 /* struct: time kernel was booted */ -#define KERN_NISDOMAINNAME 22 /* string: YP domain name */ -#define KERN_DOMAINNAME KERN_NISDOMAINNAME -#define KERN_MAXPARTITIONS 23 /* int: number of partitions/disk */ -#define KERN_KDEBUG 24 /* int: kernel trace points */ -#define KERN_UPDATEINTERVAL 25 /* int: update process sleep time */ -#define KERN_OSRELDATE 26 /* int: OS release date */ -#define KERN_NTP_PLL 27 /* node: NTP PLL control */ -#define KERN_BOOTFILE 28 /* string: name of booted kernel */ -#define KERN_MAXFILESPERPROC 29 /* int: max open files per proc */ -#define KERN_MAXPROCPERUID 30 /* int: max processes per uid */ -#define KERN_DUMPDEV 31 /* dev_t: device to dump on */ -#define KERN_IPC 32 /* node: anything related to IPC */ -#define KERN_DUMMY 33 /* unused */ -#define KERN_PS_STRINGS 34 /* int: address of PS_STRINGS */ -#define KERN_USRSTACK32 35 /* int: address of USRSTACK */ -#define KERN_LOGSIGEXIT 36 /* int: do we log sigexit procs? */ -#define KERN_SYMFILE 37 /* string: kernel symbol filename */ -#define KERN_PROCARGS 38 -/* 39 was KERN_PCSAMPLES... now obsolete */ -#define KERN_NETBOOT 40 /* int: are we netbooted? 1=yes,0=no */ -/* 41 was KERN_PANICINFO : panic UI information (deprecated) */ -#define KERN_SYSV 42 /* node: System V IPC information */ -#define KERN_AFFINITY 43 /* xxx */ -#define KERN_TRANSLATE 44 /* xxx */ -#define KERN_CLASSIC KERN_TRANSLATE /* XXX backwards compat */ -#define KERN_EXEC 45 /* xxx */ -#define KERN_CLASSICHANDLER KERN_EXEC /* XXX backwards compatibility */ -#define KERN_AIOMAX 46 /* int: max aio requests */ -#define KERN_AIOPROCMAX 47 /* int: max aio requests per process */ -#define KERN_AIOTHREADS 48 /* int: max aio worker threads */ -#ifdef __APPLE_API_UNSTABLE -#define KERN_PROCARGS2 49 -#endif /* __APPLE_API_UNSTABLE */ -#define KERN_COREFILE 50 /* string: corefile format string */ -#define KERN_COREDUMP 51 /* int: whether to coredump at all */ -#define KERN_SUGID_COREDUMP 52 /* int: whether to dump SUGID cores */ -#define KERN_PROCDELAYTERM 53 /* int: set/reset current proc for delayed termination during shutdown */ -#define KERN_SHREG_PRIVATIZABLE 54 /* int: can shared regions be privatized ? */ -/* 55 was KERN_PROC_LOW_PRI_IO... now deprecated */ -#define KERN_LOW_PRI_WINDOW 56 /* int: set/reset throttle window - milliseconds */ -#define KERN_LOW_PRI_DELAY 57 /* int: set/reset throttle delay - milliseconds */ -#define KERN_POSIX 58 /* node: posix tunables */ -#define KERN_USRSTACK64 59 /* LP64 user stack query */ -#define KERN_NX_PROTECTION 60 /* int: whether no-execute protection is enabled */ -#define KERN_TFP 61 /* Task for pid settings */ -#define KERN_PROCNAME 62 /* setup process program name(2*MAXCOMLEN) */ -#define KERN_THALTSTACK 63 /* for compat with older x86 and does nothing */ -#define KERN_SPECULATIVE_READS 64 /* int: whether speculative reads are disabled */ -#define KERN_OSVERSION 65 /* for build number i.e. 9A127 */ -#define KERN_SAFEBOOT 66 /* are we booted safe? */ -/* 67 was KERN_LCTX (login context) */ -#define KERN_RAGEVNODE 68 -#define KERN_TTY 69 /* node: tty settings */ -#define KERN_CHECKOPENEVT 70 /* spi: check the VOPENEVT flag on vnodes at open time */ -#define KERN_THREADNAME 71 /* set/get thread name */ -#define KERN_MAXID 72 /* number of valid kern ids */ -/* - * Don't add any more sysctls like this. Instead, use the SYSCTL_*() macros - * and OID_AUTO. This will have the added benefit of not having to recompile - * sysctl(8) to pick up your changes. - */ - - -#if defined(__LP64__) -#define KERN_USRSTACK KERN_USRSTACK64 -#else -#define KERN_USRSTACK KERN_USRSTACK32 -#endif - - -/* KERN_RAGEVNODE types */ -#define KERN_RAGE_PROC 1 -#define KERN_RAGE_THREAD 2 -#define KERN_UNRAGE_PROC 3 -#define KERN_UNRAGE_THREAD 4 - -/* KERN_OPENEVT types */ -#define KERN_OPENEVT_PROC 1 -#define KERN_UNOPENEVT_PROC 2 - -/* KERN_TFP types */ -#define KERN_TFP_POLICY 1 - -/* KERN_TFP_POLICY values . All policies allow task port for self */ -#define KERN_TFP_POLICY_DENY 0 /* Deny Mode: None allowed except privileged */ -#define KERN_TFP_POLICY_DEFAULT 2 /* Default Mode: related ones allowed and upcall authentication */ - -/* KERN_KDEBUG types */ -#define KERN_KDEFLAGS 1 -#define KERN_KDDFLAGS 2 -#define KERN_KDENABLE 3 -#define KERN_KDSETBUF 4 -#define KERN_KDGETBUF 5 -#define KERN_KDSETUP 6 -#define KERN_KDREMOVE 7 -#define KERN_KDSETREG 8 -#define KERN_KDGETREG 9 -#define KERN_KDREADTR 10 -#define KERN_KDPIDTR 11 -#define KERN_KDTHRMAP 12 -/* Don't use 13 as it is overloaded with KERN_VNODE */ -#define KERN_KDPIDEX 14 -#define KERN_KDSETRTCDEC 15 /* obsolete */ -#define KERN_KDGETENTROPY 16 /* obsolete */ -#define KERN_KDWRITETR 17 -#define KERN_KDWRITEMAP 18 -#define KERN_KDTEST 19 -/* 20 unused */ -#define KERN_KDREADCURTHRMAP 21 -#define KERN_KDSET_TYPEFILTER 22 -#define KERN_KDBUFWAIT 23 -#define KERN_KDCPUMAP 24 -/* 25 - 26 unused */ -#define KERN_KDWRITEMAP_V3 27 -#define KERN_KDWRITETR_V3 28 - -#define CTL_KERN_NAMES { \ - { 0, 0 }, \ - { "ostype", CTLTYPE_STRING }, \ - { "osrelease", CTLTYPE_STRING }, \ - { "osrevision", CTLTYPE_INT }, \ - { "version", CTLTYPE_STRING }, \ - { "maxvnodes", CTLTYPE_INT }, \ - { "maxproc", CTLTYPE_INT }, \ - { "maxfiles", CTLTYPE_INT }, \ - { "argmax", CTLTYPE_INT }, \ - { "securelevel", CTLTYPE_INT }, \ - { "hostname", CTLTYPE_STRING }, \ - { "hostid", CTLTYPE_INT }, \ - { "clockrate", CTLTYPE_STRUCT }, \ - { "vnode", CTLTYPE_STRUCT }, \ - { "proc", CTLTYPE_STRUCT }, \ - { "file", CTLTYPE_STRUCT }, \ - { "profiling", CTLTYPE_NODE }, \ - { "posix1version", CTLTYPE_INT }, \ - { "ngroups", CTLTYPE_INT }, \ - { "job_control", CTLTYPE_INT }, \ - { "saved_ids", CTLTYPE_INT }, \ - { "boottime", CTLTYPE_STRUCT }, \ - { "nisdomainname", CTLTYPE_STRING }, \ - { "maxpartitions", CTLTYPE_INT }, \ - { "kdebug", CTLTYPE_INT }, \ - { "update", CTLTYPE_INT }, \ - { "osreldate", CTLTYPE_INT }, \ - { "ntp_pll", CTLTYPE_NODE }, \ - { "bootfile", CTLTYPE_STRING }, \ - { "maxfilesperproc", CTLTYPE_INT }, \ - { "maxprocperuid", CTLTYPE_INT }, \ - { "dumpdev", CTLTYPE_STRUCT }, /* we lie; don't print as int */ \ - { "ipc", CTLTYPE_NODE }, \ - { "dummy", CTLTYPE_INT }, \ - { "dummy", CTLTYPE_INT }, \ - { "usrstack", CTLTYPE_INT }, \ - { "logsigexit", CTLTYPE_INT }, \ - { "symfile",CTLTYPE_STRING },\ - { "procargs",CTLTYPE_STRUCT },\ - { "dummy", CTLTYPE_INT }, /* deprecated pcsamples */ \ - { "netboot", CTLTYPE_INT }, \ - { "dummy", CTLTYPE_INT }, /* deprecated: panicinfo */ \ - { "sysv", CTLTYPE_NODE }, \ - { "dummy", CTLTYPE_INT }, \ - { "dummy", CTLTYPE_INT }, \ - { "exec", CTLTYPE_NODE }, \ - { "aiomax", CTLTYPE_INT }, \ - { "aioprocmax", CTLTYPE_INT }, \ - { "aiothreads", CTLTYPE_INT }, \ - { "procargs2",CTLTYPE_STRUCT }, \ - { "corefile",CTLTYPE_STRING }, \ - { "coredump", CTLTYPE_INT }, \ - { "sugid_coredump", CTLTYPE_INT }, \ - { "delayterm", CTLTYPE_INT }, \ - { "shreg_private", CTLTYPE_INT }, \ - { "proc_low_pri_io", CTLTYPE_INT }, \ - { "low_pri_window", CTLTYPE_INT }, \ - { "low_pri_delay", CTLTYPE_INT }, \ - { "posix", CTLTYPE_NODE }, \ - { "usrstack64", CTLTYPE_QUAD }, \ - { "nx", CTLTYPE_INT }, \ - { "tfp", CTLTYPE_NODE }, \ - { "procname", CTLTYPE_STRING }, \ - { "threadsigaltstack", CTLTYPE_INT }, \ - { "speculative_reads_disabled", CTLTYPE_INT }, \ - { "osversion", CTLTYPE_STRING }, \ - { "safeboot", CTLTYPE_INT }, \ - { "dummy", CTLTYPE_INT }, /* deprecated: lctx */ \ - { "rage_vnode", CTLTYPE_INT }, \ - { "tty", CTLTYPE_NODE }, \ - { "check_openevt", CTLTYPE_INT }, \ - { "thread_name", CTLTYPE_STRING } \ -} - -/* - * CTL_VFS identifiers - */ -#define CTL_VFS_NAMES { \ - { "vfsconf", CTLTYPE_STRUCT } \ -} - -/* - * KERN_PROC subtypes - */ -#define KERN_PROC_ALL 0 /* everything */ -#define KERN_PROC_PID 1 /* by process id */ -#define KERN_PROC_PGRP 2 /* by process group id */ -#define KERN_PROC_SESSION 3 /* by session of pid */ -#define KERN_PROC_TTY 4 /* by controlling tty */ -#define KERN_PROC_UID 5 /* by effective uid */ -#define KERN_PROC_RUID 6 /* by real uid */ -#define KERN_PROC_LCID 7 /* by login context id */ - -/* - * KERN_VFSNSPACE subtypes - */ -#define KERN_VFSNSPACE_HANDLE_PROC 1 -#define KERN_VFSNSPACE_UNHANDLE_PROC 2 - -/* - * KERN_PROC subtype ops return arrays of augmented proc structures: - */ - -struct _pcred { - char pc_lock[72]; /* opaque content */ - struct ucred *pc_ucred; /* Current credentials. */ - uid_t p_ruid; /* Real user id. */ - uid_t p_svuid; /* Saved effective user id. */ - gid_t p_rgid; /* Real group id. */ - gid_t p_svgid; /* Saved effective group id. */ - int p_refcnt; /* Number of references. */ -}; - -struct _ucred { - int32_t cr_ref; /* reference count */ - uid_t cr_uid; /* effective user id */ - short cr_ngroups; /* number of groups */ - gid_t cr_groups[NGROUPS]; /* groups */ -}; - -struct kinfo_proc { - struct extern_proc kp_proc; /* proc structure */ - struct eproc { - struct proc *e_paddr; /* address of proc */ - struct session *e_sess; /* session pointer */ - struct _pcred e_pcred; /* process credentials */ - struct _ucred e_ucred; /* current credentials */ - struct vmspace e_vm; /* address space */ - pid_t e_ppid; /* parent process id */ - pid_t e_pgid; /* process group id */ - short e_jobc; /* job control counter */ - dev_t e_tdev; /* controlling tty dev */ - pid_t e_tpgid; /* tty process group id */ - struct session *e_tsess; /* tty session pointer */ -#define WMESGLEN 7 - char e_wmesg[WMESGLEN + 1]; /* wchan message */ - segsz_t e_xsize; /* text size */ - short e_xrssize; /* text rss */ - short e_xccount; /* text references */ - short e_xswrss; - int32_t e_flag; -#define EPROC_CTTY 0x01 /* controlling tty vnode active */ -#define EPROC_SLEADER 0x02 /* session leader */ -#define COMAPT_MAXLOGNAME 12 - char e_login[COMAPT_MAXLOGNAME]; /* short setlogin() name */ - int32_t e_spare[4]; - } kp_eproc; -}; - - - -/* - * KERN_IPC identifiers - */ -#define KIPC_MAXSOCKBUF 1 /* int: max size of a socket buffer */ -#define KIPC_SOCKBUF_WASTE 2 /* int: wastage factor in sockbuf */ -#define KIPC_SOMAXCONN 3 /* int: max length of connection q */ -#define KIPC_MAX_LINKHDR 4 /* int: max length of link header */ -#define KIPC_MAX_PROTOHDR 5 /* int: max length of network header */ -#define KIPC_MAX_HDR 6 /* int: max total length of headers */ -#define KIPC_MAX_DATALEN 7 /* int: max length of data? */ -#define KIPC_MBSTAT 8 /* struct: mbuf usage statistics */ -#define KIPC_NMBCLUSTERS 9 /* int: maximum mbuf clusters */ -#define KIPC_SOQLIMITCOMPAT 10 /* int: socket queue limit */ - -/* - * CTL_VM identifiers - */ -#define VM_METER 1 /* struct vmmeter */ -#define VM_LOADAVG 2 /* struct loadavg */ -/* - * Note: "3" was skipped sometime ago and should probably remain unused - * to avoid any new entry from being accepted by older kernels... - */ -#define VM_MACHFACTOR 4 /* struct loadavg with mach factor*/ -#define VM_SWAPUSAGE 5 /* total swap usage */ -#define VM_MAXID 6 /* number of valid vm ids */ - -#define CTL_VM_NAMES { \ - { 0, 0 }, \ - { "vmmeter", CTLTYPE_STRUCT }, \ - { "loadavg", CTLTYPE_STRUCT }, \ - { 0, 0 }, /* placeholder for "3" (see comment above) */ \ - { "dummy", CTLTYPE_INT }, \ - { "swapusage", CTLTYPE_STRUCT } \ -} - -struct xsw_usage { - u_int64_t xsu_total; - u_int64_t xsu_avail; - u_int64_t xsu_used; - u_int32_t xsu_pagesize; - boolean_t xsu_encrypted; -}; - -#ifdef __APPLE_API_PRIVATE -/* Load average structure. Use of fixpt_t assume in scope. */ -/* XXX perhaps we should protect fixpt_t, and define it here (or discard it) */ -struct loadavg { - fixpt_t ldavg[3]; - long fscale; -}; -extern struct loadavg averunnable; -#define LSCALE 1000 /* scaling for "fixed point" arithmetic */ - -#endif /* __APPLE_API_PRIVATE */ - - -/* - * CTL_HW identifiers - */ -#define HW_MACHINE 1 /* string: machine class */ -#define HW_MODEL 2 /* string: specific machine model */ -#define HW_NCPU 3 /* int: number of cpus */ -#define HW_BYTEORDER 4 /* int: machine byte order */ -#define HW_PHYSMEM 5 /* int: total memory */ -#define HW_USERMEM 6 /* int: non-kernel memory */ -#define HW_PAGESIZE 7 /* int: software page size */ -#define HW_DISKNAMES 8 /* strings: disk drive names */ -#define HW_DISKSTATS 9 /* struct: diskstats[] */ -#define HW_EPOCH 10 /* int: 0 for Legacy, else NewWorld */ -#define HW_FLOATINGPT 11 /* int: has HW floating point? */ -#define HW_MACHINE_ARCH 12 /* string: machine architecture */ -#define HW_VECTORUNIT 13 /* int: has HW vector unit? */ -#define HW_BUS_FREQ 14 /* int: Bus Frequency */ -#define HW_CPU_FREQ 15 /* int: CPU Frequency */ -#define HW_CACHELINE 16 /* int: Cache Line Size in Bytes */ -#define HW_L1ICACHESIZE 17 /* int: L1 I Cache Size in Bytes */ -#define HW_L1DCACHESIZE 18 /* int: L1 D Cache Size in Bytes */ -#define HW_L2SETTINGS 19 /* int: L2 Cache Settings */ -#define HW_L2CACHESIZE 20 /* int: L2 Cache Size in Bytes */ -#define HW_L3SETTINGS 21 /* int: L3 Cache Settings */ -#define HW_L3CACHESIZE 22 /* int: L3 Cache Size in Bytes */ -#define HW_TB_FREQ 23 /* int: Bus Frequency */ -#define HW_MEMSIZE 24 /* uint64_t: physical ram size */ -#define HW_AVAILCPU 25 /* int: number of available CPUs */ -#define HW_MAXID 26 /* number of valid hw ids */ - -#define CTL_HW_NAMES { \ - { 0, 0 }, \ - { "machine", CTLTYPE_STRING }, \ - { "model", CTLTYPE_STRING }, \ - { "ncpu", CTLTYPE_INT }, \ - { "byteorder", CTLTYPE_INT }, \ - { "physmem", CTLTYPE_INT }, \ - { "usermem", CTLTYPE_INT }, \ - { "pagesize", CTLTYPE_INT }, \ - { "disknames", CTLTYPE_STRUCT }, \ - { "diskstats", CTLTYPE_STRUCT }, \ - { "epoch", CTLTYPE_INT }, \ - { "floatingpoint", CTLTYPE_INT }, \ - { "machinearch", CTLTYPE_STRING }, \ - { "vectorunit", CTLTYPE_INT }, \ - { "busfrequency", CTLTYPE_INT }, \ - { "cpufrequency", CTLTYPE_INT }, \ - { "cachelinesize", CTLTYPE_INT }, \ - { "l1icachesize", CTLTYPE_INT }, \ - { "l1dcachesize", CTLTYPE_INT }, \ - { "l2settings", CTLTYPE_INT }, \ - { "l2cachesize", CTLTYPE_INT }, \ - { "l3settings", CTLTYPE_INT }, \ - { "l3cachesize", CTLTYPE_INT }, \ - { "tbfrequency", CTLTYPE_INT }, \ - { "memsize", CTLTYPE_QUAD }, \ - { "availcpu", CTLTYPE_INT } \ -} - -/* - * XXX This information should be moved to the man page. - * - * These are the support HW selectors for sysctlbyname. Parameters that are byte counts or frequencies are 64 bit numbers. - * All other parameters are 32 bit numbers. - * - * hw.memsize - The number of bytes of physical memory in the system. - * - * hw.ncpu - The maximum number of processors that could be available this boot. - * Use this value for sizing of static per processor arrays; i.e. processor load statistics. - * - * hw.activecpu - The number of processors currently available for executing threads. - * Use this number to determine the number threads to create in SMP aware applications. - * This number can change when power management modes are changed. - * - * hw.physicalcpu - The number of physical processors available in the current power management mode. - * hw.physicalcpu_max - The maximum number of physical processors that could be available this boot - * - * hw.logicalcpu - The number of logical processors available in the current power management mode. - * hw.logicalcpu_max - The maximum number of logical processors that could be available this boot - * - * hw.tbfrequency - This gives the time base frequency used by the OS and is the basis of all timing services. - * In general is is better to use mach's or higher level timing services, but this value - * is needed to convert the PPC Time Base registers to real time. - * - * hw.cpufrequency - These values provide the current, min and max cpu frequency. The min and max are for - * hw.cpufrequency_max - all power management modes. The current frequency is the max frequency in the current mode. - * hw.cpufrequency_min - All frequencies are in Hz. - * - * hw.busfrequency - These values provide the current, min and max bus frequency. The min and max are for - * hw.busfrequency_max - all power management modes. The current frequency is the max frequency in the current mode. - * hw.busfrequency_min - All frequencies are in Hz. - * - * hw.cputype - These values provide the mach-o cpu type and subtype. A complete list is in - * hw.cpusubtype - These values should be used to determine what processor family the running cpu is from so that - * the best binary can be chosen, or the best dynamic code generated. They should not be used - * to determine if a given processor feature is available. - * hw.cputhreadtype - This value will be present if the processor supports threads. Like hw.cpusubtype this selector - * should not be used to infer features, and only used to name the processors thread architecture. - * The values are defined in - * - * hw.byteorder - Gives the byte order of the processor. 4321 for big endian, 1234 for little. - * - * hw.pagesize - Gives the size in bytes of the pages used by the processor and VM system. - * - * hw.cachelinesize - Gives the size in bytes of the processor's cache lines. - * This value should be use to control the strides of loops that use cache control instructions - * like dcbz, dcbt or dcbst. - * - * hw.l1dcachesize - These values provide the size in bytes of the L1, L2 and L3 caches. If a cache is not present - * hw.l1icachesize - then the selector will return and error. - * hw.l2cachesize - - * hw.l3cachesize - - * - * hw.packages - Gives the number of processor packages. - * - * These are the selectors for optional processor features for specific processors. Selectors that return errors are not support - * on the system. Supported features will return 1 if they are recommended or 0 if they are supported but are not expected to help . - * performance. Future versions of these selectors may return larger values as necessary so it is best to test for non zero. - * - * For PowerPC: - * - * hw.optional.floatingpoint - Floating Point Instructions - * hw.optional.altivec - AltiVec Instructions - * hw.optional.graphicsops - Graphics Operations - * hw.optional.64bitops - 64-bit Instructions - * hw.optional.fsqrt - HW Floating Point Square Root Instruction - * hw.optional.stfiwx - Store Floating Point as Integer Word Indexed Instructions - * hw.optional.dcba - Data Cache Block Allocate Instruction - * hw.optional.datastreams - Data Streams Instructions - * hw.optional.dcbtstreams - Data Cache Block Touch Steams Instruction Form - * - * For x86 Architecture: - * - * hw.optional.floatingpoint - Floating Point Instructions - * hw.optional.mmx - Original MMX vector instructions - * hw.optional.sse - Streaming SIMD Extensions - * hw.optional.sse2 - Streaming SIMD Extensions 2 - * hw.optional.sse3 - Streaming SIMD Extensions 3 - * hw.optional.supplementalsse3 - Supplemental Streaming SIMD Extensions 3 - * hw.optional.x86_64 - 64-bit support - */ - - -/* - * CTL_USER definitions - */ -#define USER_CS_PATH 1 /* string: _CS_PATH */ -#define USER_BC_BASE_MAX 2 /* int: BC_BASE_MAX */ -#define USER_BC_DIM_MAX 3 /* int: BC_DIM_MAX */ -#define USER_BC_SCALE_MAX 4 /* int: BC_SCALE_MAX */ -#define USER_BC_STRING_MAX 5 /* int: BC_STRING_MAX */ -#define USER_COLL_WEIGHTS_MAX 6 /* int: COLL_WEIGHTS_MAX */ -#define USER_EXPR_NEST_MAX 7 /* int: EXPR_NEST_MAX */ -#define USER_LINE_MAX 8 /* int: LINE_MAX */ -#define USER_RE_DUP_MAX 9 /* int: RE_DUP_MAX */ -#define USER_POSIX2_VERSION 10 /* int: POSIX2_VERSION */ -#define USER_POSIX2_C_BIND 11 /* int: POSIX2_C_BIND */ -#define USER_POSIX2_C_DEV 12 /* int: POSIX2_C_DEV */ -#define USER_POSIX2_CHAR_TERM 13 /* int: POSIX2_CHAR_TERM */ -#define USER_POSIX2_FORT_DEV 14 /* int: POSIX2_FORT_DEV */ -#define USER_POSIX2_FORT_RUN 15 /* int: POSIX2_FORT_RUN */ -#define USER_POSIX2_LOCALEDEF 16 /* int: POSIX2_LOCALEDEF */ -#define USER_POSIX2_SW_DEV 17 /* int: POSIX2_SW_DEV */ -#define USER_POSIX2_UPE 18 /* int: POSIX2_UPE */ -#define USER_STREAM_MAX 19 /* int: POSIX2_STREAM_MAX */ -#define USER_TZNAME_MAX 20 /* int: POSIX2_TZNAME_MAX */ -#define USER_MAXID 21 /* number of valid user ids */ - -#define CTL_USER_NAMES { \ - { 0, 0 }, \ - { "cs_path", CTLTYPE_STRING }, \ - { "bc_base_max", CTLTYPE_INT }, \ - { "bc_dim_max", CTLTYPE_INT }, \ - { "bc_scale_max", CTLTYPE_INT }, \ - { "bc_string_max", CTLTYPE_INT }, \ - { "coll_weights_max", CTLTYPE_INT }, \ - { "expr_nest_max", CTLTYPE_INT }, \ - { "line_max", CTLTYPE_INT }, \ - { "re_dup_max", CTLTYPE_INT }, \ - { "posix2_version", CTLTYPE_INT }, \ - { "posix2_c_bind", CTLTYPE_INT }, \ - { "posix2_c_dev", CTLTYPE_INT }, \ - { "posix2_char_term", CTLTYPE_INT }, \ - { "posix2_fort_dev", CTLTYPE_INT }, \ - { "posix2_fort_run", CTLTYPE_INT }, \ - { "posix2_localedef", CTLTYPE_INT }, \ - { "posix2_sw_dev", CTLTYPE_INT }, \ - { "posix2_upe", CTLTYPE_INT }, \ - { "stream_max", CTLTYPE_INT }, \ - { "tzname_max", CTLTYPE_INT } \ -} - - - -/* - * CTL_DEBUG definitions - * - * Second level identifier specifies which debug variable. - * Third level identifier specifies which stucture component. - */ -#define CTL_DEBUG_NAME 0 /* string: variable name */ -#define CTL_DEBUG_VALUE 1 /* int: variable value */ -#define CTL_DEBUG_MAXID 20 - - -#if (CTL_MAXID != 9) || (KERN_MAXID != 72) || (VM_MAXID != 6) || (HW_MAXID != 26) || (USER_MAXID != 21) || (CTL_DEBUG_MAXID != 20) -#error Use the SYSCTL_*() macros and OID_AUTO instead! -#endif - - - -__BEGIN_DECLS -int sysctl(int *, u_int, void *, size_t *, void *, size_t); -int sysctlbyname(const char *, void *, size_t *, void *, size_t); -int sysctlnametomib(const char *, int *, size_t *); -__END_DECLS - - - -#endif /* SYSCTL_DEF_ENABLED */ - - -#endif /* !_SYS_SYSCTL_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/syslimits.h b/lib/libc/include/x86_64-macos-gnu/sys/syslimits.h deleted file mode 100644 index ff60b66ff5..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/syslimits.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* $NetBSD: syslimits.h,v 1.15 1997/06/25 00:48:09 lukem Exp $ */ - -/* - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)syslimits.h 8.1 (Berkeley) 6/2/93 - */ - -#ifndef _SYS_SYSLIMITS_H_ -#define _SYS_SYSLIMITS_H_ - -#include - -#if !defined(_ANSI_SOURCE) -/* - * Note: CHILD_MAX *must* be less than hard_maxproc, which is set at - * compile time; you *cannot* set it higher than the hard limit!! - */ -#define ARG_MAX (256 * 1024) /* max bytes for an exec function */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define CHILD_MAX 266 /* max simultaneous processes */ -#define GID_MAX 2147483647U /* max value for a gid_t (2^31-2) */ -#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ -#define LINK_MAX 32767 /* max file link count */ -#define MAX_CANON 1024 /* max bytes in term canon input line */ -#define MAX_INPUT 1024 /* max bytes in terminal input */ -#define NAME_MAX 255 /* max bytes in a file name */ -#define NGROUPS_MAX 16 /* max supplemental group id's */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define UID_MAX 2147483647U /* max value for a uid_t (2^31-2) */ - -#define OPEN_MAX 10240 /* max open files per process - todo, make a config option? */ - -#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ -#define PATH_MAX 1024 /* max bytes in pathname */ -#define PIPE_BUF 512 /* max bytes for atomic pipe writes */ - -#define BC_BASE_MAX 99 /* max ibase/obase values in bc(1) */ -#define BC_DIM_MAX 2048 /* max array elements in bc(1) */ -#define BC_SCALE_MAX 99 /* max scale value in bc(1) */ -#define BC_STRING_MAX 1000 /* max const string length in bc(1) */ -#define CHARCLASS_NAME_MAX 14 /* max character class name size */ -#define COLL_WEIGHTS_MAX 2 /* max weights for order keyword */ -#define EQUIV_CLASS_MAX 2 -#define EXPR_NEST_MAX 32 /* max expressions nested in expr(1) */ -#define LINE_MAX 2048 /* max bytes in an input line */ -#define RE_DUP_MAX 255 /* max RE's in interval notation */ - -#if __DARWIN_UNIX03 -#define NZERO 20 /* default priority [XSI] */ - /* = ((PRIO_MAX - PRIO_MIN) / 2) + 1 */ - /* range: 0 - 39 [(2 * NZERO) - 1] */ - /* 0 is not actually used */ -#else /* !__DARWIN_UNIX03 */ -#define NZERO 0 /* default priority */ - /* range: -20 - 20 */ - /* (PRIO_MIN - PRIO_MAX) */ -#endif /* __DARWIN_UNIX03 */ -#endif /* !_ANSI_SOURCE */ - -#endif /* !_SYS_SYSLIMITS_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/ucontext.h b/lib/libc/include/x86_64-macos-gnu/sys/ucontext.h deleted file mode 100644 index 5b55545a47..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/ucontext.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2002-2006 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ - -#ifndef _SYS_UCONTEXT_H_ -#define _SYS_UCONTEXT_H_ - -#include -#include - -#include -#include - -#include - - -#endif /* _SYS_UCONTEXT_H_ */ diff --git a/lib/libc/include/x86_64-macos-gnu/sys/uio.h b/lib/libc/include/x86_64-macos-gnu/sys/uio.h deleted file mode 100644 index a5b1bad7cf..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/uio.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2000-2008 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */ -/* - * Copyright (c) 1982, 1986, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)uio.h 8.5 (Berkeley) 2/22/94 - */ - -#ifndef _SYS_UIO_H_ -#define _SYS_UIO_H_ - -#include -#include - -/* - * [XSI] The ssize_t and size_t types shall be defined as described - * in . - */ -#include -#include - -/* - * [XSI] Structure whose address is passed as the second parameter to the - * readv() and writev() functions. - */ -#include - - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -/* - * IO direction for uio_t. - * UIO_READ - data moves into iovec(s) associated with uio_t - * UIO_WRITE - data moves out of iovec(s) associated with uio_t - */ -enum uio_rw { UIO_READ, UIO_WRITE }; -#endif - - - -__BEGIN_DECLS -ssize_t readv(int, const struct iovec *, int) __DARWIN_ALIAS_C(readv); -ssize_t writev(int, const struct iovec *, int) __DARWIN_ALIAS_C(writev); -__END_DECLS - -#endif /* !_SYS_UIO_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/sys/un.h b/lib/libc/include/x86_64-macos-gnu/sys/un.h deleted file mode 100644 index a27ead5406..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/sys/un.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)un.h 8.3 (Berkeley) 2/19/95 - */ - -#ifndef _SYS_UN_H_ -#define _SYS_UN_H_ - -#include -#include -#include - -/* [XSI] The sa_family_t type shall be defined as described in */ -#include - -/* - * [XSI] Definitions for UNIX IPC domain. - */ -struct sockaddr_un { - unsigned char sun_len; /* sockaddr len including null */ - sa_family_t sun_family; /* [XSI] AF_UNIX */ - char sun_path[104]; /* [XSI] path name (gag) */ -}; - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) - -/* Level number of get/setsockopt for local domain sockets */ -#define SOL_LOCAL 0 - -/* Socket options. */ -#define LOCAL_PEERCRED 0x001 /* retrieve peer credentials */ -#define LOCAL_PEERPID 0x002 /* retrieve peer pid */ -#define LOCAL_PEEREPID 0x003 /* retrieve eff. peer pid */ -#define LOCAL_PEERUUID 0x004 /* retrieve peer UUID */ -#define LOCAL_PEEREUUID 0x005 /* retrieve eff. peer UUID */ - -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ - - - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -/* actual length of an initialized sockaddr_un */ -#define SUN_LEN(su) \ - (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path)) -#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ - - -#endif /* !_SYS_UN_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/time.h b/lib/libc/include/x86_64-macos-gnu/time.h deleted file mode 100644 index b2edfb95cd..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/time.h +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)time.h 8.3 (Berkeley) 1/21/94 - */ - -#ifndef _TIME_H_ -#define _TIME_H_ - -#include <_types.h> -#include -#include -#include -#include -#include -#include -#include - -struct tm { - int tm_sec; /* seconds after the minute [0-60] */ - int tm_min; /* minutes after the hour [0-59] */ - int tm_hour; /* hours since midnight [0-23] */ - int tm_mday; /* day of the month [1-31] */ - int tm_mon; /* months since January [0-11] */ - int tm_year; /* years since 1900 */ - int tm_wday; /* days since Sunday [0-6] */ - int tm_yday; /* days since January 1 [0-365] */ - int tm_isdst; /* Daylight Savings Time flag */ - long tm_gmtoff; /* offset from UTC in seconds */ - char *tm_zone; /* timezone abbreviation */ -}; - -#if __DARWIN_UNIX03 -#define CLOCKS_PER_SEC 1000000 /* [XSI] */ -#else /* !__DARWIN_UNIX03 */ -#include /* Include file containing CLK_TCK. */ - -#define CLOCKS_PER_SEC (__DARWIN_CLK_TCK) -#endif /* __DARWIN_UNIX03 */ - -#ifndef _ANSI_SOURCE -extern char *tzname[]; -#endif - -extern int getdate_err; -#if __DARWIN_UNIX03 -extern long timezone __DARWIN_ALIAS(timezone); -#endif /* __DARWIN_UNIX03 */ -extern int daylight; - -__BEGIN_DECLS -char *asctime(const struct tm *); -clock_t clock(void) __DARWIN_ALIAS(clock); -char *ctime(const time_t *); -double difftime(time_t, time_t); -struct tm *getdate(const char *); -struct tm *gmtime(const time_t *); -struct tm *localtime(const time_t *); -time_t mktime(struct tm *) __DARWIN_ALIAS(mktime); -size_t strftime(char * __restrict, size_t, const char * __restrict, const struct tm * __restrict) __DARWIN_ALIAS(strftime); -char *strptime(const char * __restrict, const char * __restrict, struct tm * __restrict) __DARWIN_ALIAS(strptime); -time_t time(time_t *); - -#ifndef _ANSI_SOURCE -void tzset(void); -#endif /* not ANSI */ - -/* [TSF] Thread safe functions */ -char *asctime_r(const struct tm * __restrict, char * __restrict); -char *ctime_r(const time_t *, char *); -struct tm *gmtime_r(const time_t * __restrict, struct tm * __restrict); -struct tm *localtime_r(const time_t * __restrict, struct tm * __restrict); - -#if !defined(_ANSI_SOURCE) && (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)) -time_t posix2time(time_t); -#if !__DARWIN_UNIX03 -char *timezone(int, int); -#endif /* !__DARWIN_UNIX03 */ -void tzsetwall(void); -time_t time2posix(time_t); -time_t timelocal(struct tm * const); -time_t timegm(struct tm * const); -#endif /* neither ANSI nor POSIX */ - -#if !defined(_ANSI_SOURCE) -int nanosleep(const struct timespec *__rqtp, struct timespec *__rmtp) __DARWIN_ALIAS_C(nanosleep); -#endif - -#if !defined(_DARWIN_FEATURE_CLOCK_GETTIME) || _DARWIN_FEATURE_CLOCK_GETTIME != 0 -#if __DARWIN_C_LEVEL >= 199309L -#if __has_feature(enumerator_attributes) -#define __CLOCK_AVAILABILITY __OSX_AVAILABLE(10.12) __IOS_AVAILABLE(10.0) __TVOS_AVAILABLE(10.0) __WATCHOS_AVAILABLE(3.0) -#else -#define __CLOCK_AVAILABILITY -#endif - -typedef enum { -_CLOCK_REALTIME __CLOCK_AVAILABILITY = 0, -#define CLOCK_REALTIME _CLOCK_REALTIME -_CLOCK_MONOTONIC __CLOCK_AVAILABILITY = 6, -#define CLOCK_MONOTONIC _CLOCK_MONOTONIC -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -_CLOCK_MONOTONIC_RAW __CLOCK_AVAILABILITY = 4, -#define CLOCK_MONOTONIC_RAW _CLOCK_MONOTONIC_RAW -_CLOCK_MONOTONIC_RAW_APPROX __CLOCK_AVAILABILITY = 5, -#define CLOCK_MONOTONIC_RAW_APPROX _CLOCK_MONOTONIC_RAW_APPROX -_CLOCK_UPTIME_RAW __CLOCK_AVAILABILITY = 8, -#define CLOCK_UPTIME_RAW _CLOCK_UPTIME_RAW -_CLOCK_UPTIME_RAW_APPROX __CLOCK_AVAILABILITY = 9, -#define CLOCK_UPTIME_RAW_APPROX _CLOCK_UPTIME_RAW_APPROX -#endif -_CLOCK_PROCESS_CPUTIME_ID __CLOCK_AVAILABILITY = 12, -#define CLOCK_PROCESS_CPUTIME_ID _CLOCK_PROCESS_CPUTIME_ID -_CLOCK_THREAD_CPUTIME_ID __CLOCK_AVAILABILITY = 16 -#define CLOCK_THREAD_CPUTIME_ID _CLOCK_THREAD_CPUTIME_ID -} clockid_t; - -__CLOCK_AVAILABILITY -int clock_getres(clockid_t __clock_id, struct timespec *__res); - -__CLOCK_AVAILABILITY -int clock_gettime(clockid_t __clock_id, struct timespec *__tp); - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -__CLOCK_AVAILABILITY -__uint64_t clock_gettime_nsec_np(clockid_t __clock_id); -#endif - -__OSX_AVAILABLE(10.12) __IOS_PROHIBITED -__TVOS_PROHIBITED __WATCHOS_PROHIBITED -int clock_settime(clockid_t __clock_id, const struct timespec *__tp); - -#undef __CLOCK_AVAILABILITY -#endif /* __DARWIN_C_LEVEL */ -#endif /* _DARWIN_FEATURE_CLOCK_GETTIME */ - -#if (__DARWIN_C_LEVEL >= __DARWIN_C_FULL) && \ - ((defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || \ - (defined(__cplusplus) && __cplusplus >= 201703L)) -/* ISO/IEC 9899:201x 7.27.2.5 The timespec_get function */ -#define TIME_UTC 1 /* time elapsed since epoch */ -__API_AVAILABLE(macosx(10.15), ios(13.0), tvos(13.0), watchos(6.0)) -int timespec_get(struct timespec *ts, int base); -#endif - -__END_DECLS - -#ifdef _USE_EXTENDED_LOCALES_ -#include -#endif /* _USE_EXTENDED_LOCALES_ */ - -#endif /* !_TIME_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/ucontext.h b/lib/libc/include/x86_64-macos-gnu/ucontext.h deleted file mode 100644 index 27b4111035..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/ucontext.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2002, 2008, 2009 Apple Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - -/* - * These routines are DEPRECATED and should not be used. - */ -#ifndef _UCONTEXT_H_ -#define _UCONTEXT_H_ - -#include - -#ifdef _XOPEN_SOURCE -#include -#include - -__BEGIN_DECLS -__API_DEPRECATED("No longer supported", macos(10.5, 10.6)) -int getcontext(ucontext_t *); - -__API_DEPRECATED("No longer supported", macos(10.5, 10.6)) -void makecontext(ucontext_t *, void (*)(), int, ...); - -__API_DEPRECATED("No longer supported", macos(10.5, 10.6)) -int setcontext(const ucontext_t *); - -__API_DEPRECATED("No longer supported", macos(10.5, 10.6)) -int swapcontext(ucontext_t * __restrict, const ucontext_t * __restrict); - -__END_DECLS -#else /* !_XOPEN_SOURCE */ -#error The deprecated ucontext routines require _XOPEN_SOURCE to be defined -#endif /* _XOPEN_SOURCE */ - -#endif /* _UCONTEXT_H_ */ diff --git a/lib/libc/include/x86_64-macos-gnu/xlocale/_inttypes.h b/lib/libc/include/x86_64-macos-gnu/xlocale/_inttypes.h deleted file mode 100644 index 4da8f90c6d..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/xlocale/_inttypes.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2005 Apple Computer, Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - -#ifndef _XLOCALE__INTTYPES_H_ -#define _XLOCALE__INTTYPES_H_ - -#include -#include -#include <_xlocale.h> - -__BEGIN_DECLS -intmax_t strtoimax_l(const char * __restrict nptr, char ** __restrict endptr, - int base, locale_t); -uintmax_t strtoumax_l(const char * __restrict nptr, char ** __restrict endptr, - int base, locale_t); -intmax_t wcstoimax_l(const wchar_t * __restrict nptr, - wchar_t ** __restrict endptr, int base, locale_t); -uintmax_t wcstoumax_l(const wchar_t * __restrict nptr, - wchar_t ** __restrict endptr, int base, locale_t); - -/* Poison the following routines if -fshort-wchar is set */ -#if !defined(__cplusplus) && defined(__WCHAR_MAX__) && __WCHAR_MAX__ <= 0xffffU -#pragma GCC poison wcstoimax_l wcstoumax_l -#endif -__END_DECLS - -#endif /* _XLOCALE__INTTYPES_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/xlocale/_wchar.h b/lib/libc/include/x86_64-macos-gnu/xlocale/_wchar.h deleted file mode 100644 index b4af0f816e..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/xlocale/_wchar.h +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright (c) 2005 Apple Computer, Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - -#ifndef _XLOCALE__WCHAR_H_ -#define _XLOCALE__WCHAR_H_ - -#include <_stdio.h> -#include <_xlocale.h> -#include - -/* Initially added in Issue 4 */ -__BEGIN_DECLS -wint_t btowc_l(int, locale_t); -wint_t fgetwc_l(FILE *, locale_t); -wchar_t *fgetws_l(wchar_t * __restrict, int, FILE * __restrict, locale_t); -wint_t fputwc_l(wchar_t, FILE *, locale_t); -int fputws_l(const wchar_t * __restrict, FILE * __restrict, locale_t); -int fwprintf_l(FILE * __restrict, locale_t, const wchar_t * __restrict, ...); -int fwscanf_l(FILE * __restrict, locale_t, const wchar_t * __restrict, ...); -wint_t getwc_l(FILE *, locale_t); -wint_t getwchar_l(locale_t); -size_t mbrlen_l(const char * __restrict, size_t, mbstate_t * __restrict, - locale_t); -size_t mbrtowc_l(wchar_t * __restrict, const char * __restrict, size_t, - mbstate_t * __restrict, locale_t); -int mbsinit_l(const mbstate_t *, locale_t); -size_t mbsrtowcs_l(wchar_t * __restrict, const char ** __restrict, size_t, - mbstate_t * __restrict, locale_t); -wint_t putwc_l(wchar_t, FILE *, locale_t); -wint_t putwchar_l(wchar_t, locale_t); -int swprintf_l(wchar_t * __restrict, size_t n, locale_t, - const wchar_t * __restrict, ...); -int swscanf_l(const wchar_t * __restrict, locale_t, - const wchar_t * __restrict, ...); -wint_t ungetwc_l(wint_t, FILE *, locale_t); -int vfwprintf_l(FILE * __restrict, locale_t, const wchar_t * __restrict, - __darwin_va_list); -int vswprintf_l(wchar_t * __restrict, size_t n, locale_t, - const wchar_t * __restrict, __darwin_va_list); -int vwprintf_l(locale_t, const wchar_t * __restrict, __darwin_va_list); -size_t wcrtomb_l(char * __restrict, wchar_t, mbstate_t * __restrict, - locale_t); -int wcscoll_l(const wchar_t *, const wchar_t *, locale_t); -size_t wcsftime_l(wchar_t * __restrict, size_t, const wchar_t * __restrict, - const struct tm * __restrict, locale_t) - __DARWIN_ALIAS(wcsftime_l); -size_t wcsrtombs_l(char * __restrict, const wchar_t ** __restrict, size_t, - mbstate_t * __restrict, locale_t); -double wcstod_l(const wchar_t * __restrict, wchar_t ** __restrict, locale_t); -long wcstol_l(const wchar_t * __restrict, wchar_t ** __restrict, int, - locale_t); -unsigned long - wcstoul_l(const wchar_t * __restrict, wchar_t ** __restrict, int, - locale_t); -int wcswidth_l(const wchar_t *, size_t, locale_t); -size_t wcsxfrm_l(wchar_t * __restrict, const wchar_t * __restrict, size_t, - locale_t); -int wctob_l(wint_t, locale_t); -int wcwidth_l(wchar_t, locale_t); -int wprintf_l(locale_t, const wchar_t * __restrict, ...); -int wscanf_l(locale_t, const wchar_t * __restrict, ...); -__END_DECLS - - - -/* Additional functionality provided by: - * POSIX.1-2001 - */ - -#if __DARWIN_C_LEVEL >= 200112L -__BEGIN_DECLS -int vfwscanf_l(FILE * __restrict, locale_t, const wchar_t * __restrict, - __darwin_va_list); -int vswscanf_l(const wchar_t * __restrict, locale_t, - const wchar_t * __restrict, __darwin_va_list); -int vwscanf_l(locale_t, const wchar_t * __restrict, __darwin_va_list); -float wcstof_l(const wchar_t * __restrict, wchar_t ** __restrict, locale_t); -long double - wcstold_l(const wchar_t * __restrict, wchar_t ** __restrict, locale_t); -#if !__DARWIN_NO_LONG_LONG -long long - wcstoll_l(const wchar_t * __restrict, wchar_t ** __restrict, int, - locale_t); -unsigned long long - wcstoull_l(const wchar_t * __restrict, wchar_t ** __restrict, int, - locale_t); -#endif /* !__DARWIN_NO_LONG_LONG */ -__END_DECLS -#endif /* __DARWIN_C_LEVEL >= 200112L */ - - - -/* Additional functionality provided by: - * POSIX.1-2008 - */ - -#if __DARWIN_C_LEVEL >= 200809L -__BEGIN_DECLS -size_t mbsnrtowcs_l(wchar_t * __restrict, const char ** __restrict, size_t, - size_t, mbstate_t * __restrict, locale_t); -int wcscasecmp_l(const wchar_t *, const wchar_t *, locale_t) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); -int wcsncasecmp_l(const wchar_t *, const wchar_t *, size_t n, locale_t) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); -size_t wcsnrtombs_l(char * __restrict, const wchar_t ** __restrict, size_t, - size_t, mbstate_t * __restrict, locale_t); -__END_DECLS -#endif /* __DARWIN_C_LEVEL >= 200809L */ - - - -/* Darwin extensions */ - -#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL -__BEGIN_DECLS -wchar_t *fgetwln_l(FILE * __restrict, size_t *, locale_t) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); -__END_DECLS -#endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ - - - -/* Poison the following routines if -fshort-wchar is set */ -#if !defined(__cplusplus) && defined(__WCHAR_MAX__) && __WCHAR_MAX__ <= 0xffffU -#pragma GCC poison fgetwln_l fgetws_l fputwc_l fputws_l fwprintf_l fwscanf_l mbrtowc_l mbsnrtowcs_l mbsrtowcs_l putwc_l putwchar_l swprintf_l swscanf_l vfwprintf_l vfwscanf_l vswprintf_l vswscanf_l vwprintf_l vwscanf_l wcrtomb_l wcscoll_l wcsftime_l wcsftime_l wcsnrtombs_l wcsrtombs_l wcstod_l wcstof_l wcstol_l wcstold_l wcstoll_l wcstoul_l wcstoull_l wcswidth_l wcsxfrm_l wcwidth_l wprintf_l wscanf_l -#endif - -#endif /* _XLOCALE__WCHAR_H_ */ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/xpc/availability.h b/lib/libc/include/x86_64-macos-gnu/xpc/availability.h deleted file mode 100644 index d4efcec685..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/xpc/availability.h +++ /dev/null @@ -1,120 +0,0 @@ -#ifndef __XPC_AVAILABILITY_H__ -#define __XPC_AVAILABILITY_H__ - -#include - -// Certain parts of the project use all the project's headers but have to build -// against newer OSX SDKs than ebuild uses -- liblaunch_host being the example. -// So we need to define these. -#ifndef __MAC_10_15 -#define __MAC_10_15 101500 -#define __AVAILABILITY_INTERNAL__MAC_10_15 \ -__attribute__((availability(macosx, introduced=10.15))) -#endif // __MAC_10_15 - -#ifndef __MAC_10_14 -#define __MAC_10_14 101400 -#define __AVAILABILITY_INTERNAL__MAC_10_14 \ -__attribute__((availability(macosx, introduced=10.14))) -#endif // __MAC_10_14 - -#ifndef __MAC_10_13 -#define __MAC_10_13 101300 -#define __AVAILABILITY_INTERNAL__MAC_10_13 \ - __attribute__((availability(macosx, introduced=10.13))) -#endif // __MAC_10_13 - -#ifndef __MAC_10_12 -#define __MAC_10_12 101200 -#define __AVAILABILITY_INTERNAL__MAC_10_12 \ - __attribute__((availability(macosx, introduced=10.12))) -#endif // __MAC_10_12 - -#ifndef __MAC_10_11 -#define __MAC_10_11 101100 -#define __AVAILABILITY_INTERNAL__MAC_10_11 \ - __attribute__((availability(macosx, introduced=10.11))) -#endif // __MAC_10_11 - -#ifndef __AVAILABILITY_INTERNAL__MAC_10_2_DEP__MAC_10_11 -#define __AVAILABILITY_INTERNAL__MAC_10_2_DEP__MAC_10_11 -#endif // __AVAILABILITY_INTERNAL__MAC_10_2_DEP__MAC_10_11 - -#ifndef __AVAILABILITY_INTERNAL__MAC_10_3_DEP__MAC_10_11 -#define __AVAILABILITY_INTERNAL__MAC_10_3_DEP__MAC_10_11 -#endif // __AVAILABILITY_INTERNAL__MAC_10_3_DEP__MAC_10_11 - -#ifndef __AVAILABILITY_INTERNAL__MAC_10_4_DEP__MAC_10_11 -#define __AVAILABILITY_INTERNAL__MAC_10_4_DEP__MAC_10_11 -#endif // __AVAILABILITY_INTERNAL__MAC_10_4_DEP__MAC_10_11 - -#ifndef __AVAILABILITY_INTERNAL__MAC_10_5_DEP__MAC_10_11 -#define __AVAILABILITY_INTERNAL__MAC_10_5_DEP__MAC_10_11 -#endif // __AVAILABILITY_INTERNAL__MAC_10_5_DEP__MAC_10_11 - -#ifndef __AVAILABILITY_INTERNAL__MAC_10_6_DEP__MAC_10_11 -#define __AVAILABILITY_INTERNAL__MAC_10_6_DEP__MAC_10_11 -#endif // __AVAILABILITY_INTERNAL__MAC_10_6_DEP__MAC_10_11 - -#ifndef __AVAILABILITY_INTERNAL__MAC_10_7_DEP__MAC_10_11 -#define __AVAILABILITY_INTERNAL__MAC_10_7_DEP__MAC_10_11 -#endif // __AVAILABILITY_INTERNAL__MAC_10_7_DEP__MAC_10_11 - -#ifndef __AVAILABILITY_INTERNAL__MAC_10_8_DEP__MAC_10_11 -#define __AVAILABILITY_INTERNAL__MAC_10_8_DEP__MAC_10_11 -#endif // __AVAILABILITY_INTERNAL__MAC_10_8_DEP__MAC_10_11 - -#ifndef __AVAILABILITY_INTERNAL__MAC_10_9_DEP__MAC_10_11 -#define __AVAILABILITY_INTERNAL__MAC_10_9_DEP__MAC_10_11 -#endif // __AVAILABILITY_INTERNAL__MAC_10_9_DEP__MAC_10_11 - -#ifndef __AVAILABILITY_INTERNAL__MAC_10_10_DEP__MAC_10_11 -#define __AVAILABILITY_INTERNAL__MAC_10_10_DEP__MAC_10_11 -#endif // __AVAILABILITY_INTERNAL__MAC_10_10_DEP__MAC_10_11 - -#ifndef __AVAILABILITY_INTERNAL__MAC_10_11_DEP__MAC_10_11 -#define __AVAILABILITY_INTERNAL__MAC_10_11_DEP__MAC_10_11 -#endif // __AVAILABILITY_INTERNAL__MAC_10_11_DEP__MAC_10_11 - -#ifndef __AVAILABILITY_INTERNAL__MAC_10_6_DEP__MAC_10_13 -#define __AVAILABILITY_INTERNAL__MAC_10_6_DEP__MAC_10_13 -#endif // __AVAILABILITY_INTERNAL__MAC_10_6_DEP__MAC_10_13 - -#if __has_include() -#include -#else // __has_include() -#ifndef IPHONE_SIMULATOR_HOST_MIN_VERSION_REQUIRED -#define IPHONE_SIMULATOR_HOST_MIN_VERSION_REQUIRED 999999 -#endif // IPHONE_SIMULATOR_HOST_MIN_VERSION_REQUIRED -#endif // __has_include() - -#ifndef __WATCHOS_UNAVAILABLE -#define __WATCHOS_UNAVAILABLE -#endif - -#ifndef __TVOS_UNAVAILABLE -#define __TVOS_UNAVAILABLE -#endif - -// simulator host-side bits build against SDKs not having __*_AVAILABLE() yet -#ifndef __OSX_AVAILABLE -#define __OSX_AVAILABLE(...) -#endif - -#ifndef __IOS_AVAILABLE -#define __IOS_AVAILABLE(...) -#endif - -#ifndef __TVOS_AVAILABLE -#define __TVOS_AVAILABLE(...) -#endif - -#ifndef __WATCHOS_AVAILABLE -#define __WATCHOS_AVAILABLE(...) -#endif - -#ifndef __API_AVAILABLE -#define __API_AVAILABLE(...) -#endif - -#endif // __XPC_AVAILABILITY_H__ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/xpc/base.h b/lib/libc/include/x86_64-macos-gnu/xpc/base.h deleted file mode 100644 index 8fce33a1d4..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/xpc/base.h +++ /dev/null @@ -1,211 +0,0 @@ -// Copyright (c) 2009-2011 Apple Inc. All rights reserved. - -#ifndef __XPC_BASE_H__ -#define __XPC_BASE_H__ - -#include - -__BEGIN_DECLS - -#if !defined(__has_include) -#define __has_include(x) 0 -#endif // !defined(__has_include) - -#if !defined(__has_attribute) -#define __has_attribute(x) 0 -#endif // !defined(__has_attribute) - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif // !defined(__has_feature) - -#if !defined(__has_extension) -#define __has_extension(x) 0 -#endif // !defined(__has_extension) - -#if __has_include() -#include -#else // __has_include() -#include -#endif // __has_include() - -#ifndef __XPC_INDIRECT__ -#error "Please #include instead of this file directly." -#endif // __XPC_INDIRECT__ - -#pragma mark Attribute Shims -#ifdef __GNUC__ -#define XPC_CONSTRUCTOR __attribute__((constructor)) -#define XPC_NORETURN __attribute__((__noreturn__)) -#define XPC_NOTHROW __attribute__((__nothrow__)) -#define XPC_NONNULL1 __attribute__((__nonnull__(1))) -#define XPC_NONNULL2 __attribute__((__nonnull__(2))) -#define XPC_NONNULL3 __attribute__((__nonnull__(3))) -#define XPC_NONNULL4 __attribute__((__nonnull__(4))) -#define XPC_NONNULL5 __attribute__((__nonnull__(5))) -#define XPC_NONNULL6 __attribute__((__nonnull__(6))) -#define XPC_NONNULL7 __attribute__((__nonnull__(7))) -#define XPC_NONNULL8 __attribute__((__nonnull__(8))) -#define XPC_NONNULL9 __attribute__((__nonnull__(9))) -#define XPC_NONNULL10 __attribute__((__nonnull__(10))) -#define XPC_NONNULL11 __attribute__((__nonnull__(11))) -#define XPC_NONNULL_ALL __attribute__((__nonnull__)) -#define XPC_SENTINEL __attribute__((__sentinel__)) -#define XPC_PURE __attribute__((__pure__)) -#define XPC_WARN_RESULT __attribute__((__warn_unused_result__)) -#define XPC_MALLOC __attribute__((__malloc__)) -#define XPC_UNUSED __attribute__((__unused__)) -#define XPC_USED __attribute__((__used__)) -#define XPC_PACKED __attribute__((__packed__)) -#define XPC_PRINTF(m, n) __attribute__((format(printf, m, n))) -#define XPC_INLINE static __inline__ __attribute__((__always_inline__)) -#define XPC_NOINLINE __attribute__((noinline)) -#define XPC_NOIMPL __attribute__((unavailable)) - -#if __has_attribute(noescape) -#define XPC_NOESCAPE __attribute__((__noescape__)) -#else -#define XPC_NOESCAPE -#endif - -#if __has_extension(attribute_unavailable_with_message) -#define XPC_UNAVAILABLE(m) __attribute__((unavailable(m))) -#else // __has_extension(attribute_unavailable_with_message) -#define XPC_UNAVAILABLE(m) XPC_NOIMPL -#endif // __has_extension(attribute_unavailable_with_message) - -#define XPC_EXPORT extern __attribute__((visibility("default"))) -#define XPC_NOEXPORT __attribute__((visibility("hidden"))) -#define XPC_WEAKIMPORT extern __attribute__((weak_import)) -#define XPC_DEBUGGER_EXCL XPC_NOEXPORT XPC_USED -#define XPC_TRANSPARENT_UNION __attribute__((transparent_union)) -#if __clang__ -#define XPC_DEPRECATED(m) __attribute__((deprecated(m))) -#else // __clang__ -#define XPC_DEPRECATED(m) __attribute__((deprecated)) -#endif // __clang - -#if defined(__XPC_TEST__) && __XPC_TEST__ -#define XPC_TESTSTATIC -#define XPC_TESTEXTERN extern -#else // defined(__XPC_TEST__) && __XPC_TEST__ -#define XPC_TESTSTATIC static -#endif // defined(__XPC_TEST__) && __XPC_TEST__ - -#if __has_feature(objc_arc) -#define XPC_GIVES_REFERENCE __strong -#define XPC_UNRETAINED __unsafe_unretained -#define XPC_BRIDGE(xo) ((__bridge void *)(xo)) -#define XPC_BRIDGEREF_BEGIN(xo) ((__bridge_retained void *)(xo)) -#define XPC_BRIDGEREF_BEGIN_WITH_REF(xo) ((__bridge void *)(xo)) -#define XPC_BRIDGEREF_MIDDLE(xo) ((__bridge id)(xo)) -#define XPC_BRIDGEREF_END(xo) ((__bridge_transfer id)(xo)) -#else // __has_feature(objc_arc) -#define XPC_GIVES_REFERENCE -#define XPC_UNRETAINED -#define XPC_BRIDGE(xo) (xo) -#define XPC_BRIDGEREF_BEGIN(xo) (xo) -#define XPC_BRIDGEREF_BEGIN_WITH_REF(xo) (xo) -#define XPC_BRIDGEREF_MIDDLE(xo) (xo) -#define XPC_BRIDGEREF_END(xo) (xo) -#endif // __has_feature(objc_arc) - -#define _xpc_unreachable() __builtin_unreachable() -#else // __GNUC__ -/*! @parseOnly */ -#define XPC_CONSTRUCTOR -/*! @parseOnly */ -#define XPC_NORETURN -/*! @parseOnly */ -#define XPC_NOTHROW -/*! @parseOnly */ -#define XPC_NONNULL1 -/*! @parseOnly */ -#define XPC_NONNULL2 -/*! @parseOnly */ -#define XPC_NONNULL3 -/*! @parseOnly */ -#define XPC_NONNULL4 -/*! @parseOnly */ -#define XPC_NONNULL5 -/*! @parseOnly */ -#define XPC_NONNULL6 -/*! @parseOnly */ -#define XPC_NONNULL7 -/*! @parseOnly */ -#define XPC_NONNULL8 -/*! @parseOnly */ -#define XPC_NONNULL9 -/*! @parseOnly */ -#define XPC_NONNULL10 -/*! @parseOnly */ -#define XPC_NONNULL11 -/*! @parseOnly */ -#define XPC_NONNULL(n) -/*! @parseOnly */ -#define XPC_NONNULL_ALL -/*! @parseOnly */ -#define XPC_SENTINEL -/*! @parseOnly */ -#define XPC_PURE -/*! @parseOnly */ -#define XPC_WARN_RESULT -/*! @parseOnly */ -#define XPC_MALLOC -/*! @parseOnly */ -#define XPC_UNUSED -/*! @parseOnly */ -#define XPC_PACKED -/*! @parseOnly */ -#define XPC_PRINTF(m, n) -/*! @parseOnly */ -#define XPC_INLINE static inline -/*! @parseOnly */ -#define XPC_NOINLINE -/*! @parseOnly */ -#define XPC_NOIMPL -/*! @parseOnly */ -#define XPC_EXPORT extern -/*! @parseOnly */ -#define XPC_WEAKIMPORT -/*! @parseOnly */ -#define XPC_DEPRECATED -/*! @parseOnly */ -#define XPC_UNAVAILABLE(m) -/*! @parseOnly */ -#define XPC_NOESCAPE -#endif // __GNUC__ - -#if __has_feature(assume_nonnull) -#define XPC_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin") -#define XPC_ASSUME_NONNULL_END _Pragma("clang assume_nonnull end") -#else -#define XPC_ASSUME_NONNULL_BEGIN -#define XPC_ASSUME_NONNULL_END -#endif - -#if __has_feature(nullability_on_arrays) -#define XPC_NONNULL_ARRAY _Nonnull -#else -#define XPC_NONNULL_ARRAY -#endif - -#ifdef OS_CLOSED_OPTIONS -#define XPC_FLAGS_ENUM(_name, _type, ...) \ - OS_CLOSED_OPTIONS(_name, _type, __VA_ARGS__) -#else // OS_CLOSED_ENUM -#define XPC_FLAGS_ENUM(_name, _type, ...) \ - OS_ENUM(_name, _type, __VA_ARGS__) -#endif // OS_CLOSED_ENUM - -#ifdef OS_CLOSED_ENUM -#define XPC_ENUM(_name, _type, ...) \ - OS_CLOSED_ENUM(_name, _type, __VA_ARGS__) -#else // OS_CLOSED_ENUM -#define XPC_ENUM(_name, _type, ...) \ - OS_ENUM(_name, _type, __VA_ARGS__) -#endif // OS_CLOSED_ENUM - -__END_DECLS - -#endif // __XPC_BASE_H__ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/xpc/connection.h b/lib/libc/include/x86_64-macos-gnu/xpc/connection.h deleted file mode 100644 index 7a6ac1a2f9..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/xpc/connection.h +++ /dev/null @@ -1,747 +0,0 @@ -#ifndef __XPC_CONNECTION_H__ -#define __XPC_CONNECTION_H__ - -#ifndef __XPC_INDIRECT__ -#error "Please #include instead of this file directly." -// For HeaderDoc. -#include -#endif // __XPC_INDIRECT__ - -#ifndef __BLOCKS__ -#error "XPC connections require Blocks support." -#endif // __BLOCKS__ - -XPC_ASSUME_NONNULL_BEGIN -__BEGIN_DECLS - -/*! - * @constant XPC_ERROR_CONNECTION_INTERRUPTED - * Will be delivered to the connection's event handler if the remote service - * exited. The connection is still live even in this case, and resending a - * message will cause the service to be launched on-demand. This error serves - * as a client's indication that it should resynchronize any state that it had - * given the service. - * - * Any messages in the queue to be sent will be unwound and canceled when this - * error occurs. In the case where a message waiting to be sent has a reply - * handler, that handler will be invoked with this error. In the context of the - * reply handler, this error indicates that a reply to the message will never - * arrive. - * - * Messages that do not have reply handlers associated with them will be - * silently disposed of. This error will only be given to peer connections. - */ -#define XPC_ERROR_CONNECTION_INTERRUPTED \ - XPC_GLOBAL_OBJECT(_xpc_error_connection_interrupted) -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT -const struct _xpc_dictionary_s _xpc_error_connection_interrupted; - -/*! - * @constant XPC_ERROR_CONNECTION_INVALID - * Will be delivered to the connection's event handler if the named service - * provided to xpc_connection_create() could not be found in the XPC service - * namespace. The connection is useless and should be disposed of. - * - * Any messages in the queue to be sent will be unwound and canceled when this - * error occurs, similarly to the behavior when XPC_ERROR_CONNECTION_INTERRUPTED - * occurs. The only difference is that the XPC_ERROR_CONNECTION_INVALID will be - * given to outstanding reply handlers and the connection's event handler. - * - * This error may be given to any type of connection. - */ -#define XPC_ERROR_CONNECTION_INVALID \ - XPC_GLOBAL_OBJECT(_xpc_error_connection_invalid) -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT -const struct _xpc_dictionary_s _xpc_error_connection_invalid; - -/*! - * @constant XPC_ERROR_TERMINATION_IMMINENT - * On macOS, this error will be delivered to a peer connection's event handler - * when the XPC runtime has determined that the program should exit and that - * all outstanding transactions must be wound down, and no new transactions can - * be opened. - * - * After this error has been delivered to the event handler, no more messages - * will be received by the connection. The runtime will still attempt to deliver - * outgoing messages, but this error should be treated as an indication that - * the program will exit very soon, and any outstanding business over the - * connection should be wrapped up as quickly as possible and the connection - * canceled shortly thereafter. - * - * This error will only be delivered to peer connections received through a - * listener or the xpc_main() event handler. - */ -#define XPC_ERROR_TERMINATION_IMMINENT \ - XPC_GLOBAL_OBJECT(_xpc_error_termination_imminent) -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT -const struct _xpc_dictionary_s _xpc_error_termination_imminent; - -/*! - * @constant XPC_CONNECTION_MACH_SERVICE_LISTENER - * Passed to xpc_connection_create_mach_service(). This flag indicates that the - * caller is the listener for the named service. This flag may only be passed - * for services which are advertised in the process' launchd.plist(5). You may - * not use this flag to dynamically add services to the Mach bootstrap - * namespace. - */ -#define XPC_CONNECTION_MACH_SERVICE_LISTENER (1 << 0) - -/*! - * @constant XPC_CONNECTION_MACH_SERVICE_PRIVILEGED - * Passed to xpc_connection_create_mach_service(). This flag indicates that the - * job advertising the service name in its launchd.plist(5) should be in the - * privileged Mach bootstrap. This is typically accomplished by placing your - * launchd.plist(5) in /Library/LaunchDaemons. If specified alongside the - * XPC_CONNECTION_MACH_SERVICE_LISTENER flag, this flag is a no-op. - */ -#define XPC_CONNECTION_MACH_SERVICE_PRIVILEGED (1 << 1) - -/*! - * @typedef xpc_finalizer_f - * A function that is invoked when a connection is being torn down and its - * context needs to be freed. The sole argument is the value that was given to - * {@link xpc_connection_set_context} or NULL if no context has been set. It is - * not safe to reference the connection from within this function. - * - * @param value - * The context object that is to be disposed of. - */ -typedef void (*xpc_finalizer_t)(void * _Nullable value); - -/*! - * @function xpc_connection_create - * Creates a new connection object. - * - * @param name - * If non-NULL, the name of the service with which to connect. The returned - * connection will be a peer. - * - * If NULL, an anonymous listener connection will be created. You can embed the - * ability to create new peer connections in an endpoint, which can be inserted - * into a message and sent to another process . - * - * @param targetq - * The GCD queue to which the event handler block will be submitted. This - * parameter may be NULL, in which case the connection's target queue will be - * libdispatch's default target queue, defined as DISPATCH_TARGET_QUEUE_DEFAULT. - * The target queue may be changed later with a call to - * xpc_connection_set_target_queue(). - * - * @result - * A new connection object. The caller is responsible for disposing of the - * returned object with {@link xpc_release} when it is no longer needed. - * - * @discussion - * This method will succeed even if the named service does not exist. This is - * because the XPC namespace is not queried for the service name until the - * connection has been activated. See {@link xpc_connection_activate()}. - * - * XPC connections, like dispatch sources, are returned in an inactive state, so - * you must call {@link xpc_connection_activate()} in order to begin receiving - * events from the connection. Also like dispatch sources, connections must be - * activated and not suspended in order to be safely released. It is - * a programming error to release an inactive or suspended connection. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_MALLOC XPC_RETURNS_RETAINED XPC_WARN_RESULT -xpc_connection_t -xpc_connection_create(const char * _Nullable name, - dispatch_queue_t _Nullable targetq); - -/*! - * @function xpc_connection_create_mach_service - * Creates a new connection object representing a Mach service. - * - * @param name - * The name of the remote service with which to connect. The service name must - * exist in a Mach bootstrap that is accessible to the process and be advertised - * in a launchd.plist. - * - * @param targetq - * The GCD queue to which the event handler block will be submitted. This - * parameter may be NULL, in which case the connection's target queue will be - * libdispatch's default target queue, defined as DISPATCH_TARGET_QUEUE_DEFAULT. - * The target queue may be changed later with a call to - * xpc_connection_set_target_queue(). - * - * @param flags - * Additional attributes with which to create the connection. - * - * @result - * A new connection object. - * - * @discussion - * If the XPC_CONNECTION_MACH_SERVICE_LISTENER flag is given to this method, - * then the connection returned will be a listener connection. Otherwise, a peer - * connection will be returned. See the documentation for - * {@link xpc_connection_set_event_handler()} for the semantics of listener - * connections versus peer connections. - * - * This method will succeed even if the named service does not exist. This is - * because the Mach namespace is not queried for the service name until the - * connection has been activated. See {@link xpc_connection_activate()}. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_MALLOC XPC_RETURNS_RETAINED XPC_WARN_RESULT XPC_NONNULL1 -xpc_connection_t -xpc_connection_create_mach_service(const char *name, - dispatch_queue_t _Nullable targetq, uint64_t flags); - -/*! - * @function xpc_connection_create_from_endpoint - * Creates a new connection from the given endpoint. - * - * @param endpoint - * The endpoint from which to create the new connection. - * - * @result - * A new peer connection to the listener represented by the given endpoint. - * - * The same responsibilities of setting an event handler and activating the - * connection after calling xpc_connection_create() apply to the connection - * returned by this API. Since the connection yielded by this API is not - * associated with a name (and therefore is not rediscoverable), this connection - * will receive XPC_ERROR_CONNECTION_INVALID if the listening side crashes, - * exits or cancels the listener connection. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_MALLOC XPC_RETURNS_RETAINED XPC_WARN_RESULT XPC_NONNULL_ALL -xpc_connection_t -xpc_connection_create_from_endpoint(xpc_endpoint_t endpoint); - -/*! - * @function xpc_connection_set_target_queue - * Sets the target queue of the given connection. - * - * @param connection - * The connection object which is to be manipulated. - * - * @param targetq - * The GCD queue to which the event handler block will be submitted. This - * parameter may be NULL, in which case the connection's target queue will be - * libdispatch's default target queue, defined as DISPATCH_TARGET_QUEUE_DEFAULT. - * - * @discussion - * Setting the target queue is asynchronous and non-preemptive and therefore - * this method will not interrupt the execution of an already-running event - * handler block. Setting the target queue may be likened to issuing a barrier - * to the connection which does the actual work of changing the target queue. - * - * The XPC runtime guarantees this non-preemptiveness even for concurrent target - * queues. If the target queue is a concurrent queue, then XPC still guarantees - * that there will never be more than one invocation of the connection's event - * handler block executing concurrently. If you wish to process events - * concurrently, you can dispatch_async(3) to a concurrent queue from within - * the event handler. - * - * IMPORTANT: When called from within the event handler block, - * dispatch_get_current_queue(3) is NOT guaranteed to return a pointer to the - * queue set with this method. - * - * Despite this seeming inconsistency, the XPC runtime guarantees that, when the - * target queue is a serial queue, the event handler block will execute - * synchonously with respect to other blocks submitted to that same queue. When - * the target queue is a concurrent queue, the event handler block may run - * concurrently with other blocks submitted to that queue, but it will never run - * concurrently with other invocations of itself for the same connection, as - * discussed previously. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 -void -xpc_connection_set_target_queue(xpc_connection_t connection, - dispatch_queue_t _Nullable targetq); - -/*! - * @function xpc_connection_set_event_handler - * Sets the event handler block for the connection. - * - * @param connection - * The connection object which is to be manipulated. - * - * @param handler - * The event handler block. - * - * @discussion - * Setting the event handler is asynchronous and non-preemptive, and therefore - * this method will not interrupt the execution of an already-running event - * handler block. If the event handler is executing at the time of this call, it - * will finish, and then the connection's event handler will be changed before - * the next invocation of the event handler. The XPC runtime guarantees this - * non-preemptiveness even for concurrent target queues. - * - * Connection event handlers are non-reentrant, so it is safe to call - * xpc_connection_set_event_handler() from within the event handler block. - * - * The event handler's execution should be treated as a barrier to all - * connection activity. When it is executing, the connection will not attempt to - * send or receive messages, including reply messages. Thus, it is not safe to - * call xpc_connection_send_message_with_reply_sync() on the connection from - * within the event handler. - * - * You do not hold a reference on the object received as the event handler's - * only argument. Regardless of the type of object received, it is safe to call - * xpc_retain() on the object to obtain a reference to it. - * - * A connection may receive different events depending upon whether it is a - * listener or not. Any connection may receive an error in its event handler. - * But while normal connections may receive messages in addition to errors, - * listener connections will receive connections and and not messages. - * - * Connections received by listeners are equivalent to those returned by - * xpc_connection_create() with a non-NULL name argument and a NULL targetq - * argument with the exception that you do not hold a reference on them. - * You must set an event handler and activate the connection. If you do not wish - * to accept the connection, you may simply call xpc_connection_cancel() on it - * and return. The runtime will dispose of it for you. - * - * If there is an error in the connection, this handler will be invoked with the - * error dictionary as its argument. This dictionary will be one of the well- - * known XPC_ERROR_* dictionaries. - * - * Regardless of the type of event, ownership of the event object is NOT - * implicitly transferred. Thus, the object will be released and deallocated at - * some point in the future after the event handler returns. If you wish the - * event's lifetime to persist, you must retain it with xpc_retain(). - * - * Connections received through the event handler will be released and - * deallocated after the connection has gone invalid and delivered that event to - * its event handler. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL_ALL -void -xpc_connection_set_event_handler(xpc_connection_t connection, - xpc_handler_t handler); - -/*! - * @function xpc_connection_activate - * Activates the connection. Connections start in an inactive state, so you must - * call xpc_connection_activate() on a connection before it will send or receive - * any messages. - * - * @param connection - * The connection object which is to be manipulated. - * - * @discussion - * Calling xpc_connection_activate() on an active connection has no effect. - * Releasing the last reference on an inactive connection that was created with - * an xpc_connection_create*() call is undefined. - * - * For backward compatibility reasons, xpc_connection_resume() on an inactive - * and not otherwise suspended xpc connection has the same effect as calling - * xpc_connection_activate(). For new code, using xpc_connection_activate() - * is preferred. - */ -__OSX_AVAILABLE(10.12) __IOS_AVAILABLE(10.0) -__TVOS_AVAILABLE(10.0) __WATCHOS_AVAILABLE(3.0) -XPC_EXPORT XPC_NONNULL_ALL -void -xpc_connection_activate(xpc_connection_t connection); - -/*! - * @function xpc_connection_suspend - * Suspends the connection so that the event handler block will not fire and - * that the connection will not attempt to send any messages it has in its - * queue. All calls to xpc_connection_suspend() must be balanced with calls to - * xpc_connection_resume() before releasing the last reference to the - * connection. - * - * @param connection - * The connection object which is to be manipulated. - * - * @discussion - * Suspension is asynchronous and non-preemptive, and therefore this method will - * not interrupt the execution of an already-running event handler block. If - * the event handler is executing at the time of this call, it will finish, and - * then the connection will be suspended before the next scheduled invocation - * of the event handler. The XPC runtime guarantees this non-preemptiveness even - * for concurrent target queues. - * - * Connection event handlers are non-reentrant, so it is safe to call - * xpc_connection_suspend() from within the event handler block. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL_ALL -void -xpc_connection_suspend(xpc_connection_t connection); - -/*! - * @function xpc_connection_resume - * Resumes the connection. - * - * @param connection - * The connection object which is to be manipulated. - * - * @discussion - * In order for a connection to become live, every call to - * xpc_connection_suspend() must be balanced with a call to - * xpc_connection_resume(). - * - * For backward compatibility reasons, xpc_connection_resume() on an inactive - * and not otherwise suspended xpc connection has the same effect as calling - * xpc_connection_activate(). For new code, using xpc_connection_activate() - * is preferred. - * - * Calling xpc_connection_resume() more times than xpc_connection_suspend() - * has been called is otherwise considered an error. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL_ALL -void -xpc_connection_resume(xpc_connection_t connection); - -/*! - * @function xpc_connection_send_message - * Sends a message over the connection to the destination service. - * - * @param connection - * The connection over which the message shall be sent. - * - * @param message - * The message to send. This must be a dictionary object. This dictionary is - * logically copied by the connection, so it is safe to modify the dictionary - * after this call. - * - * @discussion - * Messages are delivered in FIFO order. This API is safe to call from multiple - * GCD queues. There is no indication that a message was delivered successfully. - * This is because even once the message has been successfully enqueued on the - * remote end, there are no guarantees about when the runtime will dequeue the - * message and invoke the other connection's event handler block. - * - * If this API is used to send a message that is in reply to another message, - * there is no guarantee of ordering between the invocations of the connection's - * event handler and the reply handler for that message, even if they are - * targeted to the same queue. - * - * After extensive study, we have found that clients who are interested in - * the state of the message on the server end are typically holding open - * transactions related to that message. And the only reliable way to track the - * lifetime of that transaction is at the protocol layer. So the server should - * send a reply message, which upon receiving, will cause the client to close - * its transaction. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL_ALL -void -xpc_connection_send_message(xpc_connection_t connection, xpc_object_t message); - -/*! - * @function xpc_connection_send_barrier - * Issues a barrier against the connection's message-send activity. - * - * @param connection - * The connection against which the barrier is to be issued. - * - * @param barrier - * The barrier block to issue. This barrier prevents concurrent message-send - * activity on the connection. No messages will be sent while the barrier block - * is executing. - * - * @discussion - * XPC guarantees that, even if the connection's target queue is a concurrent - * queue, there are no other messages being sent concurrently while the barrier - * block is executing. XPC does not guarantee that the receipt of messages - * (either through the connection's event handler or through reply handlers) - * will be suspended while the barrier is executing. - * - * A barrier is issued relative to the message-send queue. Thus, if you call - * xpc_connection_send_message() five times and then call - * xpc_connection_send_barrier(), the barrier will be invoked after the fifth - * message has been sent and its memory disposed of. You may safely cancel a - * connection from within a barrier block. - * - * If a barrier is issued after sending a message which expects a reply, the - * behavior is the same as described above. The receipt of a reply message will - * not influence when the barrier runs. - * - * A barrier block can be useful for throttling resource consumption on the - * connected side of a connection. For example, if your connection sends many - * large messages, you can use a barrier to limit the number of messages that - * are inflight at any given time. This can be particularly useful for messages - * that contain kernel resources (like file descriptors) which have a system- - * wide limit. - * - * If a barrier is issued on a canceled connection, it will be invoked - * immediately. If a connection has been canceled and still has outstanding - * barriers, those barriers will be invoked as part of the connection's - * unwinding process. - * - * It is important to note that a barrier block's execution order is not - * guaranteed with respect to other blocks that have been scheduled on the - * target queue of the connection. Or said differently, - * xpc_connection_send_barrier(3) is not equivalent to dispatch_async(3). - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL_ALL -void -xpc_connection_send_barrier(xpc_connection_t connection, - dispatch_block_t barrier); - -/*! - * @function xpc_connection_send_message_with_reply - * Sends a message over the connection to the destination service and associates - * a handler to be invoked when the remote service sends a reply message. - * - * @param connection - * The connection over which the message shall be sent. - * - * @param message - * The message to send. This must be a dictionary object. - * - * @param replyq - * The GCD queue to which the reply handler will be submitted. This may be a - * concurrent queue. - * - * @param handler - * The handler block to invoke when a reply to the message is received from - * the connection. If the remote service exits prematurely before the reply was - * received, the XPC_ERROR_CONNECTION_INTERRUPTED error will be returned. - * If the connection went invalid before the message could be sent, the - * XPC_ERROR_CONNECTION_INVALID error will be returned. - * - * @discussion - * If the given GCD queue is a concurrent queue, XPC cannot guarantee that there - * will not be multiple reply handlers being invoked concurrently. XPC does not - * guarantee any ordering for the invocation of reply handers. So if multiple - * messages are waiting for replies and the connection goes invalid, there is no - * guarantee that the reply handlers will be invoked in FIFO order. Similarly, - * XPC does not guarantee that reply handlers will not run concurrently with - * the connection's event handler in the case that the reply queue and the - * connection's target queue are the same concurrent queue. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 XPC_NONNULL2 XPC_NONNULL4 -void -xpc_connection_send_message_with_reply(xpc_connection_t connection, - xpc_object_t message, dispatch_queue_t _Nullable replyq, - xpc_handler_t handler); - -/*! - * @function xpc_connection_send_message_with_reply_sync - * Sends a message over the connection and blocks the caller until a reply is - * received. - * - * @param connection - * The connection over which the message shall be sent. - * - * @param message - * The message to send. This must be a dictionary object. - * - * @result - * The message that the remote service sent in reply to the original message. - * If the remote service exits prematurely before the reply was received, the - * XPC_ERROR_CONNECTION_INTERRUPTED error will be returned. If the connection - * went invalid before the message could be sent, the - * XPC_ERROR_CONNECTION_INVALID error will be returned. - * - * You are responsible for releasing the returned object. - * - * @discussion - * This API is primarily for transitional purposes. Its implementation is - * conceptually equivalent to calling xpc_connection_send_message_with_reply() - * and then immediately blocking the calling thread on a semaphore and - * signaling the semaphore from the reply block. - * - * Be judicious about your use of this API. It can block indefinitely, so if you - * are using it to implement an API that can be called from the main thread, you - * may wish to consider allowing the API to take a queue and callback block so - * that results may be delivered asynchronously if possible. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL_ALL XPC_WARN_RESULT XPC_RETURNS_RETAINED -xpc_object_t -xpc_connection_send_message_with_reply_sync(xpc_connection_t connection, - xpc_object_t message); - -/*! - * @function xpc_connection_cancel - * Cancels the connection and ensures that its event handler will not fire - * again. After this call, any messages that have not yet been sent will be - * discarded, and the connection will be unwound. If there are messages that are - * awaiting replies, they will have their reply handlers invoked with the - * XPC_ERROR_CONNECTION_INVALID error. - * - * @param connection - * The connection object which is to be manipulated. - * - * @discussion - * Cancellation is asynchronous and non-preemptive and therefore this method - * will not interrupt the execution of an already-running event handler block. - * If the event handler is executing at the time of this call, it will finish, - * and then the connection will be canceled, causing a final invocation of the - * event handler to be scheduled with the XPC_ERROR_CONNECTION_INVALID error. - * After that invocation, there will be no further invocations of the event - * handler. - * - * The XPC runtime guarantees this non-preemptiveness even for concurrent target - * queues. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL_ALL -void -xpc_connection_cancel(xpc_connection_t connection); - -/*! - * @function xpc_connection_get_name - * Returns the name of the service with which the connections was created. - * - * @param connection - * The connection object which is to be examined. - * - * @result - * The name of the remote service. If you obtained the connection through an - * invocation of another connection's event handler, NULL is returned. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL_ALL XPC_WARN_RESULT -const char * _Nullable -xpc_connection_get_name(xpc_connection_t connection); - -/*! - * @function xpc_connection_get_euid - * Returns the EUID of the remote peer. - * - * @param connection - * The connection object which is to be examined. - * - * @result - * The EUID of the remote peer at the time the connection was made. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL_ALL XPC_WARN_RESULT -uid_t -xpc_connection_get_euid(xpc_connection_t connection); - -/*! - * @function xpc_connection_get_egid - * Returns the EGID of the remote peer. - * - * @param connection - * The connection object which is to be examined. - * - * @result - * The EGID of the remote peer at the time the connection was made. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL_ALL XPC_WARN_RESULT -gid_t -xpc_connection_get_egid(xpc_connection_t connection); - -/*! - * @function xpc_connection_get_pid - * Returns the PID of the remote peer. - * - * @param connection - * The connection object which is to be examined. - * - * @result - * The PID of the remote peer. - * - * @discussion - * A given PID is not guaranteed to be unique across an entire boot cycle. - * Great care should be taken when dealing with this information, as it can go - * stale after the connection is established. OS X recycles PIDs, and therefore - * another process could spawn and claim the PID before a message is actually - * received from the connection. - * - * XPC will deliver an error to your event handler if the remote process goes - * away, but there are no guarantees as to the timing of this notification's - * delivery either at the kernel layer or at the XPC layer. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL_ALL XPC_WARN_RESULT -pid_t -xpc_connection_get_pid(xpc_connection_t connection); - -/*! - * @function xpc_connection_get_asid - * Returns the audit session identifier of the remote peer. - * - * @param connection - * The connection object which is to be examined. - * - * @result - * The audit session ID of the remote peer at the time the connection was made. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL_ALL XPC_WARN_RESULT -au_asid_t -xpc_connection_get_asid(xpc_connection_t connection); - -/*! - * @function xpc_connection_set_context - * Sets context on an connection. - * - * @param connection - * The connection which is to be manipulated. - * - * @param context - * The context to associate with the connection. - * - * @discussion - * If you must manage the memory of the context object, you must set a finalizer - * to dispose of it. If this method is called on a connection which already has - * context associated with it, the finalizer will NOT be invoked. The finalizer - * is only invoked when the connection is being deallocated. - * - * It is recommended that, instead of changing the actual context pointer - * associated with the object, you instead change the state of the context - * object itself. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 -void -xpc_connection_set_context(xpc_connection_t connection, - void * _Nullable context); - -/*! - * @function xpc_connection_get_context - * Returns the context associated with the connection. - * - * @param connection - * The connection which is to be examined. - * - * @result - * The context associated with the connection. NULL if there has been no context - * associated with the object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL_ALL XPC_WARN_RESULT -void * _Nullable -xpc_connection_get_context(xpc_connection_t connection); - -/*! - * @function xpc_connection_set_finalizer_f - * Sets the finalizer for the given connection. - * - * @param connection - * The connection on which to set the finalizer. - * - * @param finalizer - * The function that will be invoked when the connection's retain count has - * dropped to zero and is being torn down. - * - * @discussion - * This method disposes of the context value associated with a connection, as - * set by {@link xpc_connection_set_context}. - * - * For many uses of context objects, this API allows for a convenient shorthand - * for freeing them. For example, for a context object allocated with malloc(3): - * - * xpc_connection_set_finalizer_f(object, free); - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 -void -xpc_connection_set_finalizer_f(xpc_connection_t connection, - xpc_finalizer_t _Nullable finalizer); - -__END_DECLS -XPC_ASSUME_NONNULL_END - -#endif // __XPC_CONNECTION_H__ \ No newline at end of file diff --git a/lib/libc/include/x86_64-macos-gnu/xpc/xpc.h b/lib/libc/include/x86_64-macos-gnu/xpc/xpc.h deleted file mode 100644 index cb6cbb3997..0000000000 --- a/lib/libc/include/x86_64-macos-gnu/xpc/xpc.h +++ /dev/null @@ -1,2663 +0,0 @@ -// Copyright (c) 2009-2011 Apple Inc. All rights reserved. - -#ifndef __XPC_H__ -#define __XPC_H__ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifndef __XPC_INDIRECT__ -#define __XPC_INDIRECT__ -#endif // __XPC_INDIRECT__ - -#include - -#if __has_include() -#include -#else // __has_include() -#define XPC_TRANSACTION_DEPRECATED -#endif // __has_include() - -XPC_ASSUME_NONNULL_BEGIN -__BEGIN_DECLS - -#ifndef __OSX_AVAILABLE_STARTING -#define __OSX_AVAILABLE_STARTING(x, y) -#endif // __OSX_AVAILABLE_STARTING - -#define XPC_API_VERSION 20121012 - -/*! - * @typedef xpc_type_t - * A type that describes XPC object types. - */ -typedef const struct _xpc_type_s * xpc_type_t; -#ifndef XPC_TYPE -#define XPC_TYPE(type) const struct _xpc_type_s type -#endif // XPC_TYPE - -/*! - * @typedef xpc_object_t - * A type that can describe all XPC objects. Dictionaries, arrays, strings, etc. - * are all described by this type. - * - * XPC objects are created with a retain count of 1, and therefore it is the - * caller's responsibility to call xpc_release() on them when they are no longer - * needed. - */ - -#if OS_OBJECT_USE_OBJC -/* By default, XPC objects are declared as Objective-C types when building with - * an Objective-C compiler. This allows them to participate in ARC, in RR - * management by the Blocks runtime and in leaks checking by the static - * analyzer, and enables them to be added to Cocoa collections. - * - * See for details. - */ -OS_OBJECT_DECL(xpc_object); -#ifndef XPC_DECL -#define XPC_DECL(name) typedef xpc_object_t name##_t -#endif // XPC_DECL - -#define XPC_GLOBAL_OBJECT(object) ((OS_OBJECT_BRIDGE xpc_object_t)&(object)) -#define XPC_RETURNS_RETAINED OS_OBJECT_RETURNS_RETAINED -XPC_INLINE XPC_NONNULL_ALL -void -_xpc_object_validate(xpc_object_t object) { - void *isa = *(void * volatile *)(OS_OBJECT_BRIDGE void *)object; - (void)isa; -} -#else // OS_OBJECT_USE_OBJC -typedef void * xpc_object_t; -#define XPC_DECL(name) typedef struct _##name##_s * name##_t -#define XPC_GLOBAL_OBJECT(object) (&(object)) -#define XPC_RETURNS_RETAINED -#endif // OS_OBJECT_USE_OBJC - -/*! - * @typedef xpc_handler_t - * The type of block that is accepted by the XPC connection APIs. - * - * @param object - * An XPC object that is to be handled. If there was an error, this object will - * be equal to one of the well-known XPC_ERROR_* dictionaries and can be - * compared with the equality operator. - * - * @discussion - * You are not responsible for releasing the event object. - */ -#if __BLOCKS__ -typedef void (^xpc_handler_t)(xpc_object_t object); -#endif // __BLOCKS__ - -/*! - * @define XPC_TYPE_CONNECTION - * A type representing a connection to a named service. This connection is - * bidirectional and can be used to both send and receive messages. A - * connection carries the credentials of the remote service provider. - */ -#define XPC_TYPE_CONNECTION (&_xpc_type_connection) -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT -XPC_TYPE(_xpc_type_connection); -XPC_DECL(xpc_connection); - -/*! - * @typedef xpc_connection_handler_t - * The type of the function that will be invoked for a bundled XPC service when - * there is a new connection on the service. - * - * @param connection - * A new connection that is equivalent to one received by a listener connection. - * See the documentation for {@link xpc_connection_set_event_handler} for the - * semantics associated with the received connection. - */ -typedef void (*xpc_connection_handler_t)(xpc_connection_t connection); - -/*! - * @define XPC_TYPE_ENDPOINT - * A type representing a connection in serialized form. Unlike a connection, an - * endpoint is an inert object that does not have any runtime activity - * associated with it. Thus, it is safe to pass an endpoint in a message. Upon - * receiving an endpoint, the recipient can use - * xpc_connection_create_from_endpoint() to create as many distinct connections - * as desired. - */ -#define XPC_TYPE_ENDPOINT (&_xpc_type_endpoint) -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT -XPC_TYPE(_xpc_type_endpoint); -XPC_DECL(xpc_endpoint); - -/*! - * @define XPC_TYPE_NULL - * A type representing a null object. This type is useful for disambiguating - * an unset key in a dictionary and one which has been reserved but set empty. - * Also, this type is a way to represent a "null" value in dictionaries, which - * do not accept NULL. - */ -#define XPC_TYPE_NULL (&_xpc_type_null) -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT -XPC_TYPE(_xpc_type_null); - -/*! - * @define XPC_TYPE_BOOL - * A type representing a Boolean value. - */ -#define XPC_TYPE_BOOL (&_xpc_type_bool) -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT -XPC_TYPE(_xpc_type_bool); - -/*! - * @define XPC_BOOL_TRUE - * A constant representing a Boolean value of true. You may compare a Boolean - * object against this constant to determine its value. - */ -#define XPC_BOOL_TRUE XPC_GLOBAL_OBJECT(_xpc_bool_true) -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT -const struct _xpc_bool_s _xpc_bool_true; - -/*! - * @define XPC_BOOL_FALSE - * A constant representing a Boolean value of false. You may compare a Boolean - * object against this constant to determine its value. - */ -#define XPC_BOOL_FALSE XPC_GLOBAL_OBJECT(_xpc_bool_false) -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT -const struct _xpc_bool_s _xpc_bool_false; - -/*! - * @define XPC_TYPE_INT64 - * A type representing a signed, 64-bit integer value. - */ -#define XPC_TYPE_INT64 (&_xpc_type_int64) -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT -XPC_TYPE(_xpc_type_int64); - -/*! - * @define XPC_TYPE_UINT64 - * A type representing an unsigned, 64-bit integer value. - */ -#define XPC_TYPE_UINT64 (&_xpc_type_uint64) -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT -XPC_TYPE(_xpc_type_uint64); - -/*! - * @define XPC_TYPE_DOUBLE - * A type representing an IEEE-compliant, double-precision floating point value. - */ -#define XPC_TYPE_DOUBLE (&_xpc_type_double) -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT -XPC_TYPE(_xpc_type_double); - -/*! - * @define XPC_TYPE_DATE -* A type representing a date interval. The interval is with respect to the - * Unix epoch. XPC dates are in Unix time and are thus unaware of local time - * or leap seconds. - */ -#define XPC_TYPE_DATE (&_xpc_type_date) -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT -XPC_TYPE(_xpc_type_date); - -/*! - * @define XPC_TYPE_DATA - * A type representing a an arbitrary buffer of bytes. - */ -#define XPC_TYPE_DATA (&_xpc_type_data) -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT -XPC_TYPE(_xpc_type_data); - -/*! - * @define XPC_TYPE_STRING - * A type representing a NUL-terminated C-string. - */ -#define XPC_TYPE_STRING (&_xpc_type_string) -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT -XPC_TYPE(_xpc_type_string); - -/*! - * @define XPC_TYPE_UUID - * A type representing a Universally Unique Identifier as defined by uuid(3). - */ -#define XPC_TYPE_UUID (&_xpc_type_uuid) -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT -XPC_TYPE(_xpc_type_uuid); - -/*! - * @define XPC_TYPE_FD - * A type representing a POSIX file descriptor. - */ -#define XPC_TYPE_FD (&_xpc_type_fd) -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT -XPC_TYPE(_xpc_type_fd); - -/*! - * @define XPC_TYPE_SHMEM - * A type representing a region of shared memory. - */ -#define XPC_TYPE_SHMEM (&_xpc_type_shmem) -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT -XPC_TYPE(_xpc_type_shmem); - -/*! - * @define XPC_TYPE_ARRAY - * A type representing an array of XPC objects. This array must be contiguous, - * i.e. it cannot contain NULL values. If you wish to indicate that a slot - * is empty, you can insert a null object. The array will grow as needed to - * accommodate more objects. - */ -#define XPC_TYPE_ARRAY (&_xpc_type_array) -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT -XPC_TYPE(_xpc_type_array); - -/*! - * @define XPC_TYPE_DICTIONARY - * A type representing a dictionary of XPC objects, keyed off of C-strings. - * You may insert NULL values into this collection. The dictionary will grow - * as needed to accommodate more key/value pairs. - */ -#define XPC_TYPE_DICTIONARY (&_xpc_type_dictionary) -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT -XPC_TYPE(_xpc_type_dictionary); - -/*! - * @define XPC_TYPE_ERROR - * A type representing an error object. Errors in XPC are dictionaries, but - * xpc_get_type() will return this type when given an error object. You - * cannot create an error object directly; XPC will only give them to handlers. - * These error objects have pointer values that are constant across the lifetime - * of your process and can be safely compared. - * - * These constants are enumerated in the header for the connection object. Error - * dictionaries may reserve keys so that they can be queried to obtain more - * detailed information about the error. Currently, the only reserved key is - * XPC_ERROR_KEY_DESCRIPTION. - */ -#define XPC_TYPE_ERROR (&_xpc_type_error) -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT -XPC_TYPE(_xpc_type_error); - -/*! - * @define XPC_ERROR_KEY_DESCRIPTION - * In an error dictionary, querying for this key will return a string object - * that describes the error in a human-readable way. - */ -#define XPC_ERROR_KEY_DESCRIPTION _xpc_error_key_description -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT -const char * const _xpc_error_key_description; - -/*! - * @define XPC_EVENT_KEY_NAME - * In an event dictionary, this querying for this key will return a string - * object that describes the event. - */ -#define XPC_EVENT_KEY_NAME _xpc_event_key_name -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT -const char * const _xpc_event_key_name; - -XPC_ASSUME_NONNULL_END -#if !defined(__XPC_BUILDING_XPC__) || !__XPC_BUILDING_XPC__ -#include -#include -#if __BLOCKS__ -#include -#include -#endif // __BLOCKS__ -#undef __XPC_INDIRECT__ -#include -#endif // !defined(__XPC_BUILDING_XPC__) || !__XPC_BUILDING_XPC__ -XPC_ASSUME_NONNULL_BEGIN - -#pragma mark XPC Object Protocol -/*! - * @function xpc_retain - * - * @abstract - * Increments the reference count of an object. - * - * @param object - * The object which is to be manipulated. - * - * @result - * The object which was given. - * - * @discussion - * Calls to xpc_retain() must be balanced with calls to xpc_release() - * to avoid leaking memory. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 -xpc_object_t -xpc_retain(xpc_object_t object); -#if OS_OBJECT_USE_OBJC_RETAIN_RELEASE -#undef xpc_retain -#define xpc_retain(object) ({ xpc_object_t _o = (object); \ - _xpc_object_validate(_o); [_o retain]; }) -#endif // OS_OBJECT_USE_OBJC_RETAIN_RELEASE - -/*! - * @function xpc_release - * - * @abstract - * Decrements the reference count of an object. - * - * @param object - * The object which is to be manipulated. - * - * @discussion - * The caller must take care to balance retains and releases. When creating or - * retaining XPC objects, the creator obtains a reference on the object. Thus, - * it is the caller's responsibility to call xpc_release() on those objects when - * they are no longer needed. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 -void -xpc_release(xpc_object_t object); -#if OS_OBJECT_USE_OBJC_RETAIN_RELEASE -#undef xpc_release -#define xpc_release(object) ({ xpc_object_t _o = (object); \ - _xpc_object_validate(_o); [_o release]; }) -#endif // OS_OBJECT_USE_OBJC_RETAIN_RELEASE - -/*! - * @function xpc_get_type - * - * @abstract - * Returns the type of an object. - * - * @param object - * The object to examine. - * - * @result - * An opaque pointer describing the type of the object. This pointer is suitable - * direct comparison to exported type constants with the equality operator. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL_ALL XPC_WARN_RESULT -xpc_type_t -xpc_get_type(xpc_object_t object); - -/*! - * @function xpc_type_get_name - * - * @abstract - * Returns a string describing an XPC object type. - * - * @param type - * The type to describe. - * - * @result - * A string describing the type of an object, like "string" or "int64". - * This string should not be freed or modified. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_15, __IPHONE_13_0) -XPC_EXPORT XPC_NONNULL1 -const char * -xpc_type_get_name(xpc_type_t type); - -/*! - * @function xpc_copy - * - * @abstract - * Creates a copy of the object. - * - * @param object - * The object to copy. - * - * @result - * The new object. NULL if the object type does not support copying or if - * sufficient memory for the copy could not be allocated. Service objects do - * not support copying. - * - * @discussion - * When called on an array or dictionary, xpc_copy() will perform a deep copy. - * - * The object returned is not necessarily guaranteed to be a new object, and - * whether it is will depend on the implementation of the object being copied. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL_ALL XPC_WARN_RESULT XPC_RETURNS_RETAINED -xpc_object_t _Nullable -xpc_copy(xpc_object_t object); - -/*! - * @function xpc_equal - * - * @abstract - * Compares two objects for equality. - * - * @param object1 - * The first object to compare. - * - * @param object2 - * The second object to compare. - * - * @result - * Returns true if the objects are equal, otherwise false. Two objects must be - * of the same type in order to be equal. - * - * For two arrays to be equal, they must contain the same values at the - * same indexes. For two dictionaries to be equal, they must contain the same - * values for the same keys. - * - * Two objects being equal implies that their hashes (as returned by xpc_hash()) - * are also equal. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 XPC_NONNULL2 XPC_WARN_RESULT -bool -xpc_equal(xpc_object_t object1, xpc_object_t object2); - -/*! - * @function xpc_hash - * - * @abstract - * Calculates a hash value for the given object. - * - * @param object - * The object for which to calculate a hash value. This value may be modded - * with a table size for insertion into a dictionary-like data structure. - * - * @result - * The calculated hash value. - * - * @discussion - * Note that the computed hash values for any particular type and value of an - * object can change from across releases and platforms and should not be - * assumed to be constant across all time and space or stored persistently. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 XPC_WARN_RESULT -size_t -xpc_hash(xpc_object_t object); - -/*! - * @function xpc_copy_description - * - * @abstract - * Copies a debug string describing the object. - * - * @param object - * The object which is to be examined. - * - * @result - * A string describing object which contains information useful for debugging. - * This string should be disposed of with free(3) when done. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_MALLOC XPC_WARN_RESULT XPC_NONNULL1 -char * -xpc_copy_description(xpc_object_t object); - -#pragma mark XPC Object Types -#pragma mark Null -/*! - * @function xpc_null_create - * - * @abstract - * Creates an XPC object representing the null object. - * - * @result - * A new null object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_RETURNS_RETAINED XPC_WARN_RESULT -xpc_object_t -xpc_null_create(void); - -#pragma mark Boolean -/*! - * @function xpc_bool_create - * - * @abstract - * Creates an XPC Boolean object. - * - * @param value - * The Boolean primitive value which is to be boxed. - * - * @result - * A new Boolean object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_RETURNS_RETAINED XPC_WARN_RESULT -xpc_object_t -xpc_bool_create(bool value); - -/*! - * @function xpc_bool_get_value - * - * @abstract - * Returns the underlying Boolean value from the object. - * - * @param xbool - * The Boolean object which is to be examined. - * - * @result - * The underlying Boolean value or false if the given object was not an XPC - * Boolean object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT -bool -xpc_bool_get_value(xpc_object_t xbool); - -#pragma mark Signed Integer -/*! - * @function xpc_int64_create - * - * @abstract - * Creates an XPC signed integer object. - * - * @param value - * The signed integer value which is to be boxed. - * - * @result - * A new signed integer object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_MALLOC XPC_RETURNS_RETAINED XPC_WARN_RESULT -xpc_object_t -xpc_int64_create(int64_t value); - -/*! - * @function xpc_int64_get_value - * - * @abstract - * Returns the underlying signed 64-bit integer value from an object. - * - * @param xint - * The signed integer object which is to be examined. - * - * @result - * The underlying signed 64-bit value or 0 if the given object was not an XPC - * integer object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL1 -int64_t -xpc_int64_get_value(xpc_object_t xint); - -#pragma mark Unsigned Integer -/*! - * @function xpc_uint64_create - * - * @abstract - * Creates an XPC unsigned integer object. - * - * @param value - * The unsigned integer value which is to be boxed. - * - * @result - * A new unsigned integer object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_MALLOC XPC_RETURNS_RETAINED XPC_WARN_RESULT -xpc_object_t -xpc_uint64_create(uint64_t value); - -/*! - * @function xpc_uint64_get_value - * - * @abstract - * Returns the underlying unsigned 64-bit integer value from an object. - * - * @param xuint - * The unsigned integer object which is to be examined. - * - * @result - * The underlying unsigned integer value or 0 if the given object was not an XPC - * unsigned integer object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL1 -uint64_t -xpc_uint64_get_value(xpc_object_t xuint); - -#pragma mark Double -/*! - * @function xpc_double_create - * - * @abstract - * Creates an XPC double object. - * - * @param value - * The floating point quantity which is to be boxed. - * - * @result - * A new floating point object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_MALLOC XPC_RETURNS_RETAINED XPC_WARN_RESULT -xpc_object_t -xpc_double_create(double value); - -/*! - * @function xpc_double_get_value - * - * @abstract - * Returns the underlying double-precision floating point value from an object. - * - * @param xdouble - * The floating point object which is to be examined. - * - * @result - * The underlying floating point value or NAN if the given object was not an XPC - * floating point object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL1 -double -xpc_double_get_value(xpc_object_t xdouble); - -#pragma mark Date -/*! - * @function xpc_date_create - * - * @abstract - * Creates an XPC date object. - * - * @param interval - * The date interval which is to be boxed. Negative values indicate the number - * of nanoseconds before the epoch. Positive values indicate the number of - * nanoseconds after the epoch. - * - * @result - * A new date object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_MALLOC XPC_RETURNS_RETAINED XPC_WARN_RESULT -xpc_object_t -xpc_date_create(int64_t interval); - -/*! - * @function xpc_date_create_from_current - * - * @abstract - * Creates an XPC date object representing the current date. - * - * @result - * A new date object representing the current date. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_MALLOC XPC_RETURNS_RETAINED XPC_WARN_RESULT -xpc_object_t -xpc_date_create_from_current(void); - -/*! - * @function xpc_date_get_value - * - * @abstract - * Returns the underlying date interval from an object. - * - * @param xdate - * The date object which is to be examined. - * - * @result - * The underlying date interval or 0 if the given object was not an XPC date - * object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL1 -int64_t -xpc_date_get_value(xpc_object_t xdate); - -#pragma mark Data -/*! - * @function xpc_data_create - * - * @abstract - * Creates an XPC object representing buffer of bytes. - * - * @param bytes - * The buffer of bytes which is to be boxed. You may create an empty data object - * by passing NULL for this parameter and 0 for the length. Passing NULL with - * any other length will result in undefined behavior. - * - * @param length - * The number of bytes which are to be boxed. - * - * @result - * A new data object. - * - * @discussion - * This method will copy the buffer given into internal storage. After calling - * this method, it is safe to dispose of the given buffer. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_MALLOC XPC_RETURNS_RETAINED XPC_WARN_RESULT -xpc_object_t -xpc_data_create(const void * _Nullable bytes, size_t length); - -/*! - * @function xpc_data_create_with_dispatch_data - * - * @abstract - * Creates an XPC object representing buffer of bytes described by the given GCD - * data object. - * - * @param ddata - * The GCD data object containing the bytes which are to be boxed. This object - * is retained by the data object. - * - * @result - * A new data object. - * - * @discussion - * The object returned by this method will refer to the buffer returned by - * dispatch_data_create_map(). The point where XPC will make the call to - * dispatch_data_create_map() is undefined. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_MALLOC XPC_RETURNS_RETAINED XPC_WARN_RESULT XPC_NONNULL1 -xpc_object_t -xpc_data_create_with_dispatch_data(dispatch_data_t ddata); - -/*! - * @function xpc_data_get_length - * - * @abstract - * Returns the length of the data encapsulated by an XPC data object. - * - * @param xdata - * The data object which is to be examined. - * - * @result - * The length of the underlying boxed data or 0 if the given object was not an - * XPC data object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL1 -size_t -xpc_data_get_length(xpc_object_t xdata); - -/*! - * @function xpc_data_get_bytes_ptr - * - * @abstract - * Returns a pointer to the internal storage of a data object. - * - * @param xdata - * The data object which is to be examined. - * - * @result - * A pointer to the underlying boxed data or NULL if the given object was not an - * XPC data object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL1 -const void * _Nullable -xpc_data_get_bytes_ptr(xpc_object_t xdata); - -/*! - * @function xpc_data_get_bytes - * - * @abstract - * Copies the bytes stored in an data objects into the specified buffer. - * - * @param xdata - * The data object which is to be examined. - * - * @param buffer - * The buffer in which to copy the data object's bytes. - * - * @param off - * The offset at which to begin the copy. If this offset is greater than the - * length of the data element, nothing is copied. Pass 0 to start the copy - * at the beginning of the buffer. - * - * @param length - * The length of the destination buffer. - * - * @result - * The number of bytes that were copied into the buffer or 0 if the given object - * was not an XPC data object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL1 XPC_NONNULL2 -size_t -xpc_data_get_bytes(xpc_object_t xdata, - void *buffer, size_t off, size_t length); - -#pragma mark String -/*! - * @function xpc_string_create - * - * @abstract - * Creates an XPC object representing a NUL-terminated C-string. - * - * @param string - * The C-string which is to be boxed. - * - * @result - * A new string object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_MALLOC XPC_RETURNS_RETAINED XPC_WARN_RESULT XPC_NONNULL1 -xpc_object_t -xpc_string_create(const char *string); - -/*! - * @function xpc_string_create_with_format - * - * @abstract - * Creates an XPC object representing a C-string that is generated from the - * given format string and arguments. - * - * @param fmt - * The printf(3)-style format string from which to construct the final C-string - * to be boxed. - * - * @param ... - * The arguments which correspond to those specified in the format string. - * - * @result - * A new string object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_MALLOC XPC_RETURNS_RETAINED XPC_WARN_RESULT XPC_NONNULL1 -XPC_PRINTF(1, 2) -xpc_object_t -xpc_string_create_with_format(const char *fmt, ...); - -/*! - * @function xpc_string_create_with_format_and_arguments - * - * @abstract - * Creates an XPC object representing a C-string that is generated from the - * given format string and argument list pointer. - * - * @param fmt - * The printf(3)-style format string from which to construct the final C-string - * to be boxed. - * - * @param ap - * A pointer to the arguments which correspond to those specified in the format - * string. - * - * @result - * A new string object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_MALLOC XPC_RETURNS_RETAINED XPC_WARN_RESULT XPC_NONNULL1 -XPC_PRINTF(1, 0) -xpc_object_t -xpc_string_create_with_format_and_arguments(const char *fmt, va_list ap); - -/*! - * @function xpc_string_get_length - * - * @abstract - * Returns the length of the underlying string. - * - * @param xstring - * The string object which is to be examined. - * - * @result - * The length of the underlying string, not including the NUL-terminator, or 0 - * if the given object was not an XPC string object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL_ALL -size_t -xpc_string_get_length(xpc_object_t xstring); - -/*! - * @function xpc_string_get_string_ptr - * - * @abstract - * Returns a pointer to the internal storage of a string object. - * - * @param xstring - * The string object which is to be examined. - * - * @result - * A pointer to the string object's internal storage or NULL if the given object - * was not an XPC string object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL1 -const char * _Nullable -xpc_string_get_string_ptr(xpc_object_t xstring); - -#pragma mark UUID -/*! - * @function xpc_uuid_create - * - * @abstract - * Creates an XPC object representing a universally-unique identifier (UUID) as - * described by uuid(3). - * - * @param uuid - * The UUID which is to be boxed. - * - * @result - * A new UUID object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_MALLOC XPC_RETURNS_RETAINED XPC_WARN_RESULT XPC_NONNULL1 -xpc_object_t -xpc_uuid_create(const uuid_t XPC_NONNULL_ARRAY uuid); - -/*! - * @function xpc_uuid_get_bytes - * - * @abstract - * Returns a pointer to the the boxed UUID bytes in an XPC UUID object. - * - * @param xuuid - * The UUID object which is to be examined. - * - * @result - * The underlying uuid_t bytes or NULL if the given object was not - * an XPC UUID object. The returned pointer may be safely passed to the uuid(3) - * APIs. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 -const uint8_t * _Nullable -xpc_uuid_get_bytes(xpc_object_t xuuid); - -#pragma mark File Descriptors -/*! - * @function xpc_fd_create - * - * @abstract - * Creates an XPC object representing a POSIX file descriptor. - * - * @param fd - * The file descriptor which is to be boxed. - * - * @result - * A new file descriptor object. NULL if sufficient memory could not be - * allocated or if the given file descriptor was not valid. - * - * @discussion - * This method performs the equivalent of a dup(2) on the descriptor, and thus - * it is safe to call close(2) on the descriptor after boxing it with a file - * descriptor object. - * - * IMPORTANT: Pointer equality is the ONLY valid test for equality between two - * file descriptor objects. There is no reliable way to determine whether two - * file descriptors refer to the same inode with the same capabilities, so two - * file descriptor objects created from the same underlying file descriptor - * number will not compare equally with xpc_equal(). This is also true of a - * file descriptor object created using xpc_copy() and the original. - * - * This also implies that two collections containing file descriptor objects - * cannot be equal unless the exact same object was inserted into both. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_MALLOC XPC_RETURNS_RETAINED XPC_WARN_RESULT -xpc_object_t _Nullable -xpc_fd_create(int fd); - -/*! - * @function xpc_fd_dup - * - * @abstract - * Returns a file descriptor that is equivalent to the one boxed by the file - * file descriptor object. - * - * @param xfd - * The file descriptor object which is to be examined. - * - * @result - * A file descriptor that is equivalent to the one originally given to - * xpc_fd_create(). If the descriptor could not be created or if the given - * object was not an XPC file descriptor, -1 is returned. - * - * @discussion - * Multiple invocations of xpc_fd_dup() will not return the same file descriptor - * number, but they will return descriptors that are equivalent, as though they - * had been created by dup(2). - * - * The caller is responsible for calling close(2) on the returned descriptor. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL1 -int -xpc_fd_dup(xpc_object_t xfd); - -#pragma mark Shared Memory -/*! - * @function xpc_shmem_create - * - * @abstract - * Creates an XPC object representing the given shared memory region. - * - * @param region - * A pointer to a region of shared memory, created through a call to mmap(2) - * with the MAP_SHARED flag, which is to be boxed. - * - * @param length - * The length of the region. - * - * @result - * A new shared memory object. - * - * @discussion - * Only memory regions whose exact characteristics are known to the caller - * should be boxed using this API. Memory returned from malloc(3) may not be - * safely shared on either OS X or iOS because the underlying virtual memory - * objects for malloc(3)ed allocations are owned by the malloc(3) subsystem and - * not the caller of malloc(3). - * - * If you wish to share a memory region that you receive from another subsystem, - * part of the interface contract with that other subsystem must include how to - * create the region of memory, or sharing it may be unsafe. - * - * Certain operations may internally fragment a region of memory in a way that - * would truncate the range detected by the shared memory object. vm_copy(), for - * example, may split the region into multiple parts to avoid copying certain - * page ranges. For this reason, it is recommended that you delay all VM - * operations until the shared memory object has been created so that the VM - * system knows that the entire range is intended for sharing. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_MALLOC XPC_RETURNS_RETAINED XPC_WARN_RESULT XPC_NONNULL1 -xpc_object_t -xpc_shmem_create(void *region, size_t length); - -/*! - * @function xpc_shmem_map - * - * @abstract - * Maps the region boxed by the XPC shared memory object into the caller's - * address space. - * - * @param xshmem - * The shared memory object to be examined. - * - * @param region - * On return, this will point to the region at which the shared memory was - * mapped. - * - * @result - * The length of the region that was mapped. If the mapping failed or if the - * given object was not an XPC shared memory object, 0 is returned. The length - * of the mapped region will always be an integral page size, even if the - * creator of the region specified a non-integral page size. - * - * @discussion - * The resulting region must be disposed of with munmap(2). - * - * It is the responsibility of the caller to manage protections on the new - * region accordingly. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL_ALL -size_t -xpc_shmem_map(xpc_object_t xshmem, void * _Nullable * _Nonnull region); - -#pragma mark Array -/*! - * @typedef xpc_array_applier_t - * A block to be invoked for every value in the array. - * - * @param index - * The current index in the iteration. - * - * @param value - * The current value in the iteration. - * - * @result - * A Boolean indicating whether iteration should continue. - */ -#ifdef __BLOCKS__ -typedef bool (^xpc_array_applier_t)(size_t index, xpc_object_t _Nonnull value); -#endif // __BLOCKS__ - -/*! - * @function xpc_array_create - * - * @abstract - * Creates an XPC object representing an array of XPC objects. - * - * @discussion - * This array must be contiguous and cannot contain any NULL values. If you - * wish to insert the equivalent of a NULL value, you may use the result of - * {@link xpc_null_create}. - * - * @param objects - * An array of XPC objects which is to be boxed. The order of this array is - * preserved in the object. If this array contains a NULL value, the behavior - * is undefined. This parameter may be NULL only if the count is 0. - * - * @param count - * The number of objects in the given array. If the number passed is less than - * the actual number of values in the array, only the specified number of items - * are inserted into the resulting array. If the number passed is more than - * the the actual number of values, the behavior is undefined. - * - * @result - * A new array object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_MALLOC XPC_RETURNS_RETAINED XPC_WARN_RESULT -xpc_object_t -xpc_array_create(const xpc_object_t _Nonnull * _Nullable objects, size_t count); - -/*! - * @function xpc_array_set_value - * - * @abstract - * Inserts the specified object into the array at the specified index. - * - * @param xarray - * The array object which is to be manipulated. - * - * @param index - * The index at which to insert the value. This value must lie within the index - * space of the array (0 to N-1 inclusive, where N is the count of the array). - * If the index is outside that range, the behavior is undefined. - * - * @param value - * The object to insert. This value is retained by the array and cannot be - * NULL. If there is already a value at the specified index, it is released, - * and the new value is inserted in its place. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 XPC_NONNULL3 -void -xpc_array_set_value(xpc_object_t xarray, size_t index, xpc_object_t value); - -/*! - * @function xpc_array_append_value - * - * @abstract - * Appends an object to an XPC array. - * - * @param xarray - * The array object which is to be manipulated. - * - * @param value - * The object to append. This object is retained by the array. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 XPC_NONNULL2 -void -xpc_array_append_value(xpc_object_t xarray, xpc_object_t value); - -/*! - * @function xpc_array_get_count - * - * @abstract - * Returns the count of values currently in the array. - * - * @param xarray - * The array object which is to be examined. - * - * @result - * The count of values in the array or 0 if the given object was not an XPC - * array. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL1 -size_t -xpc_array_get_count(xpc_object_t xarray); - -/*! - * @function xpc_array_get_value - * - * @abstract - * Returns the value at the specified index in the array. - * - * @param xarray - * The array object which is to be examined. - * - * @param index - * The index of the value to obtain. This value must lie within the range of - * indexes as specified in xpc_array_set_value(). - * - * @result - * The object at the specified index within the array or NULL if the given - * object was not an XPC array. - * - * @discussion - * This method does not grant the caller a reference to the underlying object, - * and thus the caller is not responsible for releasing the object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL_ALL -xpc_object_t -xpc_array_get_value(xpc_object_t xarray, size_t index); - -/*! - * @function xpc_array_apply - * - * @abstract - * Invokes the given block for every value in the array. - * - * @param xarray - * The array object which is to be examined. - * - * @param applier - * The block which this function applies to every element in the array. - * - * @result - * A Boolean indicating whether iteration of the array completed successfully. - * Iteration will only fail if the applier block returns false. - * - * @discussion - * You should not modify an array's contents during iteration. The array indexes - * are iterated in order. - */ -#ifdef __BLOCKS__ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL_ALL -bool -xpc_array_apply(xpc_object_t xarray, XPC_NOESCAPE xpc_array_applier_t applier); -#endif // __BLOCKS__ - -#pragma mark Array Primitive Setters -/*! - * @define XPC_ARRAY_APPEND - * A constant that may be passed as the destination index to the class of - * primitive XPC array setters indicating that the given primitive should be - * appended to the array. - */ -#define XPC_ARRAY_APPEND ((size_t)(-1)) - -/*! - * @function xpc_array_set_bool - * - * @abstract - * Inserts a bool (primitive) value into an array. - * - * @param xarray - * The array object which is to be manipulated. - * - * @param index - * The index at which to insert the value. This value must lie within the index - * space of the array (0 to N-1 inclusive, where N is the count of the array) or - * be XPC_ARRAY_APPEND. If the index is outside that range, the behavior is - * undefined. - * - * @param value - * The bool value to insert. After calling this method, the XPC - * object corresponding to the primitive value inserted may be safely retrieved - * with {@link xpc_array_get_value()}. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 -void -xpc_array_set_bool(xpc_object_t xarray, size_t index, bool value); - -/*! - * @function xpc_array_set_int64 - * - * @abstract - * Inserts an int64_t (primitive) value into an array. - * - * @param xarray - * The array object which is to be manipulated. - * - * @param index - * The index at which to insert the value. This value must lie within the index - * space of the array (0 to N-1 inclusive, where N is the count of the array) or - * be XPC_ARRAY_APPEND. If the index is outside that range, the behavior is - * undefined. - * - * @param value - * The int64_t value to insert. After calling this method, the XPC - * object corresponding to the primitive value inserted may be safely retrieved - * with {@link xpc_array_get_value()}. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 -void -xpc_array_set_int64(xpc_object_t xarray, size_t index, int64_t value); - -/*! - * @function xpc_array_set_uint64 - * - * @abstract - * Inserts a uint64_t (primitive) value into an array. - * - * @param xarray - * The array object which is to be manipulated. - * - * @param index - * The index at which to insert the value. This value must lie within the index - * space of the array (0 to N-1 inclusive, where N is the count of the array) or - * be XPC_ARRAY_APPEND. If the index is outside that range, the behavior is - * undefined. - * - * @param value - * The uint64_t value to insert. After calling this method, the XPC - * object corresponding to the primitive value inserted may be safely retrieved - * with {@link xpc_array_get_value()}. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 -void -xpc_array_set_uint64(xpc_object_t xarray, size_t index, uint64_t value); - -/*! - * @function xpc_array_set_double - * - * @abstract - * Inserts a double (primitive) value into an array. - * - * @param xarray - * The array object which is to be manipulated. - * - * @param index - * The index at which to insert the value. This value must lie within the index - * space of the array (0 to N-1 inclusive, where N is the count of the array) or - * be XPC_ARRAY_APPEND. If the index is outside that range, the behavior is - * undefined. - * - * @param value - * The double value to insert. After calling this method, the XPC - * object corresponding to the primitive value inserted may be safely retrieved - * with {@link xpc_array_get_value()}. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 -void -xpc_array_set_double(xpc_object_t xarray, size_t index, double value); - -/*! - * @function xpc_array_set_date - * - * @abstract - * Inserts a date value into an array. - * - * @param xarray - * The array object which is to be manipulated. - * - * @param index - * The index at which to insert the value. This value must lie within the index - * space of the array (0 to N-1 inclusive, where N is the count of the array) or - * be XPC_ARRAY_APPEND. If the index is outside that range, the behavior is - * undefined. - * - * @param value - * The date value to insert, represented as an int64_t. After - * calling this method, the XPC object corresponding to the primitive value - * inserted may be safely retrieved with {@link xpc_array_get_value()}. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 -void -xpc_array_set_date(xpc_object_t xarray, size_t index, int64_t value); - -/*! - * @function xpc_array_set_data - * - * @abstract - * Inserts a raw data value into an array. - * - * @param xarray - * The array object which is to be manipulated. - * - * @param index - * The index at which to insert the value. This value must lie within the index - * space of the array (0 to N-1 inclusive, where N is the count of the array) or - * be XPC_ARRAY_APPEND. If the index is outside that range, the behavior is - * undefined. - * - * @param bytes - * The raw data to insert. After calling this method, the XPC object - * corresponding to the primitive value inserted may be safely retrieved with - * {@link xpc_array_get_value()}. - * - * @param length - * The length of the data. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 XPC_NONNULL3 -void -xpc_array_set_data(xpc_object_t xarray, size_t index, const void *bytes, - size_t length); - -/*! - * @function xpc_array_set_string - * - * @abstract - * Inserts a C string into an array. - * - * @param xarray - * The array object which is to be manipulated. - * - * @param index - * The index at which to insert the value. This value must lie within the index - * space of the array (0 to N-1 inclusive, where N is the count of the array) or - * be XPC_ARRAY_APPEND. If the index is outside that range, the behavior is - * undefined. - * - * @param string - * The C string to insert. After calling this method, the XPC object - * corresponding to the primitive value inserted may be safely retrieved with - * {@link xpc_array_get_value()}. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 XPC_NONNULL3 -void -xpc_array_set_string(xpc_object_t xarray, size_t index, const char *string); - -/*! - * @function xpc_array_set_uuid - * - * @abstract - * Inserts a uuid_t (primitive) value into an array. - * - * @param xarray - * The array object which is to be manipulated. - * - * @param index - * The index at which to insert the value. This value must lie within the index - * space of the array (0 to N-1 inclusive, where N is the count of the array) or - * be XPC_ARRAY_APPEND. If the index is outside that range, the behavior is - * undefined. - * - * @param uuid - * The UUID primitive to insert. After calling this method, the XPC object - * corresponding to the primitive value inserted may be safely retrieved with - * {@link xpc_array_get_value()}. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 XPC_NONNULL3 -void -xpc_array_set_uuid(xpc_object_t xarray, size_t index, - const uuid_t XPC_NONNULL_ARRAY uuid); - -/*! - * @function xpc_array_set_fd - * - * @abstract - * Inserts a file descriptor into an array. - * - * @param xarray - * The array object which is to be manipulated. - * - * @param index - * The index at which to insert the value. This value must lie within the index - * space of the array (0 to N-1 inclusive, where N is the count of the array) or - * be XPC_ARRAY_APPEND. If the index is outside that range, the behavior is - * undefined. - * - * @param fd - * The file descriptor to insert. After calling this method, the XPC object - * corresponding to the primitive value inserted may be safely retrieved with - * {@link xpc_array_get_value()}. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 -void -xpc_array_set_fd(xpc_object_t xarray, size_t index, int fd); - -/*! - * @function xpc_array_set_connection - * - * @abstract - * Inserts a connection into an array. - * - * @param xarray - * The array object which is to be manipulated. - * - * @param index - * The index at which to insert the value. This value must lie within the index - * space of the array (0 to N-1 inclusive, where N is the count of the array) or - * be XPC_ARRAY_APPEND. If the index is outside that range, the behavior is - * undefined. - * - * @param connection - * The connection to insert. After calling this method, the XPC object - * corresponding to the primitive value inserted may be safely retrieved with - * {@link xpc_array_get_value()}. The connection is NOT retained by the array. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 XPC_NONNULL3 -void -xpc_array_set_connection(xpc_object_t xarray, size_t index, - xpc_connection_t connection); - -#pragma mark Array Primitive Getters -/*! - * @function xpc_array_get_bool - * - * @abstract - * Gets a bool primitive value from an array directly. - * - * @param xarray - * The array which is to be examined. - * - * @param index - * The index of the value to obtain. This value must lie within the index space - * of the array (0 to N-1 inclusive, where N is the count of the array). If the - * index is outside that range, the behavior is undefined. - * - * @result - * The underlying bool value at the specified index. false if the - * value at the specified index is not a Boolean value. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL1 -bool -xpc_array_get_bool(xpc_object_t xarray, size_t index); - -/*! - * @function xpc_array_get_int64 - * - * @abstract - * Gets an int64_t primitive value from an array directly. - * - * @param xarray - * The array which is to be examined. - * - * @param index - * The index of the value to obtain. This value must lie within the index space - * of the array (0 to N-1 inclusive, where N is the count of the array). If the - * index is outside that range, the behavior is undefined. - * - * @result - * The underlying int64_t value at the specified index. 0 if the - * value at the specified index is not a signed integer value. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL1 -int64_t -xpc_array_get_int64(xpc_object_t xarray, size_t index); - -/*! - * @function xpc_array_get_uint64 - * - * @abstract - * Gets a uint64_t primitive value from an array directly. - * - * @param xarray - * The array which is to be examined. - * - * @param index - * The index of the value to obtain. This value must lie within the index space - * of the array (0 to N-1 inclusive, where N is the count of the array). If the - * index is outside that range, the behavior is undefined. - * - * @result - * The underlying uint64_t value at the specified index. 0 if the - * value at the specified index is not an unsigned integer value. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL1 -uint64_t -xpc_array_get_uint64(xpc_object_t xarray, size_t index); - -/*! - * @function xpc_array_get_double - * - * @abstract - * Gets a double primitive value from an array directly. - * - * @param xarray - * The array which is to be examined. - * - * @param index - * The index of the value to obtain. This value must lie within the index space - * of the array (0 to N-1 inclusive, where N is the count of the array). If the - * index is outside that range, the behavior is undefined. - * - * @result - * The underlying double value at the specified index. NAN if the - * value at the specified index is not a floating point value. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL1 -double -xpc_array_get_double(xpc_object_t xarray, size_t index); - -/*! - * @function xpc_array_get_date - * - * @abstract - * Gets a date interval from an array directly. - * - * @param xarray - * The array which is to be examined. - * - * @param index - * The index of the value to obtain. This value must lie within the index space - * of the array (0 to N-1 inclusive, where N is the count of the array). If the - * index is outside that range, the behavior is undefined. - * - * @result - * The underlying date interval at the specified index. 0 if the value at the - * specified index is not a date value. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL1 -int64_t -xpc_array_get_date(xpc_object_t xarray, size_t index); - -/*! - * @function xpc_array_get_data - * - * @abstract - * Gets a pointer to the raw bytes of a data object from an array directly. - * - * @param xarray - * The array which is to be examined. - * - * @param index - * The index of the value to obtain. This value must lie within the index space - * of the array (0 to N-1 inclusive, where N is the count of the array). If the - * index is outside that range, the behavior is undefined. - * - * @param length - * Upon return output, will contain the length of the data corresponding to the - * specified key. - * - * @result - * The underlying bytes at the specified index. NULL if the value at the - * specified index is not a data value. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL1 -const void * _Nullable -xpc_array_get_data(xpc_object_t xarray, size_t index, - size_t * _Nullable length); - -/*! - * @function xpc_array_get_string - * - * @abstract - * Gets a C string value from an array directly. - * - * @param xarray - * The array which is to be examined. - * - * @param index - * The index of the value to obtain. This value must lie within the index space - * of the array (0 to N-1 inclusive, where N is the count of the array). If the - * index is outside that range, the behavior is undefined. - * - * @result - * The underlying C string at the specified index. NULL if the value at the - * specified index is not a C string value. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL1 -const char * _Nullable -xpc_array_get_string(xpc_object_t xarray, size_t index); - -/*! - * @function xpc_array_get_uuid - * - * @abstract - * Gets a uuid_t value from an array directly. - * - * @param xarray - * The array which is to be examined. - * - * @param index - * The index of the value to obtain. This value must lie within the index space - * of the array (0 to N-1 inclusive, where N is the count of the array). If the - * index is outside that range, the behavior is undefined. - * - * @result - * The underlying uuid_t value at the specified index. The null - * UUID if the value at the specified index is not a UUID value. The returned - * pointer may be safely passed to the uuid(3) APIs. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL1 -const uint8_t * _Nullable -xpc_array_get_uuid(xpc_object_t xarray, size_t index); - -/*! - * @function xpc_array_dup_fd - * - * @abstract - * Gets a file descriptor from an array directly. - * - * @param xarray - * The array which is to be examined. - * - * @param index - * The index of the value to obtain. This value must lie within the index space - * of the array (0 to N-1 inclusive, where N is the count of the array). If the - * index is outside that range, the behavior is undefined. - * - * @result - * A new file descriptor created from the value at the specified index. You are - * responsible for close(2)ing this descriptor. -1 if the value at the specified - * index is not a file descriptor value. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL1 -int -xpc_array_dup_fd(xpc_object_t xarray, size_t index); - -/*! - * @function xpc_array_create_connection - * - * @abstract - * Creates a connection object from an array directly. - * - * @param xarray - * The array which is to be examined. - * - * @param index - * The index of the value to obtain. This value must lie within the index space - * of the array (0 to N-1 inclusive, where N is the count of the array). If the - * index is outside that range, the behavior is undefined. - * - * @result - * A new connection created from the value at the specified index. You are - * responsible for calling xpc_release() on the returned connection. NULL if the - * value at the specified index is not an endpoint containing a connection. Each - * call to this method for the same index in the same array will yield a - * different connection. See {@link xpc_connection_create_from_endpoint()} for - * discussion as to the responsibilities when dealing with the returned - * connection. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_MALLOC XPC_RETURNS_RETAINED XPC_WARN_RESULT XPC_NONNULL1 -xpc_connection_t _Nullable -xpc_array_create_connection(xpc_object_t xarray, size_t index); - -/*! - * @function xpc_array_get_dictionary - * - * @abstract - * Returns the dictionary at the specified index in the array. - * - * @param xarray - * The array object which is to be examined. - * - * @param index - * The index of the value to obtain. This value must lie within the range of - * indexes as specified in xpc_array_set_value(). - * - * @result - * The object at the specified index within the array or NULL if the given - * object was not an XPC array or if the the value at the specified index was - * not a dictionary. - * - * @discussion - * This method does not grant the caller a reference to the underlying object, - * and thus the caller is not responsible for releasing the object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_11, __IPHONE_9_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL_ALL -xpc_object_t _Nullable -xpc_array_get_dictionary(xpc_object_t xarray, size_t index); - -/*! - * @function xpc_array_get_array - * - * @abstract - * Returns the array at the specified index in the array. - * - * @param xarray - * The array object which is to be examined. - * - * @param index - * The index of the value to obtain. This value must lie within the range of - * indexes as specified in xpc_array_set_value(). - * - * @result - * The object at the specified index within the array or NULL if the given - * object was not an XPC array or if the the value at the specified index was - * not an array. - * - * @discussion - * This method does not grant the caller a reference to the underlying object, - * and thus the caller is not responsible for releasing the object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_11, __IPHONE_9_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL_ALL -xpc_object_t _Nullable -xpc_array_get_array(xpc_object_t xarray, size_t index); - -#pragma mark Dictionary -/*! - * @typedef xpc_dictionary_applier_t - * A block to be invoked for every key/value pair in the dictionary. - * - * @param key - * The current key in the iteration. - * - * @param value - * The current value in the iteration. - * - * @result - * A Boolean indicating whether iteration should continue. - */ -#ifdef __BLOCKS__ -typedef bool (^xpc_dictionary_applier_t)(const char * _Nonnull key, - xpc_object_t _Nonnull value); -#endif // __BLOCKS__ - -/*! - * @function xpc_dictionary_create - * - * @abstract - * Creates an XPC object representing a dictionary of XPC objects keyed to - * C-strings. - * - * @param keys - * An array of C-strings that are to be the keys for the values to be inserted. - * Each element of this array is copied into the dictionary's internal storage. - * Elements of this array may NOT be NULL. - * - * @param values - * A C-array that is parallel to the array of keys, consisting of objects that - * are to be inserted. Each element in this array is retained. Elements in this - * array may be NULL. - * - * @param count - * The number of key/value pairs in the given arrays. If the count is less than - * the actual count of values, only that many key/value pairs will be inserted - * into the dictionary. - * - * If the count is more than the the actual count of key/value pairs, the - * behavior is undefined. If one array is NULL and the other is not, the - * behavior is undefined. If both arrays are NULL and the count is non-0, the - * behavior is undefined. - * - * @result - * The new dictionary object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_MALLOC XPC_RETURNS_RETAINED XPC_WARN_RESULT -xpc_object_t -xpc_dictionary_create(const char * _Nonnull const * _Nullable keys, - const xpc_object_t _Nullable * _Nullable values, size_t count); - -/*! - * @function xpc_dictionary_create_reply - * - * @abstract - * Creates a dictionary that is in reply to the given dictionary. - * - * @param original - * The original dictionary that is to be replied to. - * - * @result - * The new dictionary object. NULL if the object was not a dictionary with a - * reply context. - * - * @discussion - * After completing successfully on a dictionary, this method may not be called - * again on that same dictionary. Attempts to do so will return NULL. - * - * When this dictionary is sent across the reply connection, the remote end's - * reply handler is invoked. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_MALLOC XPC_RETURNS_RETAINED XPC_WARN_RESULT XPC_NONNULL_ALL -xpc_object_t _Nullable -xpc_dictionary_create_reply(xpc_object_t original); - -/*! - * @function xpc_dictionary_set_value - * - * @abstract - * Sets the value for the specified key to the specified object. - * - * @param xdict - * The dictionary object which is to be manipulated. - * - * @param key - * The key for which the value shall be set. - * - * @param value - * The object to insert. The object is retained by the dictionary. If there - * already exists a value for the specified key, the old value is released - * and overwritten by the new value. This parameter may be NULL, in which case - * the value corresponding to the specified key is deleted if present. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 XPC_NONNULL2 -void -xpc_dictionary_set_value(xpc_object_t xdict, const char *key, - xpc_object_t _Nullable value); - -/*! - * @function xpc_dictionary_get_value - * - * @abstract - * Returns the value for the specified key. - * - * @param xdict - * The dictionary object which is to be examined. - * - * @param key - * The key whose value is to be obtained. - * - * @result - * The object for the specified key within the dictionary. NULL if there is no - * value associated with the specified key or if the given object was not an - * XPC dictionary. - * - * @discussion - * This method does not grant the caller a reference to the underlying object, - * and thus the caller is not responsible for releasing the object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL1 XPC_NONNULL2 -xpc_object_t _Nullable -xpc_dictionary_get_value(xpc_object_t xdict, const char *key); - -/*! - * @function xpc_dictionary_get_count - * - * @abstract - * Returns the number of values stored in the dictionary. - * - * @param xdict - * The dictionary object which is to be examined. - * - * @result - * The number of values stored in the dictionary or 0 if the given object was - * not an XPC dictionary. Calling xpc_dictionary_set_value() with a non-NULL - * value will increment the count. Calling xpc_dictionary_set_value() with a - * NULL value will decrement the count. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL1 -size_t -xpc_dictionary_get_count(xpc_object_t xdict); - -/*! - * @function xpc_dictionary_apply - * - * @abstract - * Invokes the given block for every key/value pair in the dictionary. - * - * @param xdict - * The dictionary object which is to be examined. - * - * @param applier - * The block which this function applies to every key/value pair in the - * dictionary. - * - * @result - * A Boolean indicating whether iteration of the dictionary completed - * successfully. Iteration will only fail if the applier block returns false. - * - * @discussion - * You should not modify a dictionary's contents during iteration. There is no - * guaranteed order of iteration over dictionaries. - */ -#ifdef __BLOCKS__ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL_ALL -bool -xpc_dictionary_apply(xpc_object_t xdict, - XPC_NOESCAPE xpc_dictionary_applier_t applier); -#endif // __BLOCKS__ - -/*! - * @function xpc_dictionary_get_remote_connection - * - * @abstract - * Returns the connection from which the dictionary was received. - * - * @param xdict - * The dictionary object which is to be examined. - * - * @result - * If the dictionary was received by a connection event handler or a dictionary - * created through xpc_dictionary_create_reply(), a connection object over which - * a reply message can be sent is returned. For any other dictionary, NULL is - * returned. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL_ALL -xpc_connection_t _Nullable -xpc_dictionary_get_remote_connection(xpc_object_t xdict); - -#pragma mark Dictionary Primitive Setters -/*! - * @function xpc_dictionary_set_bool - * - * @abstract - * Inserts a bool (primitive) value into a dictionary. - * - * @param xdict - * The dictionary which is to be manipulated. - * - * @param key - * The key for which the primitive value shall be set. - * - * @param value - * The bool value to insert. After calling this method, the XPC - * object corresponding to the primitive value inserted may be safely retrieved - * with {@link xpc_dictionary_get_value()}. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 XPC_NONNULL2 -void -xpc_dictionary_set_bool(xpc_object_t xdict, const char *key, bool value); - -/*! - * @function xpc_dictionary_set_int64 - * - * @abstract - * Inserts an int64_t (primitive) value into a dictionary. - * - * @param xdict - * The dictionary which is to be manipulated. - * - * @param key - * The key for which the primitive value shall be set. - * - * @param value - * The int64_t value to insert. After calling this method, the XPC - * object corresponding to the primitive value inserted may be safely retrieved - * with {@link xpc_dictionary_get_value()}. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 XPC_NONNULL2 -void -xpc_dictionary_set_int64(xpc_object_t xdict, const char *key, int64_t value); - -/*! - * @function xpc_dictionary_set_uint64 - * - * @abstract - * Inserts a uint64_t (primitive) value into a dictionary. - * - * @param xdict - * The dictionary which is to be manipulated. - * - * @param key - * The key for which the primitive value shall be set. - * - * @param value - * The uint64_t value to insert. After calling this method, the XPC - * object corresponding to the primitive value inserted may be safely retrieved - * with {@link xpc_dictionary_get_value()}. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 XPC_NONNULL2 -void -xpc_dictionary_set_uint64(xpc_object_t xdict, const char *key, uint64_t value); - -/*! - * @function xpc_dictionary_set_double - * - * @abstract - * Inserts a double (primitive) value into a dictionary. - * - * @param xdict - * The dictionary which is to be manipulated. - * - * @param key - * The key for which the primitive value shall be set. - * - * @param value - * The double value to insert. After calling this method, the XPC - * object corresponding to the primitive value inserted may be safely retrieved - * with {@link xpc_dictionary_get_value()}. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 XPC_NONNULL2 -void -xpc_dictionary_set_double(xpc_object_t xdict, const char *key, double value); - -/*! - * @function xpc_dictionary_set_date - * - * @abstract - * Inserts a date (primitive) value into a dictionary. - * - * @param xdict - * The dictionary which is to be manipulated. - * - * @param key - * The key for which the primitive value shall be set. - * - * @param value - * The date value to insert. After calling this method, the XPC object - * corresponding to the primitive value inserted may be safely retrieved with - * {@link xpc_dictionary_get_value()}. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 XPC_NONNULL2 -void -xpc_dictionary_set_date(xpc_object_t xdict, const char *key, int64_t value); - -/*! - * @function xpc_dictionary_set_data - * - * @abstract - * Inserts a raw data value into a dictionary. - * - * @param xdict - * The dictionary which is to be manipulated. - * - * @param key - * The key for which the primitive value shall be set. - * - * @param bytes - * The bytes to insert. After calling this method, the XPC object corresponding - * to the primitive value inserted may be safely retrieved with - * {@link xpc_dictionary_get_value()}. - * - * @param length - * The length of the data. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 XPC_NONNULL2 XPC_NONNULL3 -void -xpc_dictionary_set_data(xpc_object_t xdict, const char *key, const void *bytes, - size_t length); - -/*! - * @function xpc_dictionary_set_string - * - * @abstract - * Inserts a C string value into a dictionary. - * - * @param xdict - * The dictionary which is to be manipulated. - * - * @param key - * The key for which the primitive value shall be set. - * - * @param string - * The C string to insert. After calling this method, the XPC object - * corresponding to the primitive value inserted may be safely retrieved with - * {@link xpc_dictionary_get_value()}. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 XPC_NONNULL2 XPC_NONNULL3 -void -xpc_dictionary_set_string(xpc_object_t xdict, const char *key, - const char *string); - -/*! - * @function xpc_dictionary_set_uuid - * - * @abstract - * Inserts a uuid (primitive) value into an array. - * - * @param xdict - * The dictionary which is to be manipulated. - * - * @param key - * The key for which the primitive value shall be set. - * - * @param uuid - * The uuid_t value to insert. After calling this method, the XPC - * object corresponding to the primitive value inserted may be safely retrieved - * with {@link xpc_dictionary_get_value()}. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 XPC_NONNULL2 XPC_NONNULL3 -void -xpc_dictionary_set_uuid(xpc_object_t xdict, const char *key, - const uuid_t XPC_NONNULL_ARRAY uuid); - -/*! - * @function xpc_dictionary_set_fd - * - * @abstract - * Inserts a file descriptor into a dictionary. - * - * @param xdict - * The dictionary which is to be manipulated. - * - * @param key - * The key for which the primitive value shall be set. - * - * @param fd - * The file descriptor to insert. After calling this method, the XPC object - * corresponding to the primitive value inserted may be safely retrieved - * with {@link xpc_dictionary_get_value()}. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 XPC_NONNULL2 -void -xpc_dictionary_set_fd(xpc_object_t xdict, const char *key, int fd); - -/*! - * @function xpc_dictionary_set_connection - * - * @abstract - * Inserts a connection into a dictionary. - * - * @param xdict - * The dictionary which is to be manipulated. - * - * @param key - * The key for which the primitive value shall be set. - * - * @param connection - * The connection to insert. After calling this method, the XPC object - * corresponding to the primitive value inserted may be safely retrieved - * with {@link xpc_dictionary_get_value()}. The connection is NOT retained by - * the dictionary. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 XPC_NONNULL2 XPC_NONNULL3 -void -xpc_dictionary_set_connection(xpc_object_t xdict, const char *key, - xpc_connection_t connection); - -#pragma mark Dictionary Primitive Getters -/*! - * @function xpc_dictionary_get_bool - * - * @abstract - * Gets a bool primitive value from a dictionary directly. - * - * @param xdict - * The dictionary object which is to be examined. - * - * @param key - * The key whose value is to be obtained. - * - * @result - * The underlying bool value for the specified key. false if the - * the value for the specified key is not a Boolean value or if there is no - * value for the specified key. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL_ALL -bool -xpc_dictionary_get_bool(xpc_object_t xdict, const char *key); - -/*! - * @function xpc_dictionary_get_int64 - * - * @abstract - * Gets an int64 primitive value from a dictionary directly. - * - * @param xdict - * The dictionary object which is to be examined. - * - * @param key - * The key whose value is to be obtained. - * - * @result - * The underlying int64_t value for the specified key. 0 if the - * value for the specified key is not a signed integer value or if there is no - * value for the specified key. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL_ALL -int64_t -xpc_dictionary_get_int64(xpc_object_t xdict, const char *key); - -/*! - * @function xpc_dictionary_get_uint64 - * - * @abstract - * Gets a uint64 primitive value from a dictionary directly. - * - * @param xdict - * The dictionary object which is to be examined. - * - * @param key - * The key whose value is to be obtained. - * - * @result - * The underlying uint64_t value for the specified key. 0 if the - * value for the specified key is not an unsigned integer value or if there is - * no value for the specified key. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL_ALL -uint64_t -xpc_dictionary_get_uint64(xpc_object_t xdict, const char *key); - -/*! - * @function xpc_dictionary_get_double - * - * @abstract - * Gets a double primitive value from a dictionary directly. - * - * @param xdict - * The dictionary object which is to be examined. - * - * @param key - * The key whose value is to be obtained. - * - * @result - * The underlying double value for the specified key. NAN if the - * value for the specified key is not a floating point value or if there is no - * value for the specified key. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL_ALL -double -xpc_dictionary_get_double(xpc_object_t xdict, const char *key); - -/*! - * @function xpc_dictionary_get_date - * - * @abstract - * Gets a date value from a dictionary directly. - * - * @param xdict - * The dictionary object which is to be examined. - * - * @param key - * The key whose value is to be obtained. - * - * @result - * The underlying date interval for the specified key. 0 if the value for the - * specified key is not a date value or if there is no value for the specified - * key. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL_ALL -int64_t -xpc_dictionary_get_date(xpc_object_t xdict, const char *key); - -/*! - * @function xpc_dictionary_get_data - * - * @abstract - * Gets a raw data value from a dictionary directly. - * - * @param xdict - * The dictionary object which is to be examined. - * - * @param key - * The key whose value is to be obtained. - * - * @param length - * For the data type, the third parameter, upon output, will contain the length - * of the data corresponding to the specified key. May be NULL. - * - * @result - * The underlying raw data for the specified key. NULL if the value for the - * specified key is not a data value or if there is no value for the specified - * key. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL1 -const void * _Nullable -xpc_dictionary_get_data(xpc_object_t xdict, const char *key, - size_t * _Nullable length); - -/*! - * @function xpc_dictionary_get_string - * - * @abstract - * Gets a C string value from a dictionary directly. - * - * @param xdict - * The dictionary object which is to be examined. - * - * @param key - * The key whose value is to be obtained. - * - * @result - * The underlying C string for the specified key. NULL if the value for the - * specified key is not a C string value or if there is no value for the - * specified key. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL_ALL -const char * _Nullable -xpc_dictionary_get_string(xpc_object_t xdict, const char *key); - -/*! - * @function xpc_dictionary_get_uuid - * - * @abstract - * Gets a uuid value from a dictionary directly. - * - * @param xdict - * The dictionary object which is to be examined. - * - * @param key - * The key whose value is to be obtained. - * - * @result - * The underlying uuid_t value for the specified key. NULL is the - * value at the specified index is not a UUID value. The returned pointer may be - * safely passed to the uuid(3) APIs. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL1 XPC_NONNULL2 -const uint8_t * _Nullable -xpc_dictionary_get_uuid(xpc_object_t xdict, const char *key); - -/*! - * @function xpc_dictionary_dup_fd - * - * @abstract - * Creates a file descriptor from a dictionary directly. - * - * @param xdict - * The dictionary object which is to be examined. - * - * @param key - * The key whose value is to be obtained. - * - * @result - * A new file descriptor created from the value for the specified key. You are - * responsible for close(2)ing this descriptor. -1 if the value for the - * specified key is not a file descriptor value or if there is no value for the - * specified key. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL_ALL -int -xpc_dictionary_dup_fd(xpc_object_t xdict, const char *key); - -/*! - * @function xpc_dictionary_create_connection - * - * @abstract - * Creates a connection from a dictionary directly. - * - * @param xdict - * The dictionary object which is to be examined. - * - * @param key - * The key whose value is to be obtained. - * - * @result - * A new connection created from the value for the specified key. You are - * responsible for calling xpc_release() on the returned connection. NULL if the - * value for the specified key is not an endpoint containing a connection or if - * there is no value for the specified key. Each call to this method for the - * same key in the same dictionary will yield a different connection. See - * {@link xpc_connection_create_from_endpoint()} for discussion as to the - * responsibilities when dealing with the returned connection. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_MALLOC XPC_RETURNS_RETAINED XPC_WARN_RESULT XPC_NONNULL_ALL -xpc_connection_t _Nullable -xpc_dictionary_create_connection(xpc_object_t xdict, const char *key); - -/*! - * @function xpc_dictionary_get_dictionary - * - * @abstract - * Returns the dictionary value for the specified key. - * - * @param xdict - * The dictionary object which is to be examined. - * - * @param key - * The key whose value is to be obtained. - * - * @result - * The object for the specified key within the dictionary. NULL if there is no - * value associated with the specified key, if the given object was not an - * XPC dictionary, or if the object for the specified key is not a dictionary. - * - * @discussion - * This method does not grant the caller a reference to the underlying object, - * and thus the caller is not responsible for releasing the object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_11, __IPHONE_9_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL_ALL -xpc_object_t _Nullable -xpc_dictionary_get_dictionary(xpc_object_t xdict, const char *key); - -/*! - * @function xpc_dictionary_get_array - * - * @abstract - * Returns the array value for the specified key. - * - * @param xdict - * The dictionary object which is to be examined. - * - * @param key - * The key whose value is to be obtained. - * - * @result - * The object for the specified key within the dictionary. NULL if there is no - * value associated with the specified key, if the given object was not an - * XPC dictionary, or if the object for the specified key is not an array. - * - * @discussion - * This method does not grant the caller a reference to the underlying object, - * and thus the caller is not responsible for releasing the object. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_11, __IPHONE_9_0) -XPC_EXPORT XPC_WARN_RESULT XPC_NONNULL_ALL -xpc_object_t _Nullable -xpc_dictionary_get_array(xpc_object_t xdict, const char *key); - -#pragma mark Runtime -/*! - * @function xpc_main - * The springboard into the XPCService runtime. This function will set up your - * service bundle's listener connection and manage it automatically. After this - * initial setup, this function will, by default, call dispatch_main(). You may - * override this behavior by setting the RunLoopType key in your XPC service - * bundle's Info.plist under the XPCService dictionary. - * - * @param handler - * The handler with which to accept new connections. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NORETURN XPC_NONNULL1 -void -xpc_main(xpc_connection_handler_t handler); - -#pragma mark Transactions -/*! - * @function xpc_transaction_begin - * Informs the XPC runtime that a transaction has begun and that the service - * should not exit due to inactivity. - * - * @discussion - * A service with no outstanding transactions may automatically exit due to - * inactivity as determined by the system. - * - * This function may be used to manually manage transactions in cases where - * their automatic management (as described below) does not meet the needs of an - * XPC service. This function also updates the transaction count used for sudden - * termination, i.e. vproc_transaction_begin(), and these two interfaces may be - * used in combination. - * - * The XPC runtime will automatically begin a transaction on behalf of a service - * when a new message is received. If no reply message is expected, the - * transaction is automatically ended when the connection event handler returns. - * If a reply message is created, the transaction will end when the reply - * message is sent or released. An XPC service may use xpc_transaction_begin() - * and xpc_transaction_end() to inform the XPC runtime about activity that - * occurs outside of this common pattern. - * - * On macOS, when the XPC runtime has determined that the service should exit, - * the event handlers for all active peer connections will receive - * {@link XPC_ERROR_TERMINATION_IMMINENT} as an indication that they should - * unwind their existing transactions. After this error is delivered to a - * connection's event handler, no more messages will be delivered to the - * connection. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_TRANSACTION_DEPRECATED -XPC_EXPORT -void -xpc_transaction_begin(void); - -/*! - * @function xpc_transaction_end - * Informs the XPC runtime that a transaction has ended. - * - * @discussion - * As described in {@link xpc_transaction_begin()}, this API may be used - * interchangeably with vproc_transaction_end(). - * - * See the discussion for {@link xpc_transaction_begin()} for details regarding - * the XPC runtime's idle-exit policy. - */ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_TRANSACTION_DEPRECATED -XPC_EXPORT -void -xpc_transaction_end(void); - -#pragma mark XPC Event Stream -/*! - * @function xpc_set_event_stream_handler - * Sets the event handler to invoke when streamed events are received. - * - * @param stream - * The name of the event stream for which this handler will be invoked. - * - * @param targetq - * The GCD queue to which the event handler block will be submitted. This - * parameter may be NULL, in which case the connection's target queue will be - * libdispatch's default target queue, defined as DISPATCH_TARGET_QUEUE_DEFAULT. - * - * @param handler - * The event handler block. The event which this block receives as its first - * parameter will always be a dictionary which contains the XPC_EVENT_KEY_NAME - * key. The value for this key will be a string whose value is the name assigned - * to the XPC event specified in the launchd.plist. Future keys may be added to - * this dictionary. - * - * @discussion - * Multiple calls to this function for the same event stream will result in - * undefined behavior. - */ -#if __BLOCKS__ -__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0) -XPC_EXPORT XPC_NONNULL1 XPC_NONNULL3 -void -xpc_set_event_stream_handler(const char *stream, - dispatch_queue_t _Nullable targetq, xpc_handler_t handler); -#endif // __BLOCKS__ - -__END_DECLS -XPC_ASSUME_NONNULL_END - -#endif // __XPC_H__ \ No newline at end of file diff --git a/lib/std/SemanticVersion.zig b/lib/std/SemanticVersion.zig index e029952509..17d5b65571 100644 --- a/lib/std/SemanticVersion.zig +++ b/lib/std/SemanticVersion.zig @@ -48,8 +48,8 @@ pub fn order(lhs: Version, rhs: Version) std.math.Order { if (lhs.pre == null and rhs.pre != null) return .gt; // Iterate over pre-release identifiers until a difference is found. - var lhs_pre_it = std.mem.split(lhs.pre.?, "."); - var rhs_pre_it = std.mem.split(rhs.pre.?, "."); + var lhs_pre_it = std.mem.split(u8, lhs.pre.?, "."); + var rhs_pre_it = std.mem.split(u8, rhs.pre.?, "."); while (true) { const next_lid = lhs_pre_it.next(); const next_rid = rhs_pre_it.next(); @@ -92,7 +92,7 @@ pub fn parse(text: []const u8) !Version { // Parse the required major, minor, and patch numbers. const extra_index = std.mem.indexOfAny(u8, text, "-+"); const required = text[0..(extra_index orelse text.len)]; - var it = std.mem.split(required, "."); + var it = std.mem.split(u8, required, "."); var ver = Version{ .major = try parseNum(it.next() orelse return error.InvalidVersion), .minor = try parseNum(it.next() orelse return error.InvalidVersion), @@ -114,7 +114,7 @@ pub fn parse(text: []const u8) !Version { // Check validity of optional pre-release identifiers. // See: https://semver.org/#spec-item-9 if (ver.pre) |pre| { - it = std.mem.split(pre, "."); + it = std.mem.split(u8, pre, "."); while (it.next()) |id| { // Identifiers MUST NOT be empty. if (id.len == 0) return error.InvalidVersion; @@ -133,7 +133,7 @@ pub fn parse(text: []const u8) !Version { // Check validity of optional build metadata identifiers. // See: https://semver.org/#spec-item-10 if (ver.build) |build| { - it = std.mem.split(build, "."); + it = std.mem.split(u8, build, "."); while (it.next()) |id| { // Identifiers MUST NOT be empty. if (id.len == 0) return error.InvalidVersion; diff --git a/lib/std/Thread.zig b/lib/std/Thread.zig index 9553cd429e..cd742cc955 100644 --- a/lib/std/Thread.zig +++ b/lib/std/Thread.zig @@ -38,6 +38,192 @@ else impl: Impl, +pub const max_name_len = switch (std.Target.current.os.tag) { + .linux => 15, + .windows => 31, + .macos, .ios, .watchos, .tvos => 63, + .netbsd => 31, + .freebsd => 15, + .openbsd => 31, + else => 0, +}; + +pub const SetNameError = error{ + NameTooLong, + Unsupported, + Unexpected, +} || os.PrctlError || os.WriteError || std.fs.File.OpenError || std.fmt.BufPrintError; + +pub fn setName(self: Thread, name: []const u8) SetNameError!void { + if (name.len > max_name_len) return error.NameTooLong; + + const name_with_terminator = blk: { + var name_buf: [max_name_len:0]u8 = undefined; + std.mem.copy(u8, &name_buf, name); + name_buf[name.len] = 0; + break :blk name_buf[0..name.len :0]; + }; + + switch (std.Target.current.os.tag) { + .linux => if (use_pthreads) { + const err = std.c.pthread_setname_np(self.getHandle(), name_with_terminator.ptr); + return switch (err) { + 0 => {}, + os.ERANGE => unreachable, + else => return os.unexpectedErrno(err), + }; + } else if (use_pthreads and self.getHandle() == std.c.pthread_self()) { + const err = try os.prctl(.SET_NAME, .{@ptrToInt(name_with_terminator.ptr)}); + return switch (err) { + 0 => {}, + else => return os.unexpectedErrno(err), + }; + } else { + var buf: [32]u8 = undefined; + const path = try std.fmt.bufPrint(&buf, "/proc/self/task/{d}/comm", .{self.getHandle()}); + + const file = try std.fs.cwd().openFile(path, .{ .write = true }); + defer file.close(); + + try file.writer().writeAll(name); + }, + .windows => if (std.Target.current.os.isAtLeast(.windows, .win10_rs1)) |res| { + // SetThreadDescription is only available since version 1607, which is 10.0.14393.795 + // See https://en.wikipedia.org/wiki/Microsoft_Windows_SDK + if (!res) { + return error.Unsupported; + } + + var name_buf_w: [max_name_len:0]u16 = undefined; + const length = try std.unicode.utf8ToUtf16Le(&name_buf_w, name); + name_buf_w[length] = 0; + + try os.windows.SetThreadDescription( + self.getHandle(), + @ptrCast(os.windows.LPWSTR, &name_buf_w), + ); + } else { + return error.Unsupported; + }, + .macos, .ios, .watchos, .tvos => if (use_pthreads) { + // There doesn't seem to be a way to set the name for an arbitrary thread, only the current one. + if (self.getHandle() != std.c.pthread_self()) return error.Unsupported; + + const err = std.c.pthread_setname_np(name_with_terminator.ptr); + return switch (err) { + 0 => {}, + else => return os.unexpectedErrno(err), + }; + }, + .netbsd => if (use_pthreads) { + const err = std.c.pthread_setname_np(self.getHandle(), name_with_terminator.ptr, null); + return switch (err) { + 0 => {}, + os.EINVAL => unreachable, + os.ESRCH => unreachable, + os.ENOMEM => unreachable, + else => return os.unexpectedErrno(err), + }; + }, + .freebsd, .openbsd => if (use_pthreads) { + // Use pthread_set_name_np for FreeBSD because pthread_setname_np is FreeBSD 12.2+ only. + // TODO maybe revisit this if depending on FreeBSD 12.2+ is acceptable because pthread_setname_np can return an error. + + std.c.pthread_set_name_np(self.getHandle(), name_with_terminator.ptr); + }, + else => return error.Unsupported, + } +} + +pub const GetNameError = error{ + // For Windows, the name is converted from UTF16 to UTF8 + CodepointTooLarge, + Utf8CannotEncodeSurrogateHalf, + DanglingSurrogateHalf, + ExpectedSecondSurrogateHalf, + UnexpectedSecondSurrogateHalf, + + Unsupported, + Unexpected, +} || os.PrctlError || os.ReadError || std.fs.File.OpenError || std.fmt.BufPrintError; + +pub fn getName(self: Thread, buffer_ptr: *[max_name_len:0]u8) GetNameError!?[]const u8 { + buffer_ptr[max_name_len] = 0; + var buffer = std.mem.span(buffer_ptr); + + switch (std.Target.current.os.tag) { + .linux => if (use_pthreads and comptime std.Target.current.abi.isGnu()) { + const err = std.c.pthread_getname_np(self.getHandle(), buffer.ptr, max_name_len + 1); + return switch (err) { + 0 => std.mem.sliceTo(buffer, 0), + os.ERANGE => unreachable, + else => return os.unexpectedErrno(err), + }; + } else if (use_pthreads and self.getHandle() == std.c.pthread_self()) { + const err = try os.prctl(.GET_NAME, .{@ptrToInt(buffer.ptr)}); + return switch (err) { + 0 => std.mem.sliceTo(buffer, 0), + else => return os.unexpectedErrno(err), + }; + } else if (!use_pthreads) { + var buf: [32]u8 = undefined; + const path = try std.fmt.bufPrint(&buf, "/proc/self/task/{d}/comm", .{self.getHandle()}); + + const file = try std.fs.cwd().openFile(path, .{}); + defer file.close(); + + const data_len = try file.reader().readAll(buffer_ptr[0 .. max_name_len + 1]); + + return if (data_len >= 1) buffer[0 .. data_len - 1] else null; + } else { + // musl doesn't provide pthread_getname_np and there's no way to retrieve the thread id of an arbitrary thread. + return error.Unsupported; + }, + .windows => if (std.Target.current.os.isAtLeast(.windows, .win10_rs1)) |res| { + // GetThreadDescription is only available since version 1607, which is 10.0.14393.795 + // See https://en.wikipedia.org/wiki/Microsoft_Windows_SDK + if (!res) { + return error.Unsupported; + } + + var name_w: os.windows.LPWSTR = undefined; + try os.windows.GetThreadDescription(self.getHandle(), &name_w); + defer os.windows.LocalFree(name_w); + + const data_len = try std.unicode.utf16leToUtf8(buffer, std.mem.sliceTo(name_w, 0)); + + return if (data_len >= 1) buffer[0..data_len] else null; + } else { + return error.Unsupported; + }, + .macos, .ios, .watchos, .tvos => if (use_pthreads) { + const err = std.c.pthread_getname_np(self.getHandle(), buffer.ptr, max_name_len + 1); + return switch (err) { + 0 => std.mem.sliceTo(buffer, 0), + os.ESRCH => unreachable, + else => return os.unexpectedErrno(err), + }; + }, + .netbsd => if (use_pthreads) { + const err = std.c.pthread_getname_np(self.getHandle(), buffer.ptr, max_name_len + 1); + return switch (err) { + 0 => std.mem.sliceTo(buffer, 0), + os.EINVAL => unreachable, + os.ESRCH => unreachable, + else => return os.unexpectedErrno(err), + }; + }, + .freebsd, .openbsd => if (use_pthreads) { + // Use pthread_get_name_np for FreeBSD because pthread_getname_np is FreeBSD 12.2+ only. + // TODO maybe revisit this if depending on FreeBSD 12.2+ is acceptable because pthread_getname_np can return an error. + + std.c.pthread_get_name_np(self.getHandle(), buffer.ptr, max_name_len + 1); + return std.mem.sliceTo(buffer, 0); + }, + else => return error.Unsupported, + } +} + /// Represents a unique ID per thread. pub const Id = u64; @@ -612,6 +798,32 @@ const LinuxThreadImpl = struct { [len] "r" (self.mapped.len) : "memory" ), + .sparcv9 => asm volatile ( + \\ # SPARCs really don't like it when active stack frames + \\ # is unmapped (it will result in a segfault), so we + \\ # force-deactivate it by running `restore` until + \\ # all frames are cleared. + \\ 1: + \\ cmp %%sp, 0 + \\ beq 2f + \\ restore + \\ ba 1f + \\ 2: + \\ mov 73, %%g1 + \\ mov %[ptr], %%o0 + \\ mov %[len], %%o1 + \\ # Flush register window contents to prevent background + \\ # memory access before unmapping the stack. + \\ flushw + \\ t 0x6d + \\ mov 1, %%g1 + \\ mov 1, %%o0 + \\ t 0x6d + : + : [ptr] "r" (@ptrToInt(self.mapped.ptr)), + [len] "r" (self.mapped.len) + : "memory" + ), else => |cpu_arch| @compileError("Unsupported linux arch: " ++ @tagName(cpu_arch)), } unreachable; @@ -779,6 +991,94 @@ const LinuxThreadImpl = struct { } }; +fn testThreadName(thread: *Thread) !void { + const testCases = &[_][]const u8{ + "mythread", + "b" ** max_name_len, + }; + + inline for (testCases) |tc| { + try thread.setName(tc); + + var name_buffer: [max_name_len:0]u8 = undefined; + + const name = try thread.getName(&name_buffer); + if (name) |value| { + try std.testing.expectEqual(tc.len, value.len); + try std.testing.expectEqualStrings(tc, value); + } + } +} + +test "setName, getName" { + if (std.builtin.single_threaded) return error.SkipZigTest; + + const Context = struct { + start_wait_event: ResetEvent = undefined, + test_done_event: ResetEvent = undefined, + + done: std.atomic.Atomic(bool) = std.atomic.Atomic(bool).init(false), + thread: Thread = undefined, + + fn init(self: *@This()) !void { + try self.start_wait_event.init(); + try self.test_done_event.init(); + } + + pub fn run(ctx: *@This()) !void { + // Wait for the main thread to have set the thread field in the context. + ctx.start_wait_event.wait(); + + switch (std.Target.current.os.tag) { + .windows => testThreadName(&ctx.thread) catch |err| switch (err) { + error.Unsupported => return error.SkipZigTest, + else => return err, + }, + else => try testThreadName(&ctx.thread), + } + + // Signal our test is done + ctx.test_done_event.set(); + + while (!ctx.done.load(.SeqCst)) { + std.time.sleep(5 * std.time.ns_per_ms); + } + } + }; + + var context = Context{}; + try context.init(); + + var thread = try spawn(.{}, Context.run, .{&context}); + context.thread = thread; + context.start_wait_event.set(); + context.test_done_event.wait(); + + switch (std.Target.current.os.tag) { + .macos, .ios, .watchos, .tvos => { + const res = thread.setName("foobar"); + try std.testing.expectError(error.Unsupported, res); + }, + .windows => testThreadName(&thread) catch |err| switch (err) { + error.Unsupported => return error.SkipZigTest, + else => return err, + }, + else => |tag| if (tag == .linux and use_pthreads and comptime std.Target.current.abi.isMusl()) { + try thread.setName("foobar"); + + var name_buffer: [max_name_len:0]u8 = undefined; + const res = thread.getName(&name_buffer); + + try std.testing.expectError(error.Unsupported, res); + } else { + try testThreadName(&thread); + }, + } + + context.done.store(true, .SeqCst); + thread.join(); +} + test "std.Thread" { // Doesn't use testing.refAllDecls() since that would pull in the compileError spinLoopHint. _ = AutoResetEvent; diff --git a/lib/std/array_hash_map.zig b/lib/std/array_hash_map.zig index 9bcecab47e..4ca603d2e8 100644 --- a/lib/std/array_hash_map.zig +++ b/lib/std/array_hash_map.zig @@ -414,6 +414,12 @@ pub fn ArrayHashMap( pub fn pop(self: *Self) KV { return self.unmanaged.popContext(self.ctx); } + + /// Removes the last inserted `Entry` in the hash map and returns it if count is nonzero. + /// Otherwise returns null. + pub fn popOrNull(self: *Self) ?KV { + return self.unmanaged.popOrNullContext(self.ctx); + } }; } @@ -1181,6 +1187,17 @@ pub fn ArrayHashMapUnmanaged( }; } + /// Removes the last inserted `Entry` in the hash map and returns it if count is nonzero. + /// Otherwise returns null. + pub fn popOrNull(self: *Self) ?KV { + if (@sizeOf(ByIndexContext) != 0) + @compileError("Cannot infer context " ++ @typeName(Context) ++ ", call popContext instead."); + return self.popOrNullContext(undefined); + } + pub fn popOrNullContext(self: *Self, ctx: Context) ?KV { + return if (self.entries.len == 0) null else self.popContext(ctx); + } + // ------------------ No pub fns below this point ------------------ fn fetchRemoveByKey(self: *Self, key: anytype, key_ctx: anytype, ctx: ByIndexContext, comptime removal_type: RemovalType) ?KV { @@ -2094,6 +2111,26 @@ test "pop" { } } +test "popOrNull" { + var map = AutoArrayHashMap(i32, i32).init(std.testing.allocator); + defer map.deinit(); + + // Insert just enough entries so that the map expands. Afterwards, + // pop all entries out of the map. + + var i: i32 = 0; + while (i < 9) : (i += 1) { + try testing.expect((try map.fetchPut(i, i)) == null); + } + + while (map.popOrNull()) |pop| { + try testing.expect(pop.key == i - 1 and pop.value == i - 1); + i -= 1; + } + + try testing.expect(map.count() == 0); +} + test "reIndex" { var map = ArrayHashMap(i32, i32, AutoContext(i32), true).init(std.testing.allocator); defer map.deinit(); diff --git a/lib/std/array_list.zig b/lib/std/array_list.zig index 8b46ec2145..1e74d34922 100644 --- a/lib/std/array_list.zig +++ b/lib/std/array_list.zig @@ -65,16 +65,23 @@ pub fn ArrayListAligned(comptime T: type, comptime alignment: ?u29) type { pub fn initCapacity(allocator: *Allocator, num: usize) !Self { var self = Self.init(allocator); - const new_memory = try self.allocator.allocAdvanced(T, alignment, num, .at_least); - self.items.ptr = new_memory.ptr; - self.capacity = new_memory.len; + if (@sizeOf(T) > 0) { + const new_memory = try self.allocator.allocAdvanced(T, alignment, num, .at_least); + self.items.ptr = new_memory.ptr; + self.capacity = new_memory.len; + } else { + // If `T` is a zero-sized type, then we do not need to allocate memory. + self.capacity = std.math.maxInt(usize); + } return self; } /// Release all allocated memory. pub fn deinit(self: Self) void { - self.allocator.free(self.allocatedSlice()); + if (@sizeOf(T) > 0) { + self.allocator.free(self.allocatedSlice()); + } } pub const span = @compileError("deprecated: use `items` field directly"); @@ -279,13 +286,17 @@ pub fn ArrayListAligned(comptime T: type, comptime alignment: ?u29) type { pub fn shrinkAndFree(self: *Self, new_len: usize) void { assert(new_len <= self.items.len); - self.items = self.allocator.realloc(self.allocatedSlice(), new_len) catch |e| switch (e) { - error.OutOfMemory => { // no problem, capacity is still correct then. - self.items.len = new_len; - return; - }, - }; - self.capacity = new_len; + if (@sizeOf(T) > 0) { + self.items = self.allocator.realloc(self.allocatedSlice(), new_len) catch |e| switch (e) { + error.OutOfMemory => { // no problem, capacity is still correct then. + self.items.len = new_len; + return; + }, + }; + self.capacity = new_len; + } else { + self.items.len = new_len; + } } /// Reduce length to `new_len`. @@ -313,18 +324,22 @@ pub fn ArrayListAligned(comptime T: type, comptime alignment: ?u29) type { /// Modify the array so that it can hold at least `new_capacity` items. /// Invalidates pointers if additional memory is needed. pub fn ensureTotalCapacity(self: *Self, new_capacity: usize) !void { - var better_capacity = self.capacity; - if (better_capacity >= new_capacity) return; + if (@sizeOf(T) > 0) { + var better_capacity = self.capacity; + if (better_capacity >= new_capacity) return; - while (true) { - better_capacity += better_capacity / 2 + 8; - if (better_capacity >= new_capacity) break; + while (true) { + better_capacity += better_capacity / 2 + 8; + if (better_capacity >= new_capacity) break; + } + + // TODO This can be optimized to avoid needlessly copying undefined memory. + const new_memory = try self.allocator.reallocAtLeast(self.allocatedSlice(), better_capacity); + self.items.ptr = new_memory.ptr; + self.capacity = new_memory.len; + } else { + self.capacity = std.math.maxInt(usize); } - - // TODO This can be optimized to avoid needlessly copying undefined memory. - const new_memory = try self.allocator.reallocAtLeast(self.allocatedSlice(), better_capacity); - self.items.ptr = new_memory.ptr; - self.capacity = new_memory.len; } /// Modify the array so that it can hold at least `additional_count` **more** items. @@ -1299,3 +1314,23 @@ test "ArrayListAligned/ArrayListAlignedUnmanaged accepts unaligned slices" { try testing.expectEqualSlices(u8, list.items, &.{ 0, 8, 9, 6, 7, 2, 3 }); } } + +test "std.ArrayList(u0)" { + // An ArrayList on zero-sized types should not need to allocate + const a = &testing.FailingAllocator.init(testing.allocator, 0).allocator; + + var list = ArrayList(u0).init(a); + defer list.deinit(); + + try list.append(0); + try list.append(0); + try list.append(0); + try testing.expectEqual(list.items.len, 3); + + var count: usize = 0; + for (list.items) |x| { + try testing.expectEqual(x, 0); + count += 1; + } + try testing.expectEqual(count, 3); +} diff --git a/lib/std/bit_set.zig b/lib/std/bit_set.zig index f7339bfdcf..261c6af2df 100644 --- a/lib/std/bit_set.zig +++ b/lib/std/bit_set.zig @@ -872,7 +872,7 @@ pub const DynamicBitSet = struct { /// ascending order. Modifications to the underlying bit set may /// or may not be observed by the iterator. Resizing the underlying /// bit set invalidates the iterator. - pub fn iterator(self: *Self, comptime options: IteratorOptions) Iterator(options) { + pub fn iterator(self: *const Self, comptime options: IteratorOptions) Iterator(options) { return self.unmanaged.iterator(options); } diff --git a/lib/std/build.zig b/lib/std/build.zig index 36a71d5061..17cad016e8 100644 --- a/lib/std/build.zig +++ b/lib/std/build.zig @@ -41,10 +41,12 @@ pub const Builder = struct { verbose_ast: bool, verbose_link: bool, verbose_cc: bool, - verbose_ir: bool, + verbose_air: bool, verbose_llvm_ir: bool, verbose_cimport: bool, verbose_llvm_cpu_features: bool, + /// The purpose of executing the command is for a human to read compile errors from the terminal + prominent_compile_errors: bool, color: enum { auto, on, off } = .auto, invalid_user_input: bool, zig_exe: []const u8, @@ -153,10 +155,11 @@ pub const Builder = struct { .verbose_ast = false, .verbose_link = false, .verbose_cc = false, - .verbose_ir = false, + .verbose_air = false, .verbose_llvm_ir = false, .verbose_cimport = false, .verbose_llvm_cpu_features = false, + .prominent_compile_errors = false, .invalid_user_input = false, .allocator = allocator, .user_input_options = UserInputOptionsMap.init(allocator), @@ -1082,7 +1085,7 @@ pub const Builder = struct { if (fs.path.isAbsolute(name)) { return name; } - var it = mem.tokenize(PATH, &[_]u8{fs.path.delimiter}); + var it = mem.tokenize(u8, PATH, &[_]u8{fs.path.delimiter}); while (it.next()) |path| { const full_path = try fs.path.join(self.allocator, &[_][]const u8{ path, @@ -1162,8 +1165,13 @@ pub const Builder = struct { }, error.ExitCodeFailure => { if (src_step) |s| warn("{s}...", .{s.name}); - warn("The following command exited with error code {d}:\n", .{code}); - printCmd(null, argv); + if (self.prominent_compile_errors) { + warn("The step exited with error code {d}\n", .{code}); + } else { + warn("The following command exited with error code {d}:\n", .{code}); + printCmd(null, argv); + } + std.os.exit(@truncate(u8, code)); }, error.ProcessTerminated => { @@ -1203,10 +1211,10 @@ pub const Builder = struct { const stdout = try self.execAllowFail(&[_][]const u8{ "pkg-config", "--list-all" }, out_code, .Ignore); var list = ArrayList(PkgConfigPkg).init(self.allocator); errdefer list.deinit(); - var line_it = mem.tokenize(stdout, "\r\n"); + var line_it = mem.tokenize(u8, stdout, "\r\n"); while (line_it.next()) |line| { if (mem.trim(u8, line, " \t").len == 0) continue; - var tok_it = mem.tokenize(line, " \t"); + var tok_it = mem.tokenize(u8, line, " \t"); try list.append(PkgConfigPkg{ .name = tok_it.next() orelse return error.PkgConfigInvalidOutput, .desc = tok_it.rest(), @@ -1723,6 +1731,7 @@ pub const LibExeObjStep = struct { pub fn setLinkerScriptPath(self: *LibExeObjStep, source: FileSource) void { self.linker_script = source.dupe(self.builder); + source.addStepDependencies(&self.step); } pub fn linkFramework(self: *LibExeObjStep, framework_name: []const u8) void { @@ -1863,7 +1872,7 @@ pub const LibExeObjStep = struct { error.FileNotFound => return error.PkgConfigNotInstalled, else => return err, }; - var it = mem.tokenize(stdout, " \r\n\t"); + var it = mem.tokenize(u8, stdout, " \r\n\t"); while (it.next()) |tok| { if (mem.eql(u8, tok, "-I")) { const dir = it.next() orelse return error.PkgConfigInvalidOutput; @@ -2443,7 +2452,7 @@ pub const LibExeObjStep = struct { if (builder.verbose_tokenize) zig_args.append("--verbose-tokenize") catch unreachable; if (builder.verbose_ast) zig_args.append("--verbose-ast") catch unreachable; if (builder.verbose_cimport) zig_args.append("--verbose-cimport") catch unreachable; - if (builder.verbose_ir) zig_args.append("--verbose-ir") catch unreachable; + if (builder.verbose_air) zig_args.append("--verbose-air") catch unreachable; if (builder.verbose_llvm_ir) zig_args.append("--verbose-llvm-ir") catch unreachable; if (builder.verbose_link or self.verbose_link) zig_args.append("--verbose-link") catch unreachable; if (builder.verbose_cc or self.verbose_cc) zig_args.append("--verbose-cc") catch unreachable; @@ -2802,6 +2811,7 @@ pub const LibExeObjStep = struct { mem.eql(u8, entry.name, "llvm-ar.id") or mem.eql(u8, entry.name, "libs.txt") or mem.eql(u8, entry.name, "builtin.zig") or + mem.eql(u8, entry.name, "zld.id") or mem.eql(u8, entry.name, "lld.id")) continue; _ = try src_dir.updateFile(entry.name, dest_dir, entry.name, .{}); @@ -3006,7 +3016,8 @@ pub const InstallDirStep = struct { const self = @fieldParentPtr(InstallDirStep, "step", step); const dest_prefix = self.builder.getInstallPath(self.options.install_dir, self.options.install_subdir); const full_src_dir = self.builder.pathFromRoot(self.options.source_dir); - var it = try fs.walkPath(self.builder.allocator, full_src_dir); + const src_dir = try std.fs.cwd().openDir(full_src_dir, .{ .iterate = true }); + var it = try src_dir.walk(self.builder.allocator); next_entry: while (try it.next()) |entry| { for (self.options.exclude_extensions) |ext| { if (mem.endsWith(u8, entry.path, ext)) { @@ -3014,9 +3025,12 @@ pub const InstallDirStep = struct { } } - const rel_path = entry.path[full_src_dir.len + 1 ..]; + const full_path = try fs.path.join(self.builder.allocator, &[_][]const u8{ + full_src_dir, entry.path, + }); + const dest_path = try fs.path.join(self.builder.allocator, &[_][]const u8{ - dest_prefix, rel_path, + dest_prefix, entry.path, }); switch (entry.kind) { @@ -3029,7 +3043,7 @@ pub const InstallDirStep = struct { } } - try self.builder.updateFile(entry.path, dest_path); + try self.builder.updateFile(full_path, dest_path); }, else => continue, } diff --git a/lib/std/build/RunStep.zig b/lib/std/build/RunStep.zig index 50fea83784..89d9cd911c 100644 --- a/lib/std/build/RunStep.zig +++ b/lib/std/build/RunStep.zig @@ -221,11 +221,19 @@ fn make(step: *Step) !void { switch (term) { .Exited => |code| { if (code != self.expected_exit_code) { - warn("The following command exited with error code {} (expected {}):\n", .{ - code, - self.expected_exit_code, - }); - printCmd(cwd, argv); + if (self.builder.prominent_compile_errors) { + warn("Run step exited with error code {} (expected {})\n", .{ + code, + self.expected_exit_code, + }); + } else { + warn("The following command exited with error code {} (expected {}):\n", .{ + code, + self.expected_exit_code, + }); + printCmd(cwd, argv); + } + return error.UncleanExit; } }, diff --git a/lib/std/builtin.zig b/lib/std/builtin.zig index 9d432a3a00..6643e07837 100644 --- a/lib/std/builtin.zig +++ b/lib/std/builtin.zig @@ -509,7 +509,7 @@ pub const Version = struct { // found no digits or '.' before unexpected character if (end == 0) return error.InvalidVersion; - var it = std.mem.split(text[0..end], "."); + var it = std.mem.split(u8, text[0..end], "."); // substring is not empty, first call will succeed const major = it.next().?; if (major.len == 0) return error.InvalidVersion; diff --git a/lib/std/c/darwin.zig b/lib/std/c/darwin.zig index ca18b5130a..e216afd643 100644 --- a/lib/std/c/darwin.zig +++ b/lib/std/c/darwin.zig @@ -193,6 +193,8 @@ pub const pthread_attr_t = extern struct { const pthread_t = std.c.pthread_t; pub extern "c" fn pthread_threadid_np(thread: ?pthread_t, thread_id: *u64) c_int; +pub extern "c" fn pthread_setname_np(name: [*:0]const u8) c_int; +pub extern "c" fn pthread_getname_np(thread: std.c.pthread_t, name: [*:0]u8, len: usize) c_int; pub extern "c" fn arc4random_buf(buf: [*]u8, len: usize) void; diff --git a/lib/std/c/freebsd.zig b/lib/std/c/freebsd.zig index 3e4b522685..eb449165d3 100644 --- a/lib/std/c/freebsd.zig +++ b/lib/std/c/freebsd.zig @@ -14,6 +14,8 @@ pub extern "c" fn sigaltstack(ss: ?*stack_t, old_ss: ?*stack_t) c_int; pub extern "c" fn getrandom(buf_ptr: [*]u8, buf_len: usize, flags: c_uint) isize; pub extern "c" fn pthread_getthreadid_np() c_int; +pub extern "c" fn pthread_set_name_np(thread: std.c.pthread_t, name: [*:0]const u8) void; +pub extern "c" fn pthread_get_name_np(thread: std.c.pthread_t, name: [*:0]u8, len: usize) void; pub extern "c" fn pipe2(fds: *[2]fd_t, flags: u32) c_int; pub extern "c" fn posix_memalign(memptr: *?*c_void, alignment: usize, size: usize) c_int; diff --git a/lib/std/c/linux.zig b/lib/std/c/linux.zig index 6e897c3098..694af28904 100644 --- a/lib/std/c/linux.zig +++ b/lib/std/c/linux.zig @@ -186,6 +186,9 @@ const __SIZEOF_PTHREAD_MUTEX_T = if (os_tag == .fuchsia) 40 else switch (abi) { }; const __SIZEOF_SEM_T = 4 * @sizeOf(usize); +pub extern "c" fn pthread_setname_np(thread: std.c.pthread_t, name: [*:0]const u8) c_int; +pub extern "c" fn pthread_getname_np(thread: std.c.pthread_t, name: [*:0]u8, len: usize) c_int; + pub const RTLD_LAZY = 1; pub const RTLD_NOW = 2; pub const RTLD_NOLOAD = 4; diff --git a/lib/std/c/netbsd.zig b/lib/std/c/netbsd.zig index 8e6d556fbc..32b7cc69e3 100644 --- a/lib/std/c/netbsd.zig +++ b/lib/std/c/netbsd.zig @@ -94,3 +94,6 @@ pub const pthread_attr_t = extern struct { }; pub const sem_t = ?*opaque {}; + +pub extern "c" fn pthread_setname_np(thread: std.c.pthread_t, name: [*:0]const u8, arg: ?*c_void) c_int; +pub extern "c" fn pthread_getname_np(thread: std.c.pthread_t, name: [*:0]u8, len: usize) c_int; diff --git a/lib/std/c/openbsd.zig b/lib/std/c/openbsd.zig index cac3df867d..15820fb0a9 100644 --- a/lib/std/c/openbsd.zig +++ b/lib/std/c/openbsd.zig @@ -45,3 +45,6 @@ pub extern "c" fn posix_memalign(memptr: *?*c_void, alignment: usize, size: usiz pub extern "c" fn pledge(promises: ?[*:0]const u8, execpromises: ?[*:0]const u8) c_int; pub extern "c" fn unveil(path: ?[*:0]const u8, permissions: ?[*:0]const u8) c_int; + +pub extern "c" fn pthread_set_name_np(thread: std.c.pthread_t, name: [*:0]const u8) void; +pub extern "c" fn pthread_get_name_np(thread: std.c.pthread_t, name: [*:0]u8, len: usize) void; diff --git a/lib/std/child_process.zig b/lib/std/child_process.zig index b63153e904..3f3fa9c754 100644 --- a/lib/std/child_process.zig +++ b/lib/std/child_process.zig @@ -836,12 +836,12 @@ pub const ChildProcess = struct { const app_name = self.argv[0]; - var it = mem.tokenize(PATH, ";"); + var it = mem.tokenize(u8, PATH, ";"); retry: while (it.next()) |search_path| { const path_no_ext = try fs.path.join(self.allocator, &[_][]const u8{ search_path, app_name }); defer self.allocator.free(path_no_ext); - var ext_it = mem.tokenize(PATHEXT, ";"); + var ext_it = mem.tokenize(u8, PATHEXT, ";"); while (ext_it.next()) |app_ext| { const joined_path = try mem.concat(self.allocator, u8, &[_][]const u8{ path_no_ext, app_ext }); defer self.allocator.free(joined_path); diff --git a/lib/std/debug.zig b/lib/std/debug.zig index f74d0b3f91..c3ef9dec4c 100644 --- a/lib/std/debug.zig +++ b/lib/std/debug.zig @@ -438,7 +438,12 @@ pub fn writeCurrentStackTrace( } var it = StackIterator.init(start_addr, null); while (it.next()) |return_address| { - try printSourceAtAddress(debug_info, out_stream, return_address - 1, tty_config); + // On arm64 macOS, the address of the last frame is 0x0 rather than 0x1 as on x86_64 macOS, + // therefore, we do a check for `return_address == 0` before subtracting 1 from it to avoid + // an overflow. We do not need to signal `StackIterator` as it will correctly detect this + // condition on the subsequent iteration and return `null` thus terminating the loop. + const address = if (return_address == 0) return_address else return_address - 1; + try printSourceAtAddress(debug_info, out_stream, address, tty_config); } } diff --git a/lib/std/fs.zig b/lib/std/fs.zig index eec4733e95..8ba8050a96 100644 --- a/lib/std/fs.zig +++ b/lib/std/fs.zig @@ -740,6 +740,94 @@ pub const Dir = struct { } } + pub const Walker = struct { + stack: std.ArrayList(StackItem), + name_buffer: std.ArrayList(u8), + + pub const WalkerEntry = struct { + /// The containing directory. This can be used to operate directly on `basename` + /// rather than `path`, avoiding `error.NameTooLong` for deeply nested paths. + /// The directory remains open until `next` or `deinit` is called. + dir: Dir, + basename: []const u8, + path: []const u8, + kind: Dir.Entry.Kind, + }; + + const StackItem = struct { + iter: Dir.Iterator, + dirname_len: usize, + }; + + /// After each call to this function, and on deinit(), the memory returned + /// from this function becomes invalid. A copy must be made in order to keep + /// a reference to the path. + pub fn next(self: *Walker) !?WalkerEntry { + while (self.stack.items.len != 0) { + // `top` becomes invalid after appending to `self.stack` + var top = &self.stack.items[self.stack.items.len - 1]; + const dirname_len = top.dirname_len; + if (try top.iter.next()) |base| { + self.name_buffer.shrinkRetainingCapacity(dirname_len); + if (self.name_buffer.items.len != 0) { + try self.name_buffer.append(path.sep); + } + try self.name_buffer.appendSlice(base.name); + if (base.kind == .Directory) { + var new_dir = top.iter.dir.openDir(base.name, .{ .iterate = true }) catch |err| switch (err) { + error.NameTooLong => unreachable, // no path sep in base.name + else => |e| return e, + }; + { + errdefer new_dir.close(); + try self.stack.append(StackItem{ + .iter = new_dir.iterate(), + .dirname_len = self.name_buffer.items.len, + }); + top = &self.stack.items[self.stack.items.len - 1]; + } + } + return WalkerEntry{ + .dir = top.iter.dir, + .basename = self.name_buffer.items[dirname_len + 1 ..], + .path = self.name_buffer.items, + .kind = base.kind, + }; + } else { + self.stack.pop().iter.dir.close(); + } + } + return null; + } + + pub fn deinit(self: *Walker) void { + while (self.stack.popOrNull()) |*item| item.iter.dir.close(); + self.stack.deinit(); + self.name_buffer.deinit(); + } + }; + + /// Recursively iterates over a directory. + /// Must call `Walker.deinit` when done. + /// The order of returned file system entries is undefined. + pub fn walk(self: Dir, allocator: *Allocator) !Walker { + var name_buffer = std.ArrayList(u8).init(allocator); + errdefer name_buffer.deinit(); + + var stack = std.ArrayList(Walker.StackItem).init(allocator); + errdefer stack.deinit(); + + try stack.append(Walker.StackItem{ + .iter = self.iterate(), + .dirname_len = 0, + }); + + return Walker{ + .stack = stack, + .name_buffer = name_buffer, + }; + } + pub const OpenError = error{ FileNotFound, NotDir, @@ -2266,100 +2354,7 @@ pub fn symLinkAbsoluteZ(target_path_c: [*:0]const u8, sym_link_path_c: [*:0]cons pub const symLink = @compileError("deprecated: use Dir.symLink or symLinkAbsolute"); pub const symLinkC = @compileError("deprecated: use Dir.symLinkZ or symLinkAbsoluteZ"); -pub const Walker = struct { - stack: std.ArrayList(StackItem), - name_buffer: std.ArrayList(u8), - - pub const Entry = struct { - /// The containing directory. This can be used to operate directly on `basename` - /// rather than `path`, avoiding `error.NameTooLong` for deeply nested paths. - /// The directory remains open until `next` or `deinit` is called. - dir: Dir, - /// TODO make this null terminated for API convenience - basename: []const u8, - - path: []const u8, - kind: Dir.Entry.Kind, - }; - - const StackItem = struct { - dir_it: Dir.Iterator, - dirname_len: usize, - }; - - /// After each call to this function, and on deinit(), the memory returned - /// from this function becomes invalid. A copy must be made in order to keep - /// a reference to the path. - pub fn next(self: *Walker) !?Entry { - while (true) { - if (self.stack.items.len == 0) return null; - // `top` becomes invalid after appending to `self.stack`. - var top = &self.stack.items[self.stack.items.len - 1]; - const dirname_len = top.dirname_len; - if (try top.dir_it.next()) |base| { - self.name_buffer.shrinkRetainingCapacity(dirname_len); - try self.name_buffer.append(path.sep); - try self.name_buffer.appendSlice(base.name); - if (base.kind == .Directory) { - var new_dir = top.dir_it.dir.openDir(base.name, .{ .iterate = true }) catch |err| switch (err) { - error.NameTooLong => unreachable, // no path sep in base.name - else => |e| return e, - }; - { - errdefer new_dir.close(); - try self.stack.append(StackItem{ - .dir_it = new_dir.iterate(), - .dirname_len = self.name_buffer.items.len, - }); - top = &self.stack.items[self.stack.items.len - 1]; - } - } - return Entry{ - .dir = top.dir_it.dir, - .basename = self.name_buffer.items[dirname_len + 1 ..], - .path = self.name_buffer.items, - .kind = base.kind, - }; - } else { - self.stack.pop().dir_it.dir.close(); - } - } - } - - pub fn deinit(self: *Walker) void { - while (self.stack.popOrNull()) |*item| item.dir_it.dir.close(); - self.stack.deinit(); - self.name_buffer.deinit(); - } -}; - -/// Recursively iterates over a directory. -/// Must call `Walker.deinit` when done. -/// `dir_path` must not end in a path separator. -/// The order of returned file system entries is undefined. -pub fn walkPath(allocator: *Allocator, dir_path: []const u8) !Walker { - assert(!mem.endsWith(u8, dir_path, path.sep_str)); - - var dir = try cwd().openDir(dir_path, .{ .iterate = true }); - errdefer dir.close(); - - var name_buffer = std.ArrayList(u8).init(allocator); - errdefer name_buffer.deinit(); - - try name_buffer.appendSlice(dir_path); - - var walker = Walker{ - .stack = std.ArrayList(Walker.StackItem).init(allocator), - .name_buffer = name_buffer, - }; - - try walker.stack.append(Walker.StackItem{ - .dir_it = dir.iterate(), - .dirname_len = dir_path.len, - }); - - return walker; -} +pub const walkPath = @compileError("deprecated: use Dir.walk"); pub const OpenSelfExeError = error{ SharingViolation, @@ -2467,7 +2462,7 @@ pub fn selfExePath(out_buffer: []u8) SelfExePathError![]u8 { } else if (argv0.len != 0) { // argv[0] is not empty (and not a path): search it inside PATH const PATH = std.os.getenvZ("PATH") orelse return error.FileNotFound; - var path_it = mem.tokenize(PATH, &[_]u8{path.delimiter}); + var path_it = mem.tokenize(u8, PATH, &[_]u8{path.delimiter}); while (path_it.next()) |a_path| { var resolved_path_buf: [MAX_PATH_BYTES - 1:0]u8 = undefined; const resolved_path = std.fmt.bufPrintZ(&resolved_path_buf, "{s}/{s}", .{ diff --git a/lib/std/fs/path.zig b/lib/std/fs/path.zig index 04404a61bb..baaadcfe59 100644 --- a/lib/std/fs/path.zig +++ b/lib/std/fs/path.zig @@ -43,17 +43,32 @@ pub fn isSep(byte: u8) bool { fn joinSepMaybeZ(allocator: *Allocator, separator: u8, sepPredicate: fn (u8) bool, paths: []const []const u8, zero: bool) ![]u8 { if (paths.len == 0) return if (zero) try allocator.dupe(u8, &[1]u8{0}) else &[0]u8{}; + // Find first non-empty path index. + const first_path_index = blk: { + for (paths) |path, index| { + if (path.len == 0) continue else break :blk index; + } + + // All paths provided were empty, so return early. + return if (zero) try allocator.dupe(u8, &[1]u8{0}) else &[0]u8{}; + }; + + // Calculate length needed for resulting joined path buffer. const total_len = blk: { - var sum: usize = paths[0].len; - var i: usize = 1; + var sum: usize = paths[first_path_index].len; + var prev_path = paths[first_path_index]; + assert(prev_path.len > 0); + var i: usize = first_path_index + 1; while (i < paths.len) : (i += 1) { - const prev_path = paths[i - 1]; const this_path = paths[i]; - const prev_sep = (prev_path.len != 0 and sepPredicate(prev_path[prev_path.len - 1])); - const this_sep = (this_path.len != 0 and sepPredicate(this_path[0])); + if (this_path.len == 0) continue; + const prev_sep = sepPredicate(prev_path[prev_path.len - 1]); + const this_sep = sepPredicate(this_path[0]); sum += @boolToInt(!prev_sep and !this_sep); sum += if (prev_sep and this_sep) this_path.len - 1 else this_path.len; + prev_path = this_path; } + if (zero) sum += 1; break :blk sum; }; @@ -61,14 +76,16 @@ fn joinSepMaybeZ(allocator: *Allocator, separator: u8, sepPredicate: fn (u8) boo const buf = try allocator.alloc(u8, total_len); errdefer allocator.free(buf); - mem.copy(u8, buf, paths[0]); - var buf_index: usize = paths[0].len; - var i: usize = 1; + mem.copy(u8, buf, paths[first_path_index]); + var buf_index: usize = paths[first_path_index].len; + var prev_path = paths[first_path_index]; + assert(prev_path.len > 0); + var i: usize = first_path_index + 1; while (i < paths.len) : (i += 1) { - const prev_path = paths[i - 1]; const this_path = paths[i]; - const prev_sep = (prev_path.len != 0 and sepPredicate(prev_path[prev_path.len - 1])); - const this_sep = (this_path.len != 0 and sepPredicate(this_path[0])); + if (this_path.len == 0) continue; + const prev_sep = sepPredicate(prev_path[prev_path.len - 1]); + const this_sep = sepPredicate(this_path[0]); if (!prev_sep and !this_sep) { buf[buf_index] = separator; buf_index += 1; @@ -76,6 +93,7 @@ fn joinSepMaybeZ(allocator: *Allocator, separator: u8, sepPredicate: fn (u8) boo const adjusted_path = if (prev_sep and this_sep) this_path[1..] else this_path; mem.copy(u8, buf[buf_index..], adjusted_path); buf_index += adjusted_path.len; + prev_path = this_path; } if (zero) buf[buf.len - 1] = 0; @@ -148,6 +166,10 @@ test "join" { try testJoinMaybeZWindows(&[_][]const u8{ "c:\\", "a", "b/", "c" }, "c:\\a\\b/c", zero); try testJoinMaybeZWindows(&[_][]const u8{ "c:\\a/", "b\\", "/c" }, "c:\\a/b\\c", zero); + try testJoinMaybeZWindows(&[_][]const u8{ "", "c:\\", "", "", "a", "b\\", "c", "" }, "c:\\a\\b\\c", zero); + try testJoinMaybeZWindows(&[_][]const u8{ "c:\\a/", "", "b\\", "", "/c" }, "c:\\a/b\\c", zero); + try testJoinMaybeZWindows(&[_][]const u8{ "", "" }, "", zero); + try testJoinMaybeZPosix(&[_][]const u8{}, "", zero); try testJoinMaybeZPosix(&[_][]const u8{ "/a/b", "c" }, "/a/b/c", zero); try testJoinMaybeZPosix(&[_][]const u8{ "/a/b/", "c" }, "/a/b/c", zero); @@ -163,6 +185,10 @@ test "join" { try testJoinMaybeZPosix(&[_][]const u8{ "a", "/c" }, "a/c", zero); try testJoinMaybeZPosix(&[_][]const u8{ "a/", "/c" }, "a/c", zero); + + try testJoinMaybeZPosix(&[_][]const u8{ "", "/", "a", "", "b/", "c", "" }, "/a/b/c", zero); + try testJoinMaybeZPosix(&[_][]const u8{ "/a/", "", "", "b/", "c" }, "/a/b/c", zero); + try testJoinMaybeZPosix(&[_][]const u8{ "", "" }, "", zero); } } @@ -319,7 +345,7 @@ pub fn windowsParsePath(path: []const u8) WindowsPath { return relative_path; } - var it = mem.tokenize(path, &[_]u8{this_sep}); + var it = mem.tokenize(u8, path, &[_]u8{this_sep}); _ = (it.next() orelse return relative_path); _ = (it.next() orelse return relative_path); return WindowsPath{ @@ -381,8 +407,8 @@ fn networkShareServersEql(ns1: []const u8, ns2: []const u8) bool { const sep1 = ns1[0]; const sep2 = ns2[0]; - var it1 = mem.tokenize(ns1, &[_]u8{sep1}); - var it2 = mem.tokenize(ns2, &[_]u8{sep2}); + var it1 = mem.tokenize(u8, ns1, &[_]u8{sep1}); + var it2 = mem.tokenize(u8, ns2, &[_]u8{sep2}); // TODO ASCII is wrong, we actually need full unicode support to compare paths. return asciiEqlIgnoreCase(it1.next().?, it2.next().?); @@ -402,8 +428,8 @@ fn compareDiskDesignators(kind: WindowsPath.Kind, p1: []const u8, p2: []const u8 const sep1 = p1[0]; const sep2 = p2[0]; - var it1 = mem.tokenize(p1, &[_]u8{sep1}); - var it2 = mem.tokenize(p2, &[_]u8{sep2}); + var it1 = mem.tokenize(u8, p1, &[_]u8{sep1}); + var it2 = mem.tokenize(u8, p2, &[_]u8{sep2}); // TODO ASCII is wrong, we actually need full unicode support to compare paths. return asciiEqlIgnoreCase(it1.next().?, it2.next().?) and asciiEqlIgnoreCase(it1.next().?, it2.next().?); @@ -525,7 +551,7 @@ pub fn resolveWindows(allocator: *Allocator, paths: []const []const u8) ![]u8 { }, WindowsPath.Kind.NetworkShare => { result = try allocator.alloc(u8, max_size); - var it = mem.tokenize(paths[first_index], "/\\"); + var it = mem.tokenize(u8, paths[first_index], "/\\"); const server_name = it.next().?; const other_name = it.next().?; @@ -592,7 +618,7 @@ pub fn resolveWindows(allocator: *Allocator, paths: []const []const u8) ![]u8 { if (!correct_disk_designator) { continue; } - var it = mem.tokenize(p[parsed.disk_designator.len..], "/\\"); + var it = mem.tokenize(u8, p[parsed.disk_designator.len..], "/\\"); while (it.next()) |component| { if (mem.eql(u8, component, ".")) { continue; @@ -661,7 +687,7 @@ pub fn resolvePosix(allocator: *Allocator, paths: []const []const u8) ![]u8 { errdefer allocator.free(result); for (paths[first_index..]) |p| { - var it = mem.tokenize(p, "/"); + var it = mem.tokenize(u8, p, "/"); while (it.next()) |component| { if (mem.eql(u8, component, ".")) { continue; @@ -1075,8 +1101,8 @@ pub fn relativeWindows(allocator: *Allocator, from: []const u8, to: []const u8) return resolved_to; } - var from_it = mem.tokenize(resolved_from, "/\\"); - var to_it = mem.tokenize(resolved_to, "/\\"); + var from_it = mem.tokenize(u8, resolved_from, "/\\"); + var to_it = mem.tokenize(u8, resolved_to, "/\\"); while (true) { const from_component = from_it.next() orelse return allocator.dupe(u8, to_it.rest()); const to_rest = to_it.rest(); @@ -1105,7 +1131,7 @@ pub fn relativeWindows(allocator: *Allocator, from: []const u8, to: []const u8) // shave off the trailing slash result_index -= 1; - var rest_it = mem.tokenize(to_rest, "/\\"); + var rest_it = mem.tokenize(u8, to_rest, "/\\"); while (rest_it.next()) |to_component| { result[result_index] = '\\'; result_index += 1; @@ -1126,8 +1152,8 @@ pub fn relativePosix(allocator: *Allocator, from: []const u8, to: []const u8) ![ const resolved_to = try resolvePosix(allocator, &[_][]const u8{to}); defer allocator.free(resolved_to); - var from_it = mem.tokenize(resolved_from, "/"); - var to_it = mem.tokenize(resolved_to, "/"); + var from_it = mem.tokenize(u8, resolved_from, "/"); + var to_it = mem.tokenize(u8, resolved_to, "/"); while (true) { const from_component = from_it.next() orelse return allocator.dupe(u8, to_it.rest()); const to_rest = to_it.rest(); diff --git a/lib/std/fs/test.zig b/lib/std/fs/test.zig index 9464959cdb..54f3e238d3 100644 --- a/lib/std/fs/test.zig +++ b/lib/std/fs/test.zig @@ -927,8 +927,9 @@ test "walker" { } const tmp_path = try fs.path.join(allocator, &[_][]const u8{ "zig-cache", "tmp", tmp.sub_path[0..] }); + const tmp_dir = try fs.cwd().openDir(tmp_path, .{ .iterate = true }); - var walker = try fs.walkPath(testing.allocator, tmp_path); + var walker = try tmp_dir.walk(testing.allocator); defer walker.deinit(); i = 0; @@ -941,7 +942,7 @@ test "walker" { try fs.path.join(allocator, &[_][]const u8{ expected_dir_name, name }); var entry = (try walker.next()).?; - try testing.expectEqualStrings(expected_dir_name, try fs.path.relative(allocator, tmp_path, entry.path)); + try testing.expectEqualStrings(expected_dir_name, entry.path); } } diff --git a/lib/std/hash_map.zig b/lib/std/hash_map.zig index ef97e7d7fa..77d2df2efe 100644 --- a/lib/std/hash_map.zig +++ b/lib/std/hash_map.zig @@ -563,7 +563,7 @@ pub fn HashMap( return self.unmanaged.getPtrContext(key, self.ctx); } pub fn getPtrAdapted(self: Self, key: anytype, ctx: anytype) ?*V { - return self.unmanaged.getPtrAdapted(key, self.ctx); + return self.unmanaged.getPtrAdapted(key, ctx); } /// Finds the key and value associated with a key in the map diff --git a/lib/std/mem.zig b/lib/std/mem.zig index 75cb4dd9d0..93d425b692 100644 --- a/lib/std/mem.zig +++ b/lib/std/mem.zig @@ -1575,8 +1575,8 @@ test "bswapAllFields" { /// If `delimiter_bytes` does not exist in buffer, /// the iterator will return `buffer`, null, in that order. /// See also the related function `split`. -pub fn tokenize(buffer: []const u8, delimiter_bytes: []const u8) TokenIterator { - return TokenIterator{ +pub fn tokenize(comptime T: type, buffer: []const T, delimiter_bytes: []const T) TokenIterator(T) { + return .{ .index = 0, .buffer = buffer, .delimiter_bytes = delimiter_bytes, @@ -1584,51 +1584,71 @@ pub fn tokenize(buffer: []const u8, delimiter_bytes: []const u8) TokenIterator { } test "mem.tokenize" { - var it = tokenize(" abc def ghi ", " "); + var it = tokenize(u8, " abc def ghi ", " "); try testing.expect(eql(u8, it.next().?, "abc")); try testing.expect(eql(u8, it.next().?, "def")); try testing.expect(eql(u8, it.next().?, "ghi")); try testing.expect(it.next() == null); - it = tokenize("..\\bob", "\\"); + it = tokenize(u8, "..\\bob", "\\"); try testing.expect(eql(u8, it.next().?, "..")); try testing.expect(eql(u8, "..", "..\\bob"[0..it.index])); try testing.expect(eql(u8, it.next().?, "bob")); try testing.expect(it.next() == null); - it = tokenize("//a/b", "/"); + it = tokenize(u8, "//a/b", "/"); try testing.expect(eql(u8, it.next().?, "a")); try testing.expect(eql(u8, it.next().?, "b")); try testing.expect(eql(u8, "//a/b", "//a/b"[0..it.index])); try testing.expect(it.next() == null); - it = tokenize("|", "|"); + it = tokenize(u8, "|", "|"); try testing.expect(it.next() == null); - it = tokenize("", "|"); + it = tokenize(u8, "", "|"); try testing.expect(it.next() == null); - it = tokenize("hello", ""); + it = tokenize(u8, "hello", ""); try testing.expect(eql(u8, it.next().?, "hello")); try testing.expect(it.next() == null); - it = tokenize("hello", " "); + it = tokenize(u8, "hello", " "); try testing.expect(eql(u8, it.next().?, "hello")); try testing.expect(it.next() == null); + + var it16 = tokenize( + u16, + std.unicode.utf8ToUtf16LeStringLiteral("hello"), + std.unicode.utf8ToUtf16LeStringLiteral(" "), + ); + try testing.expect(eql(u16, it16.next().?, std.unicode.utf8ToUtf16LeStringLiteral("hello"))); + try testing.expect(it16.next() == null); } test "mem.tokenize (multibyte)" { - var it = tokenize("a|b,c/d e", " /,|"); + var it = tokenize(u8, "a|b,c/d e", " /,|"); try testing.expect(eql(u8, it.next().?, "a")); try testing.expect(eql(u8, it.next().?, "b")); try testing.expect(eql(u8, it.next().?, "c")); try testing.expect(eql(u8, it.next().?, "d")); try testing.expect(eql(u8, it.next().?, "e")); try testing.expect(it.next() == null); + + var it16 = tokenize( + u16, + std.unicode.utf8ToUtf16LeStringLiteral("a|b,c/d e"), + std.unicode.utf8ToUtf16LeStringLiteral(" /,|"), + ); + try testing.expect(eql(u16, it16.next().?, std.unicode.utf8ToUtf16LeStringLiteral("a"))); + try testing.expect(eql(u16, it16.next().?, std.unicode.utf8ToUtf16LeStringLiteral("b"))); + try testing.expect(eql(u16, it16.next().?, std.unicode.utf8ToUtf16LeStringLiteral("c"))); + try testing.expect(eql(u16, it16.next().?, std.unicode.utf8ToUtf16LeStringLiteral("d"))); + try testing.expect(eql(u16, it16.next().?, std.unicode.utf8ToUtf16LeStringLiteral("e"))); + try testing.expect(it16.next() == null); } test "mem.tokenize (reset)" { - var it = tokenize(" abc def ghi ", " "); + var it = tokenize(u8, " abc def ghi ", " "); try testing.expect(eql(u8, it.next().?, "abc")); try testing.expect(eql(u8, it.next().?, "def")); try testing.expect(eql(u8, it.next().?, "ghi")); @@ -1649,9 +1669,9 @@ test "mem.tokenize (reset)" { /// the iterator will return `buffer`, null, in that order. /// The delimiter length must not be zero. /// See also the related function `tokenize`. -pub fn split(buffer: []const u8, delimiter: []const u8) SplitIterator { +pub fn split(comptime T: type, buffer: []const T, delimiter: []const T) SplitIterator(T) { assert(delimiter.len != 0); - return SplitIterator{ + return .{ .index = 0, .buffer = buffer, .delimiter = delimiter, @@ -1661,35 +1681,55 @@ pub fn split(buffer: []const u8, delimiter: []const u8) SplitIterator { pub const separate = @compileError("deprecated: renamed to split (behavior remains unchanged)"); test "mem.split" { - var it = split("abc|def||ghi", "|"); + var it = split(u8, "abc|def||ghi", "|"); try testing.expect(eql(u8, it.next().?, "abc")); try testing.expect(eql(u8, it.next().?, "def")); try testing.expect(eql(u8, it.next().?, "")); try testing.expect(eql(u8, it.next().?, "ghi")); try testing.expect(it.next() == null); - it = split("", "|"); + it = split(u8, "", "|"); try testing.expect(eql(u8, it.next().?, "")); try testing.expect(it.next() == null); - it = split("|", "|"); + it = split(u8, "|", "|"); try testing.expect(eql(u8, it.next().?, "")); try testing.expect(eql(u8, it.next().?, "")); try testing.expect(it.next() == null); - it = split("hello", " "); + it = split(u8, "hello", " "); try testing.expect(eql(u8, it.next().?, "hello")); try testing.expect(it.next() == null); + + var it16 = split( + u16, + std.unicode.utf8ToUtf16LeStringLiteral("hello"), + std.unicode.utf8ToUtf16LeStringLiteral(" "), + ); + try testing.expect(eql(u16, it16.next().?, std.unicode.utf8ToUtf16LeStringLiteral("hello"))); + try testing.expect(it16.next() == null); } test "mem.split (multibyte)" { - var it = split("a, b ,, c, d, e", ", "); + var it = split(u8, "a, b ,, c, d, e", ", "); try testing.expect(eql(u8, it.next().?, "a")); try testing.expect(eql(u8, it.next().?, "b ,")); try testing.expect(eql(u8, it.next().?, "c")); try testing.expect(eql(u8, it.next().?, "d")); try testing.expect(eql(u8, it.next().?, "e")); try testing.expect(it.next() == null); + + var it16 = split( + u16, + std.unicode.utf8ToUtf16LeStringLiteral("a, b ,, c, d, e"), + std.unicode.utf8ToUtf16LeStringLiteral(", "), + ); + try testing.expect(eql(u16, it16.next().?, std.unicode.utf8ToUtf16LeStringLiteral("a"))); + try testing.expect(eql(u16, it16.next().?, std.unicode.utf8ToUtf16LeStringLiteral("b ,"))); + try testing.expect(eql(u16, it16.next().?, std.unicode.utf8ToUtf16LeStringLiteral("c"))); + try testing.expect(eql(u16, it16.next().?, std.unicode.utf8ToUtf16LeStringLiteral("d"))); + try testing.expect(eql(u16, it16.next().?, std.unicode.utf8ToUtf16LeStringLiteral("e"))); + try testing.expect(it16.next() == null); } pub fn startsWith(comptime T: type, haystack: []const T, needle: []const T) bool { @@ -1710,75 +1750,83 @@ test "mem.endsWith" { try testing.expect(!endsWith(u8, "Bob", "Bo")); } -pub const TokenIterator = struct { - buffer: []const u8, - delimiter_bytes: []const u8, - index: usize, +pub fn TokenIterator(comptime T: type) type { + return struct { + buffer: []const T, + delimiter_bytes: []const T, + index: usize, - /// Returns a slice of the next token, or null if tokenization is complete. - pub fn next(self: *TokenIterator) ?[]const u8 { - // move to beginning of token - while (self.index < self.buffer.len and self.isSplitByte(self.buffer[self.index])) : (self.index += 1) {} - const start = self.index; - if (start == self.buffer.len) { - return null; - } + const Self = @This(); - // move to end of token - while (self.index < self.buffer.len and !self.isSplitByte(self.buffer[self.index])) : (self.index += 1) {} - const end = self.index; - - return self.buffer[start..end]; - } - - /// Returns a slice of the remaining bytes. Does not affect iterator state. - pub fn rest(self: TokenIterator) []const u8 { - // move to beginning of token - var index: usize = self.index; - while (index < self.buffer.len and self.isSplitByte(self.buffer[index])) : (index += 1) {} - return self.buffer[index..]; - } - - /// Resets the iterator to the initial token. - pub fn reset(self: *TokenIterator) void { - self.index = 0; - } - - fn isSplitByte(self: TokenIterator, byte: u8) bool { - for (self.delimiter_bytes) |delimiter_byte| { - if (byte == delimiter_byte) { - return true; + /// Returns a slice of the next token, or null if tokenization is complete. + pub fn next(self: *Self) ?[]const T { + // move to beginning of token + while (self.index < self.buffer.len and self.isSplitByte(self.buffer[self.index])) : (self.index += 1) {} + const start = self.index; + if (start == self.buffer.len) { + return null; } + + // move to end of token + while (self.index < self.buffer.len and !self.isSplitByte(self.buffer[self.index])) : (self.index += 1) {} + const end = self.index; + + return self.buffer[start..end]; } - return false; - } -}; -pub const SplitIterator = struct { - buffer: []const u8, - index: ?usize, - delimiter: []const u8, + /// Returns a slice of the remaining bytes. Does not affect iterator state. + pub fn rest(self: Self) []const T { + // move to beginning of token + var index: usize = self.index; + while (index < self.buffer.len and self.isSplitByte(self.buffer[index])) : (index += 1) {} + return self.buffer[index..]; + } - /// Returns a slice of the next field, or null if splitting is complete. - pub fn next(self: *SplitIterator) ?[]const u8 { - const start = self.index orelse return null; - const end = if (indexOfPos(u8, self.buffer, start, self.delimiter)) |delim_start| blk: { - self.index = delim_start + self.delimiter.len; - break :blk delim_start; - } else blk: { - self.index = null; - break :blk self.buffer.len; - }; - return self.buffer[start..end]; - } + /// Resets the iterator to the initial token. + pub fn reset(self: *Self) void { + self.index = 0; + } - /// Returns a slice of the remaining bytes. Does not affect iterator state. - pub fn rest(self: SplitIterator) []const u8 { - const end = self.buffer.len; - const start = self.index orelse end; - return self.buffer[start..end]; - } -}; + fn isSplitByte(self: Self, byte: T) bool { + for (self.delimiter_bytes) |delimiter_byte| { + if (byte == delimiter_byte) { + return true; + } + } + return false; + } + }; +} + +pub fn SplitIterator(comptime T: type) type { + return struct { + buffer: []const T, + index: ?usize, + delimiter: []const T, + + const Self = @This(); + + /// Returns a slice of the next field, or null if splitting is complete. + pub fn next(self: *Self) ?[]const T { + const start = self.index orelse return null; + const end = if (indexOfPos(T, self.buffer, start, self.delimiter)) |delim_start| blk: { + self.index = delim_start + self.delimiter.len; + break :blk delim_start; + } else blk: { + self.index = null; + break :blk self.buffer.len; + }; + return self.buffer[start..end]; + } + + /// Returns a slice of the remaining bytes. Does not affect iterator state. + pub fn rest(self: Self) []const T { + const end = self.buffer.len; + const start = self.index orelse end; + return self.buffer[start..end]; + } + }; +} /// Naively combines a series of slices with a separator. /// Allocates memory for the result, which must be freed by the caller. diff --git a/lib/std/net.zig b/lib/std/net.zig index 46d9bee15d..1b53399fd1 100644 --- a/lib/std/net.zig +++ b/lib/std/net.zig @@ -1130,9 +1130,9 @@ fn linuxLookupNameFromHosts( }, else => |e| return e, }) |line| { - const no_comment_line = mem.split(line, "#").next().?; + const no_comment_line = mem.split(u8, line, "#").next().?; - var line_it = mem.tokenize(no_comment_line, " \t"); + var line_it = mem.tokenize(u8, no_comment_line, " \t"); const ip_text = line_it.next() orelse continue; var first_name_text: ?[]const u8 = null; while (line_it.next()) |name_text| { @@ -1211,7 +1211,7 @@ fn linuxLookupNameFromDnsSearch( mem.copy(u8, canon.items, canon_name); try canon.append('.'); - var tok_it = mem.tokenize(search, " \t"); + var tok_it = mem.tokenize(u8, search, " \t"); while (tok_it.next()) |tok| { canon.shrinkRetainingCapacity(canon_name.len + 1); try canon.appendSlice(tok); @@ -1328,13 +1328,13 @@ fn getResolvConf(allocator: *mem.Allocator, rc: *ResolvConf) !void { }, else => |e| return e, }) |line| { - const no_comment_line = mem.split(line, "#").next().?; - var line_it = mem.tokenize(no_comment_line, " \t"); + const no_comment_line = mem.split(u8, line, "#").next().?; + var line_it = mem.tokenize(u8, no_comment_line, " \t"); const token = line_it.next() orelse continue; if (mem.eql(u8, token, "options")) { while (line_it.next()) |sub_tok| { - var colon_it = mem.split(sub_tok, ":"); + var colon_it = mem.split(u8, sub_tok, ":"); const name = colon_it.next().?; const value_txt = colon_it.next() orelse continue; const value = std.fmt.parseInt(u8, value_txt, 10) catch |err| switch (err) { diff --git a/lib/std/os.zig b/lib/std/os.zig index 7ba247419a..5735539366 100644 --- a/lib/std/os.zig +++ b/lib/std/os.zig @@ -1378,7 +1378,7 @@ pub fn execvpeZ_expandArg0( // Use of MAX_PATH_BYTES here is valid as the path_buf will be passed // directly to the operating system in execveZ. var path_buf: [MAX_PATH_BYTES]u8 = undefined; - var it = mem.tokenize(PATH, ":"); + var it = mem.tokenize(u8, PATH, ":"); var seen_eacces = false; var err: ExecveError = undefined; diff --git a/lib/std/os/bits.zig b/lib/std/os/bits.zig index 5d1de28bad..5c39609182 100644 --- a/lib/std/os/bits.zig +++ b/lib/std/os/bits.zig @@ -25,32 +25,3 @@ pub usingnamespace switch (std.Target.current.os.tag) { }; pub usingnamespace if (@hasDecl(root, "os") and @hasDecl(root.os, "bits")) root.os.bits else struct {}; - -pub const iovec = extern struct { - iov_base: [*]u8, - iov_len: usize, -}; - -pub const iovec_const = extern struct { - iov_base: [*]const u8, - iov_len: usize, -}; - -// syslog - -/// system is unusable -pub const LOG_EMERG = 0; -/// action must be taken immediately -pub const LOG_ALERT = 1; -/// critical conditions -pub const LOG_CRIT = 2; -/// error conditions -pub const LOG_ERR = 3; -/// warning conditions -pub const LOG_WARNING = 4; -/// normal but significant condition -pub const LOG_NOTICE = 5; -/// informational -pub const LOG_INFO = 6; -/// debug-level messages -pub const LOG_DEBUG = 7; diff --git a/lib/std/os/bits/darwin.zig b/lib/std/os/bits/darwin.zig index be77722c05..91705c0d2e 100644 --- a/lib/std/os/bits/darwin.zig +++ b/lib/std/os/bits/darwin.zig @@ -7,6 +7,8 @@ const std = @import("../../std.zig"); const assert = std.debug.assert; const maxInt = std.math.maxInt; +pub usingnamespace @import("posix.zig"); + // See: https://opensource.apple.com/source/xnu/xnu-6153.141.1/bsd/sys/_types.h.auto.html // TODO: audit mode_t/pid_t, should likely be u16/i32 pub const fd_t = c_int; diff --git a/lib/std/os/bits/dragonfly.zig b/lib/std/os/bits/dragonfly.zig index 9f6d3088ba..573721749c 100644 --- a/lib/std/os/bits/dragonfly.zig +++ b/lib/std/os/bits/dragonfly.zig @@ -6,6 +6,8 @@ const std = @import("../../std.zig"); const maxInt = std.math.maxInt; +pub usingnamespace @import("posix.zig"); + pub fn S_ISCHR(m: u32) bool { return m & S_IFMT == S_IFCHR; } diff --git a/lib/std/os/bits/freebsd.zig b/lib/std/os/bits/freebsd.zig index 6d227a168a..1805941993 100644 --- a/lib/std/os/bits/freebsd.zig +++ b/lib/std/os/bits/freebsd.zig @@ -7,6 +7,8 @@ const std = @import("../../std.zig"); const builtin = @import("builtin"); const maxInt = std.math.maxInt; +pub usingnamespace @import("posix.zig"); + pub const blksize_t = i32; pub const blkcnt_t = i64; pub const clockid_t = i32; diff --git a/lib/std/os/bits/haiku.zig b/lib/std/os/bits/haiku.zig index cb31166608..b3ea4aa0e2 100644 --- a/lib/std/os/bits/haiku.zig +++ b/lib/std/os/bits/haiku.zig @@ -6,6 +6,8 @@ const std = @import("../../std.zig"); const maxInt = std.math.maxInt; +pub usingnamespace @import("posix.zig"); + pub const fd_t = c_int; pub const pid_t = c_int; pub const uid_t = u32; diff --git a/lib/std/os/bits/linux.zig b/lib/std/os/bits/linux.zig index 81bdfa6608..fdf240e954 100644 --- a/lib/std/os/bits/linux.zig +++ b/lib/std/os/bits/linux.zig @@ -6,7 +6,7 @@ const std = @import("../../std.zig"); const maxInt = std.math.maxInt; const arch = @import("builtin").target.cpu.arch; -usingnamespace @import("../bits.zig"); +pub usingnamespace @import("posix.zig"); pub usingnamespace switch (arch) { .mips, .mipsel => @import("linux/errno-mips.zig"), @@ -119,6 +119,9 @@ pub const FUTEX_LOCK_PI = 6; pub const FUTEX_UNLOCK_PI = 7; pub const FUTEX_TRYLOCK_PI = 8; pub const FUTEX_WAIT_BITSET = 9; +pub const FUTEX_WAKE_BITSET = 10; +pub const FUTEX_WAIT_REQUEUE_PI = 11; +pub const FUTEX_CMP_REQUEUE_PI = 12; pub const FUTEX_PRIVATE_FLAG = 128; diff --git a/lib/std/os/bits/netbsd.zig b/lib/std/os/bits/netbsd.zig index d0240709e3..f3ece93493 100644 --- a/lib/std/os/bits/netbsd.zig +++ b/lib/std/os/bits/netbsd.zig @@ -7,6 +7,8 @@ const std = @import("../../std.zig"); const builtin = std.builtin; const maxInt = std.math.maxInt; +pub usingnamespace @import("posix.zig"); + pub const blkcnt_t = i64; pub const blksize_t = i32; pub const clock_t = u32; diff --git a/lib/std/os/bits/openbsd.zig b/lib/std/os/bits/openbsd.zig index 3b9f8ccd4a..233ebcbd68 100644 --- a/lib/std/os/bits/openbsd.zig +++ b/lib/std/os/bits/openbsd.zig @@ -7,6 +7,8 @@ const std = @import("../../std.zig"); const builtin = std.builtin; const maxInt = std.math.maxInt; +pub usingnamespace @import("posix.zig"); + pub const blkcnt_t = i64; pub const blksize_t = i32; pub const clock_t = i64; diff --git a/lib/std/os/bits/posix.zig b/lib/std/os/bits/posix.zig new file mode 100644 index 0000000000..0f015cd573 --- /dev/null +++ b/lib/std/os/bits/posix.zig @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2015-2021 Zig Contributors +// This file is part of [zig](https://ziglang.org/), which is MIT licensed. +// The MIT license requires this copyright notice to be included in all copies +// and substantial portions of the software. + +pub const iovec = extern struct { + iov_base: [*]u8, + iov_len: usize, +}; + +pub const iovec_const = extern struct { + iov_base: [*]const u8, + iov_len: usize, +}; + +// syslog + +/// system is unusable +pub const LOG_EMERG = 0; +/// action must be taken immediately +pub const LOG_ALERT = 1; +/// critical conditions +pub const LOG_CRIT = 2; +/// error conditions +pub const LOG_ERR = 3; +/// warning conditions +pub const LOG_WARNING = 4; +/// normal but significant condition +pub const LOG_NOTICE = 5; +/// informational +pub const LOG_INFO = 6; +/// debug-level messages +pub const LOG_DEBUG = 7; diff --git a/lib/std/os/bits/wasi.zig b/lib/std/os/bits/wasi.zig index 3f5b25c679..5102d9b439 100644 --- a/lib/std/os/bits/wasi.zig +++ b/lib/std/os/bits/wasi.zig @@ -5,6 +5,9 @@ // and substantial portions of the software. // Convenience types and consts used by std.os module const builtin = @import("builtin"); +const posix = @import("posix.zig"); +pub const iovec = posix.iovec; +pub const iovec_const = posix.iovec_const; pub const STDIN_FILENO = 0; pub const STDOUT_FILENO = 1; diff --git a/lib/std/os/bits/windows.zig b/lib/std/os/bits/windows.zig index c5b101296b..05c50ffe47 100644 --- a/lib/std/os/bits/windows.zig +++ b/lib/std/os/bits/windows.zig @@ -8,6 +8,11 @@ usingnamespace @import("../windows/bits.zig"); const ws2_32 = @import("../windows/ws2_32.zig"); +// TODO: Stop using os.iovec in std.fs et al on Windows in the future +const posix = @import("posix.zig"); +pub const iovec = posix.iovec; +pub const iovec_const = posix.iovec_const; + pub const fd_t = HANDLE; pub const ino_t = LARGE_INTEGER; pub const pid_t = HANDLE; diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index ef7c0ff077..ca8f0907e1 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -253,6 +253,18 @@ pub fn mkdirat(dirfd: i32, path: [*:0]const u8, mode: u32) usize { return syscall3(.mkdirat, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), mode); } +pub fn mknod(path: [*:0]const u8, mode: u32, dev: u32) usize { + if (@hasField(SYS, "mknod")) { + return syscall3(.mknod, @ptrToInt(path), mode, dev); + } else { + return mknodat(AT_FDCWD, path, mode, dev); + } +} + +pub fn mknodat(dirfd: i32, path: [*:0]const u8, mode: u32, dev: u32) usize { + return syscall4(.mknodat, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), mode, dev); +} + pub fn mount(special: [*:0]const u8, dir: [*:0]const u8, fstype: [*:0]const u8, flags: u32, data: usize) usize { return syscall5(.mount, @ptrToInt(special), @ptrToInt(dir), @ptrToInt(fstype), flags, data); } diff --git a/lib/std/os/linux/arm-eabi.zig b/lib/std/os/linux/arm-eabi.zig index bac7048615..469b7299d1 100644 --- a/lib/std/os/linux/arm-eabi.zig +++ b/lib/std/os/linux/arm-eabi.zig @@ -3,7 +3,7 @@ // This file is part of [zig](https://ziglang.org/), which is MIT licensed. // The MIT license requires this copyright notice to be included in all copies // and substantial portions of the software. -usingnamespace @import("../bits.zig"); +usingnamespace @import("../bits/linux.zig"); pub fn syscall0(number: SYS) usize { return asm volatile ("svc #0" diff --git a/lib/std/os/linux/arm64.zig b/lib/std/os/linux/arm64.zig index dd5c3ef3af..4c8306c048 100644 --- a/lib/std/os/linux/arm64.zig +++ b/lib/std/os/linux/arm64.zig @@ -3,7 +3,7 @@ // This file is part of [zig](https://ziglang.org/), which is MIT licensed. // The MIT license requires this copyright notice to be included in all copies // and substantial portions of the software. -usingnamespace @import("../bits.zig"); +usingnamespace @import("../bits/linux.zig"); pub fn syscall0(number: SYS) usize { return asm volatile ("svc #0" diff --git a/lib/std/os/linux/i386.zig b/lib/std/os/linux/i386.zig index c1ac6938fb..2ec34bac40 100644 --- a/lib/std/os/linux/i386.zig +++ b/lib/std/os/linux/i386.zig @@ -3,7 +3,7 @@ // This file is part of [zig](https://ziglang.org/), which is MIT licensed. // The MIT license requires this copyright notice to be included in all copies // and substantial portions of the software. -usingnamespace @import("../bits.zig"); +usingnamespace @import("../bits/linux.zig"); pub fn syscall0(number: SYS) usize { return asm volatile ("int $0x80" diff --git a/lib/std/os/linux/mips.zig b/lib/std/os/linux/mips.zig index a04a592f3b..85157f04f8 100644 --- a/lib/std/os/linux/mips.zig +++ b/lib/std/os/linux/mips.zig @@ -3,7 +3,7 @@ // This file is part of [zig](https://ziglang.org/), which is MIT licensed. // The MIT license requires this copyright notice to be included in all copies // and substantial portions of the software. -usingnamespace @import("../bits.zig"); +usingnamespace @import("../bits/linux.zig"); pub fn syscall0(number: SYS) usize { return asm volatile ( diff --git a/lib/std/os/linux/powerpc.zig b/lib/std/os/linux/powerpc.zig index 567ad2bc1f..611eee1c5f 100644 --- a/lib/std/os/linux/powerpc.zig +++ b/lib/std/os/linux/powerpc.zig @@ -4,7 +4,7 @@ // The MIT license requires this copyright notice to be included in all copies // and substantial portions of the software. -usingnamespace @import("../bits.zig"); +usingnamespace @import("../bits/linux.zig"); pub fn syscall0(number: SYS) usize { return asm volatile ( diff --git a/lib/std/os/linux/powerpc64.zig b/lib/std/os/linux/powerpc64.zig index 567ad2bc1f..611eee1c5f 100644 --- a/lib/std/os/linux/powerpc64.zig +++ b/lib/std/os/linux/powerpc64.zig @@ -4,7 +4,7 @@ // The MIT license requires this copyright notice to be included in all copies // and substantial portions of the software. -usingnamespace @import("../bits.zig"); +usingnamespace @import("../bits/linux.zig"); pub fn syscall0(number: SYS) usize { return asm volatile ( diff --git a/lib/std/os/linux/riscv64.zig b/lib/std/os/linux/riscv64.zig index d58e080407..3e2b15b599 100644 --- a/lib/std/os/linux/riscv64.zig +++ b/lib/std/os/linux/riscv64.zig @@ -3,7 +3,7 @@ // This file is part of [zig](https://ziglang.org/), which is MIT licensed. // The MIT license requires this copyright notice to be included in all copies // and substantial portions of the software. -usingnamespace @import("../bits.zig"); +usingnamespace @import("../bits/linux.zig"); pub fn syscall0(number: SYS) usize { return asm volatile ("ecall" diff --git a/lib/std/os/linux/sparc64.zig b/lib/std/os/linux/sparc64.zig index 902940071e..f347a0e88e 100644 --- a/lib/std/os/linux/sparc64.zig +++ b/lib/std/os/linux/sparc64.zig @@ -1,4 +1,4 @@ -usingnamespace @import("../bits.zig"); +usingnamespace @import("../bits/linux.zig"); pub fn syscall_pipe(fd: *[2]i32) usize { return asm volatile ( diff --git a/lib/std/os/linux/thumb.zig b/lib/std/os/linux/thumb.zig index 5db9d2cbf4..85f8bfc52b 100644 --- a/lib/std/os/linux/thumb.zig +++ b/lib/std/os/linux/thumb.zig @@ -3,7 +3,7 @@ // This file is part of [zig](https://ziglang.org/), which is MIT licensed. // The MIT license requires this copyright notice to be included in all copies // and substantial portions of the software. -usingnamespace @import("../bits.zig"); +usingnamespace @import("../bits/linux.zig"); // The syscall interface is identical to the ARM one but we're facing an extra // challenge: r7, the register where the syscall number is stored, may be diff --git a/lib/std/os/linux/x86_64.zig b/lib/std/os/linux/x86_64.zig index b9b3ff47eb..5aa32c56c3 100644 --- a/lib/std/os/linux/x86_64.zig +++ b/lib/std/os/linux/x86_64.zig @@ -3,7 +3,7 @@ // This file is part of [zig](https://ziglang.org/), which is MIT licensed. // The MIT license requires this copyright notice to be included in all copies // and substantial portions of the software. -usingnamespace @import("../bits.zig"); +usingnamespace @import("../bits/linux.zig"); pub fn syscall0(number: SYS) usize { return asm volatile ("syscall" diff --git a/lib/std/os/windows.zig b/lib/std/os/windows.zig index cbd4ce065b..04ce433758 100644 --- a/lib/std/os/windows.zig +++ b/lib/std/os/windows.zig @@ -1631,6 +1631,10 @@ pub fn HeapDestroy(hHeap: HANDLE) void { assert(kernel32.HeapDestroy(hHeap) != 0); } +pub fn LocalFree(hMem: HLOCAL) void { + assert(kernel32.LocalFree(hMem) == null); +} + pub const GetFileInformationByHandleError = error{Unexpected}; pub fn GetFileInformationByHandle( @@ -2011,6 +2015,21 @@ pub fn unexpectedStatus(status: NTSTATUS) std.os.UnexpectedError { return error.Unexpected; } +pub fn SetThreadDescription(hThread: HANDLE, lpThreadDescription: LPCWSTR) !void { + if (kernel32.SetThreadDescription(hThread, lpThreadDescription) == 0) { + switch (kernel32.GetLastError()) { + else => |err| return unexpectedError(err), + } + } +} +pub fn GetThreadDescription(hThread: HANDLE, ppszThreadDescription: *LPWSTR) !void { + if (kernel32.GetThreadDescription(hThread, ppszThreadDescription) == 0) { + switch (kernel32.GetLastError()) { + else => |err| return unexpectedError(err), + } + } +} + test "" { if (builtin.os.tag == .windows) { _ = @import("windows/test.zig"); diff --git a/lib/std/os/windows/kernel32.zig b/lib/std/os/windows/kernel32.zig index 971273ef3a..a04314324d 100644 --- a/lib/std/os/windows/kernel32.zig +++ b/lib/std/os/windows/kernel32.zig @@ -192,6 +192,8 @@ pub extern "kernel32" fn HeapValidate(hHeap: HANDLE, dwFlags: DWORD, lpMem: ?*co pub extern "kernel32" fn VirtualAlloc(lpAddress: ?LPVOID, dwSize: SIZE_T, flAllocationType: DWORD, flProtect: DWORD) callconv(WINAPI) ?LPVOID; pub extern "kernel32" fn VirtualFree(lpAddress: ?LPVOID, dwSize: SIZE_T, dwFreeType: DWORD) callconv(WINAPI) BOOL; +pub extern "kernel32" fn LocalFree(hMem: HLOCAL) callconv(WINAPI) ?HLOCAL; + pub extern "kernel32" fn MoveFileExW( lpExistingFileName: [*:0]const u16, lpNewFileName: [*:0]const u16, @@ -342,3 +344,6 @@ pub extern "kernel32" fn SleepConditionVariableSRW( pub extern "kernel32" fn TryAcquireSRWLockExclusive(s: *SRWLOCK) callconv(WINAPI) BOOLEAN; pub extern "kernel32" fn AcquireSRWLockExclusive(s: *SRWLOCK) callconv(WINAPI) void; pub extern "kernel32" fn ReleaseSRWLockExclusive(s: *SRWLOCK) callconv(WINAPI) void; + +pub extern "kernel32" fn SetThreadDescription(hThread: HANDLE, lpThreadDescription: LPCWSTR) callconv(WINAPI) HRESULT; +pub extern "kernel32" fn GetThreadDescription(hThread: HANDLE, ppszThreadDescription: *LPWSTR) callconv(WINAPI) HRESULT; diff --git a/lib/std/process.zig b/lib/std/process.zig index 34b12fd8f8..47e800c124 100644 --- a/lib/std/process.zig +++ b/lib/std/process.zig @@ -109,7 +109,7 @@ pub fn getEnvMap(allocator: *Allocator) !BufMap { for (environ) |env| { const pair = mem.spanZ(env); - var parts = mem.split(pair, "="); + var parts = mem.split(u8, pair, "="); const key = parts.next().?; const value = parts.next().?; try result.put(key, value); diff --git a/lib/std/special/build_runner.zig b/lib/std/special/build_runner.zig index 475199eaf4..2da273a673 100644 --- a/lib/std/special/build_runner.zig +++ b/lib/std/special/build_runner.zig @@ -147,8 +147,8 @@ pub fn main() !void { builder.verbose_ast = true; } else if (mem.eql(u8, arg, "--verbose-link")) { builder.verbose_link = true; - } else if (mem.eql(u8, arg, "--verbose-ir")) { - builder.verbose_ir = true; + } else if (mem.eql(u8, arg, "--verbose-air")) { + builder.verbose_air = true; } else if (mem.eql(u8, arg, "--verbose-llvm-ir")) { builder.verbose_llvm_ir = true; } else if (mem.eql(u8, arg, "--verbose-cimport")) { @@ -157,6 +157,8 @@ pub fn main() !void { builder.verbose_cc = true; } else if (mem.eql(u8, arg, "--verbose-llvm-cpu-features")) { builder.verbose_llvm_cpu_features = true; + } else if (mem.eql(u8, arg, "--prominent-compile-errors")) { + builder.prominent_compile_errors = true; } else if (mem.eql(u8, arg, "--")) { builder.args = argsRest(args, arg_idx); break; @@ -214,24 +216,25 @@ fn usage(builder: *Builder, already_ran_build: bool, out_stream: anytype) !void try fmt.allocPrint(allocator, "{s} (default)", .{top_level_step.step.name}) else top_level_step.step.name; - try out_stream.print(" {s:<27} {s}\n", .{ name, top_level_step.description }); + try out_stream.print(" {s:<28} {s}\n", .{ name, top_level_step.description }); } try out_stream.writeAll( \\ \\General Options: - \\ -p, --prefix [path] Override default install prefix - \\ --prefix-lib-dir [path] Override default library directory path - \\ --prefix-exe-dir [path] Override default executable directory path - \\ --prefix-include-dir [path] Override default include directory path + \\ -p, --prefix [path] Override default install prefix + \\ --prefix-lib-dir [path] Override default library directory path + \\ --prefix-exe-dir [path] Override default executable directory path + \\ --prefix-include-dir [path] Override default include directory path \\ - \\ --sysroot [path] Set the system root directory (usually /) - \\ --search-prefix [path] Add a path to look for binaries, libraries, headers - \\ --libc [file] Provide a file which specifies libc paths + \\ --sysroot [path] Set the system root directory (usually /) + \\ --search-prefix [path] Add a path to look for binaries, libraries, headers + \\ --libc [file] Provide a file which specifies libc paths \\ - \\ -h, --help Print this help and exit - \\ --verbose Print commands before executing them - \\ --color [auto|off|on] Enable or disable colored error messages + \\ -h, --help Print this help and exit + \\ --verbose Print commands before executing them + \\ --color [auto|off|on] Enable or disable colored error messages + \\ --prominent-compile-errors Output compile errors formatted for a human to read \\ \\Project-Specific Options: \\ @@ -246,24 +249,24 @@ fn usage(builder: *Builder, already_ran_build: bool, out_stream: anytype) !void @tagName(option.type_id), }); defer allocator.free(name); - try out_stream.print("{s:<29} {s}\n", .{ name, option.description }); + try out_stream.print("{s:<30} {s}\n", .{ name, option.description }); } } try out_stream.writeAll( \\ \\Advanced Options: - \\ --build-file [file] Override path to build.zig - \\ --cache-dir [path] Override path to zig cache directory - \\ --zig-lib-dir [arg] Override path to Zig lib directory - \\ --verbose-tokenize Enable compiler debug output for tokenization - \\ --verbose-ast Enable compiler debug output for parsing into an AST - \\ --verbose-link Enable compiler debug output for linking - \\ --verbose-ir Enable compiler debug output for Zig IR - \\ --verbose-llvm-ir Enable compiler debug output for LLVM IR - \\ --verbose-cimport Enable compiler debug output for C imports - \\ --verbose-cc Enable compiler debug output for C compilation - \\ --verbose-llvm-cpu-features Enable compiler debug output for LLVM CPU features + \\ --build-file [file] Override path to build.zig + \\ --cache-dir [path] Override path to zig cache directory + \\ --zig-lib-dir [arg] Override path to Zig lib directory + \\ --verbose-tokenize Enable compiler debug output for tokenization + \\ --verbose-ast Enable compiler debug output for parsing into an AST + \\ --verbose-link Enable compiler debug output for linking + \\ --verbose-air Enable compiler debug output for Zig AIR + \\ --verbose-llvm-ir Enable compiler debug output for LLVM IR + \\ --verbose-cimport Enable compiler debug output for C imports + \\ --verbose-cc Enable compiler debug output for C compilation + \\ --verbose-llvm-cpu-features Enable compiler debug output for LLVM CPU features \\ ); } diff --git a/lib/std/wasm.zig b/lib/std/wasm.zig index 8922b3c83e..aebbb3b163 100644 --- a/lib/std/wasm.zig +++ b/lib/std/wasm.zig @@ -162,8 +162,14 @@ pub const Opcode = enum(u8) { i32_wrap_i64 = 0xA7, i32_trunc_f32_s = 0xA8, i32_trunc_f32_u = 0xA9, - i32_trunc_f64_s = 0xB0, - i32_trunc_f64_u = 0xB1, + i32_trunc_f64_s = 0xAA, + i32_trunc_f64_u = 0xAB, + i64_extend_i32_s = 0xAC, + i64_extend_i32_u = 0xAD, + i64_trunc_f32_s = 0xAE, + i64_trunc_f32_u = 0xAF, + i64_trunc_f64_s = 0xB0, + i64_trunc_f64_u = 0xB1, f32_convert_i32_s = 0xB2, f32_convert_i32_u = 0xB3, f32_convert_i64_s = 0xB4, diff --git a/lib/std/zig/ast.zig b/lib/std/zig/ast.zig index abcb29f8b5..61969d9699 100644 --- a/lib/std/zig/ast.zig +++ b/lib/std/zig/ast.zig @@ -2198,6 +2198,9 @@ pub const full = struct { .type_expr = param_type, }; } + if (token_tags[it.tok_i] == .comma) { + it.tok_i += 1; + } if (token_tags[it.tok_i] == .r_paren) { return null; } diff --git a/lib/std/zig/c_builtins.zig b/lib/std/zig/c_builtins.zig index afa3ae0a87..479f7a3b0e 100644 --- a/lib/std/zig/c_builtins.zig +++ b/lib/std/zig/c_builtins.zig @@ -191,6 +191,49 @@ pub inline fn __builtin_expect(expr: c_long, c: c_long) c_long { return expr; } +/// returns a quiet NaN. Quiet NaNs have many representations; tagp is used to select one in an +/// implementation-defined way. +/// This implementation is based on the description for __builtin_nan provided in the GCC docs at +/// https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html#index-_005f_005fbuiltin_005fnan +/// Comment is reproduced below: +/// Since ISO C99 defines this function in terms of strtod, which we do not implement, a description +/// of the parsing is in order. +/// The string is parsed as by strtol; that is, the base is recognized by leading ‘0’ or ‘0x’ prefixes. +/// The number parsed is placed in the significand such that the least significant bit of the number is +/// at the least significant bit of the significand. +/// The number is truncated to fit the significand field provided. +/// The significand is forced to be a quiet NaN. +/// +/// If tagp contains any non-numeric characters, the function returns a NaN whose significand is zero. +/// If tagp is empty, the function returns a NaN whose significand is zero. +pub inline fn __builtin_nanf(tagp: []const u8) f32 { + const parsed = std.fmt.parseUnsigned(c_ulong, tagp, 0) catch 0; + const bits = @truncate(u23, parsed); // single-precision float trailing significand is 23 bits + return @bitCast(f32, @as(u32, bits) | std.math.qnan_u32); +} + +pub inline fn __builtin_huge_valf() f32 { + return std.math.inf(f32); +} + +pub inline fn __builtin_inff() f32 { + return std.math.inf(f32); +} + +pub inline fn __builtin_isnan(x: anytype) c_int { + return @boolToInt(std.math.isNan(x)); +} + +pub inline fn __builtin_isinf(x: anytype) c_int { + return @boolToInt(std.math.isInf(x)); +} + +/// Similar to isinf, except the return value is -1 for an argument of -Inf and 1 for an argument of +Inf. +pub inline fn __builtin_isinf_sign(x: anytype) c_int { + if (!std.math.isInf(x)) return 0; + return if (std.math.isPositiveInf(x)) 1 else -1; +} + // __builtin_alloca_with_align is not currently implemented. // It is used in a run-translated-c test and a test-translate-c test to ensure that non-implemented // builtins are correctly demoted. If you implement __builtin_alloca_with_align, please update the diff --git a/lib/std/zig/c_translation.zig b/lib/std/zig/c_translation.zig index bcf3b310ea..7b21fba93a 100644 --- a/lib/std/zig/c_translation.zig +++ b/lib/std/zig/c_translation.zig @@ -404,6 +404,10 @@ pub const Macros = struct { else => unreachable, // return type will be a compile error otherwise } } + + pub inline fn DISCARD(x: anytype) void { + _ = x; + } }; test "Macro suffix functions" { diff --git a/lib/std/zig/cross_target.zig b/lib/std/zig/cross_target.zig index 1058628633..4a8879db57 100644 --- a/lib/std/zig/cross_target.zig +++ b/lib/std/zig/cross_target.zig @@ -233,7 +233,7 @@ pub const CrossTarget = struct { .dynamic_linker = DynamicLinker.init(args.dynamic_linker), }; - var it = mem.split(args.arch_os_abi, "-"); + var it = mem.split(u8, args.arch_os_abi, "-"); const arch_name = it.next().?; const arch_is_native = mem.eql(u8, arch_name, "native"); if (!arch_is_native) { @@ -251,7 +251,7 @@ pub const CrossTarget = struct { const opt_abi_text = it.next(); if (opt_abi_text) |abi_text| { - var abi_it = mem.split(abi_text, "."); + var abi_it = mem.split(u8, abi_text, "."); const abi = std.meta.stringToEnum(Target.Abi, abi_it.next().?) orelse return error.UnknownApplicationBinaryInterface; result.abi = abi; @@ -699,7 +699,7 @@ pub const CrossTarget = struct { } fn parseOs(result: *CrossTarget, diags: *ParseOptions.Diagnostics, text: []const u8) !void { - var it = mem.split(text, "."); + var it = mem.split(u8, text, "."); const os_name = it.next().?; diags.os_name = os_name; const os_is_native = mem.eql(u8, os_name, "native"); @@ -757,7 +757,7 @@ pub const CrossTarget = struct { .linux, .dragonfly, => { - var range_it = mem.split(version_text, "..."); + var range_it = mem.split(u8, version_text, "..."); const min_text = range_it.next().?; const min_ver = SemVer.parse(min_text) catch |err| switch (err) { @@ -777,7 +777,7 @@ pub const CrossTarget = struct { }, .windows => { - var range_it = mem.split(version_text, "..."); + var range_it = mem.split(u8, version_text, "..."); const min_text = range_it.next().?; const min_ver = std.meta.stringToEnum(Target.Os.WindowsVersion, min_text) orelse diff --git a/lib/std/zig/system.zig b/lib/std/zig/system.zig index a4939b8347..4d671efe94 100644 --- a/lib/std/zig/system.zig +++ b/lib/std/zig/system.zig @@ -44,7 +44,7 @@ pub const NativePaths = struct { defer allocator.free(nix_cflags_compile); is_nix = true; - var it = mem.tokenize(nix_cflags_compile, " "); + var it = mem.tokenize(u8, nix_cflags_compile, " "); while (true) { const word = it.next() orelse break; if (mem.eql(u8, word, "-isystem")) { @@ -69,7 +69,7 @@ pub const NativePaths = struct { defer allocator.free(nix_ldflags); is_nix = true; - var it = mem.tokenize(nix_ldflags, " "); + var it = mem.tokenize(u8, nix_ldflags, " "); while (true) { const word = it.next() orelse break; if (mem.eql(u8, word, "-rpath")) { @@ -839,7 +839,7 @@ pub const NativeTargetInfo = struct { error.Overflow => return error.InvalidElfFile, }; const rpath_list = mem.spanZ(std.meta.assumeSentinel(strtab[rpoff_usize..].ptr, 0)); - var it = mem.tokenize(rpath_list, ":"); + var it = mem.tokenize(u8, rpath_list, ":"); while (it.next()) |rpath| { var dir = fs.cwd().openDir(rpath, .{}) catch |err| switch (err) { error.NameTooLong => unreachable, diff --git a/src/Air.zig b/src/Air.zig index 9451f8b763..391683afd5 100644 --- a/src/Air.zig +++ b/src/Air.zig @@ -15,7 +15,6 @@ instructions: std.MultiArrayList(Inst).Slice, /// The first few indexes are reserved. See `ExtraIndex` for the values. extra: []const u32, values: []const Value, -variables: []const *Module.Var, pub const ExtraIndex = enum(u32) { /// Payload index of the main `Block` in the `extra` array. @@ -70,6 +69,18 @@ pub const Inst = struct { /// is the same as both operands. /// Uses the `bin_op` field. div, + /// Add an offset to a pointer, returning a new pointer. + /// The offset is in element type units, not bytes. + /// Wrapping is undefined behavior. + /// The lhs is the pointer, rhs is the offset. Result type is the same as lhs. + /// Uses the `bin_op` field. + ptr_add, + /// Subtract an offset from a pointer, returning a new pointer. + /// The offset is in element type units, not bytes. + /// Wrapping is undefined behavior. + /// The lhs is the pointer, rhs is the offset. Result type is the same as lhs. + /// Uses the `bin_op` field. + ptr_sub, /// Allocates stack local memory. /// Uses the `ty` field. alloc, @@ -189,20 +200,14 @@ pub const Inst = struct { /// Converts a pointer to its address. Result type is always `usize`. /// Uses the `un_op` field. ptrtoint, - /// Stores a value onto the stack and returns a pointer to it. - /// TODO audit where this AIR instruction is emitted, maybe it should instead be emitting - /// alloca instruction and storing to the alloca. - /// Uses the `ty_op` field. - ref, + /// Given a boolean, returns 0 or 1. + /// Result type is always `u1`. + /// Uses the `un_op` field. + bool_to_int, /// Return a value from a function. /// Result type is always noreturn; no instructions in a block follow this one. /// Uses the `un_op` field. ret, - /// Returns a pointer to a global variable. - /// Uses the `ty_pl` field. Index is into the `variables` array. - /// TODO this can be modeled simply as a constant with a decl ref and then - /// the variables array can be removed from Air. - varptr, /// Write a value to a pointer. LHS is pointer, RHS is value. /// Result type is always void. /// Uses the `bin_op` field. @@ -213,10 +218,16 @@ pub const Inst = struct { /// Convert from one float type to another. /// Uses the `ty_op` field. floatcast, - /// TODO audit uses of this. We should have explicit instructions for integer - /// widening and truncating. + /// Returns an integer with a different type than the operand. The new type may have + /// fewer, the same, or more bits than the operand type. However, the instruction + /// guarantees that the same integer value fits in both types. + /// See `trunc` for integer truncation. /// Uses the `ty_op` field. intcast, + /// Truncate higher bits from an integer, resulting in an integer with the same + /// sign but an equal or smaller number of bits. + /// Uses the `ty_op` field. + trunc, /// ?T => T. If the value is null, undefined behavior. /// Uses the `ty_op` field. optional_payload, @@ -247,6 +258,9 @@ pub const Inst = struct { /// Given a pointer to a struct and a field index, returns a pointer to the field. /// Uses the `ty_pl` field, payload is `StructField`. struct_field_ptr, + /// Given a byval struct and a field index, returns the field byval. + /// Uses the `ty_pl` field, payload is `StructField`. + struct_field_val, /// Given a slice value, return the length. /// Result type is always usize. /// Uses the `ty_op` field. @@ -262,6 +276,15 @@ pub const Inst = struct { /// Result type is the element type of the slice operand (2 element type operations). /// Uses the `bin_op` field. ptr_slice_elem_val, + /// Given a pointer value, and element index, return the element value at that index. + /// Result type is the element type of the pointer operand. + /// Uses the `bin_op` field. + ptr_elem_val, + /// Given a pointer to a pointer, and element index, return the element value of the inner + /// pointer at that index. + /// Result type is the element type of the inner pointer operand. + /// Uses the `bin_op` field. + ptr_ptr_elem_val, pub fn fromCmpOp(op: std.math.CompareOperator) Tag { return switch (op) { @@ -376,7 +399,8 @@ pub const SwitchBr = struct { }; pub const StructField = struct { - struct_ptr: Inst.Ref, + /// Whether this is a pointer or byval is determined by the AIR tag. + struct_operand: Inst.Ref, field_index: u32, }; @@ -419,6 +443,8 @@ pub fn typeOfIndex(air: Air, inst: Air.Inst.Index) Type { .bit_and, .bit_or, .xor, + .ptr_add, + .ptr_sub, => return air.typeOf(datas[inst].bin_op.lhs), .cmp_lt, @@ -446,16 +472,16 @@ pub fn typeOfIndex(air: Air, inst: Air.Inst.Index) Type { .assembly, .block, .constant, - .varptr, .struct_field_ptr, + .struct_field_val, => return air.getRefType(datas[inst].ty_pl.ty), .not, .bitcast, .load, - .ref, .floatcast, .intcast, + .trunc, .optional_payload, .optional_payload_ptr, .wrap_optional, @@ -485,19 +511,21 @@ pub fn typeOfIndex(air: Air, inst: Air.Inst.Index) Type { .slice_len, => return Type.initTag(.usize), + .bool_to_int => return Type.initTag(.u1), + .call => { const callee_ty = air.typeOf(datas[inst].pl_op.operand); return callee_ty.fnReturnType(); }, - .slice_elem_val => { + .slice_elem_val, .ptr_elem_val => { const slice_ty = air.typeOf(datas[inst].bin_op.lhs); return slice_ty.elemType(); }, - .ptr_slice_elem_val => { - const ptr_slice_ty = air.typeOf(datas[inst].bin_op.lhs); - const slice_ty = ptr_slice_ty.elemType(); - return slice_ty.elemType(); + .ptr_slice_elem_val, .ptr_ptr_elem_val => { + const outer_ptr_ty = air.typeOf(datas[inst].bin_op.lhs); + const inner_ptr_ty = outer_ptr_ty.elemType(); + return inner_ptr_ty.elemType(); }, } } @@ -505,7 +533,8 @@ pub fn typeOfIndex(air: Air, inst: Air.Inst.Index) Type { pub fn getRefType(air: Air, ref: Air.Inst.Ref) Type { const ref_int = @enumToInt(ref); if (ref_int < Air.Inst.Ref.typed_value_map.len) { - return Air.Inst.Ref.typed_value_map[ref_int].val.toType(undefined) catch unreachable; + var buffer: Value.ToTypeBuffer = undefined; + return Air.Inst.Ref.typed_value_map[ref_int].val.toType(&buffer); } const inst_index = ref_int - Air.Inst.Ref.typed_value_map.len; const air_tags = air.instructions.items(.tag); @@ -539,7 +568,6 @@ pub fn deinit(air: *Air, gpa: *std.mem.Allocator) void { air.instructions.deinit(gpa); gpa.free(air.extra); gpa.free(air.values); - gpa.free(air.variables); air.* = undefined; } diff --git a/src/AstGen.zig b/src/AstGen.zig index a00b43288b..ae37866b97 100644 --- a/src/AstGen.zig +++ b/src/AstGen.zig @@ -42,7 +42,7 @@ const InnerError = error{ OutOfMemory, AnalysisFail }; fn addExtra(astgen: *AstGen, extra: anytype) Allocator.Error!u32 { const fields = std.meta.fields(@TypeOf(extra)); - try astgen.extra.ensureCapacity(astgen.gpa, astgen.extra.items.len + fields.len); + try astgen.extra.ensureUnusedCapacity(astgen.gpa, fields.len); return addExtraAssumeCapacity(astgen, extra); } @@ -195,6 +195,9 @@ pub const ResultLoc = union(enum) { none_or_ref, /// The expression will be coerced into this type, but it will be evaluated as an rvalue. ty: Zir.Inst.Ref, + /// Same as `ty` but it is guaranteed that Sema will additionall perform the coercion, + /// so no `as` instruction needs to be emitted. + coerced_ty: Zir.Inst.Ref, /// The expression must store its result into this typed pointer. The result instruction /// from the expression must be ignored. ptr: Zir.Inst.Ref, @@ -225,7 +228,7 @@ pub const ResultLoc = union(enum) { fn strategy(rl: ResultLoc, block_scope: *GenZir) Strategy { switch (rl) { // In this branch there will not be any store_to_block_ptr instructions. - .discard, .none, .none_or_ref, .ty, .ref => return .{ + .discard, .none, .none_or_ref, .ty, .coerced_ty, .ref => return .{ .tag = .break_operand, .elide_store_to_block_ptr_instructions = false, }, @@ -259,13 +262,15 @@ pub const ResultLoc = union(enum) { pub const align_rl: ResultLoc = .{ .ty = .u16_type }; pub const bool_rl: ResultLoc = .{ .ty = .bool_type }; +pub const type_rl: ResultLoc = .{ .ty = .type_type }; +pub const coerced_type_rl: ResultLoc = .{ .coerced_ty = .type_type }; fn typeExpr(gz: *GenZir, scope: *Scope, type_node: ast.Node.Index) InnerError!Zir.Inst.Ref { const prev_force_comptime = gz.force_comptime; gz.force_comptime = true; defer gz.force_comptime = prev_force_comptime; - return expr(gz, scope, .{ .ty = .type_type }, type_node); + return expr(gz, scope, coerced_type_rl, type_node); } /// Same as `expr` but fails with a compile error if the result type is `noreturn`. @@ -1046,49 +1051,55 @@ fn fnProtoExpr( }; assert(!is_extern); - // The AST params array does not contain anytype and ... parameters. - // We must iterate to count how many param types to allocate. - const param_count = blk: { - var count: usize = 0; - var it = fn_proto.iterate(tree.*); - while (it.next()) |param| { - if (param.anytype_ellipsis3) |token| switch (token_tags[token]) { - .ellipsis3 => break, - .keyword_anytype => {}, - else => unreachable, - }; - count += 1; - } - break :blk count; - }; - const param_types = try gpa.alloc(Zir.Inst.Ref, param_count); - defer gpa.free(param_types); - - var is_var_args = false; - { + const is_var_args = is_var_args: { var param_type_i: usize = 0; var it = fn_proto.iterate(tree.*); while (it.next()) |param| : (param_type_i += 1) { - if (param.anytype_ellipsis3) |token| { + const is_comptime = if (param.comptime_noalias) |token| + token_tags[token] == .keyword_comptime + else + false; + + const is_anytype = if (param.anytype_ellipsis3) |token| blk: { switch (token_tags[token]) { - .keyword_anytype => { - param_types[param_type_i] = .none; - continue; - }, - .ellipsis3 => { - is_var_args = true; - break; - }, + .keyword_anytype => break :blk true, + .ellipsis3 => break :is_var_args true, else => unreachable, } + } else false; + + const param_name: u32 = if (param.name_token) |name_token| blk: { + if (mem.eql(u8, "_", tree.tokenSlice(name_token))) + break :blk 0; + + break :blk try astgen.identAsString(name_token); + } else 0; + + if (is_anytype) { + const name_token = param.name_token orelse param.anytype_ellipsis3.?; + + const tag: Zir.Inst.Tag = if (is_comptime) + .param_anytype_comptime + else + .param_anytype; + _ = try gz.addStrTok(tag, param_name, name_token); + } else { + const param_type_node = param.type_expr; + assert(param_type_node != 0); + var param_gz = gz.makeSubBlock(scope); + defer param_gz.instructions.deinit(gpa); + const param_type = try expr(¶m_gz, scope, coerced_type_rl, param_type_node); + const param_inst_expected = @intCast(u32, astgen.instructions.len + 1); + _ = try param_gz.addBreak(.break_inline, param_inst_expected, param_type); + const main_tokens = tree.nodes.items(.main_token); + const name_token = param.name_token orelse main_tokens[param_type_node]; + const tag: Zir.Inst.Tag = if (is_comptime) .param_comptime else .param; + const param_inst = try gz.addParam(tag, name_token, param_name, param_gz.instructions.items); + assert(param_inst_expected == param_inst); } - const param_type_node = param.type_expr; - assert(param_type_node != 0); - param_types[param_type_i] = - try expr(gz, scope, .{ .ty = .type_type }, param_type_node); } - assert(param_type_i == param_count); - } + break :is_var_args false; + }; const align_inst: Zir.Inst.Ref = if (fn_proto.ast.align_expr == 0) .none else inst: { break :inst try expr(gz, scope, align_rl, fn_proto.ast.align_expr); @@ -1102,15 +1113,13 @@ fn fnProtoExpr( if (is_inferred_error) { return astgen.failTok(maybe_bang, "function prototype may not have inferred error set", .{}); } - const return_type_inst = try AstGen.expr( - gz, - scope, - .{ .ty = .type_type }, - fn_proto.ast.return_type, - ); + var ret_gz = gz.makeSubBlock(scope); + defer ret_gz.instructions.deinit(gpa); + const ret_ty = try expr(&ret_gz, scope, coerced_type_rl, fn_proto.ast.return_type); + const ret_br = try ret_gz.addBreak(.break_inline, 0, ret_ty); const cc: Zir.Inst.Ref = if (fn_proto.ast.callconv_expr != 0) - try AstGen.expr( + try expr( gz, scope, .{ .ty = .calling_convention_type }, @@ -1121,8 +1130,9 @@ fn fnProtoExpr( const result = try gz.addFunc(.{ .src_node = fn_proto.ast.proto_node, - .ret_ty = return_type_inst, - .param_types = param_types, + .param_block = 0, + .ret_ty = ret_gz.instructions.items, + .ret_br = ret_br, .body = &[0]Zir.Inst.Index{}, .cc = cc, .align_inst = align_inst, @@ -1215,7 +1225,7 @@ fn arrayInitExpr( return arrayInitExprRlNone(gz, scope, node, array_init.ast.elements, .array_init_anon); } }, - .ty => |ty_inst| { + .ty, .coerced_ty => |ty_inst| { if (types.array != .none) { const result = try arrayInitExprRlTy(gz, scope, node, array_init.ast.elements, types.elem, .array_init); return rvalue(gz, rl, result, node); @@ -1384,7 +1394,7 @@ fn structInitExpr( return structInitExprRlNone(gz, scope, node, struct_init, .struct_init_anon); } }, - .ty => |ty_inst| { + .ty, .coerced_ty => |ty_inst| { if (struct_init.ast.type_expr == 0) { return structInitExprRlTy(gz, scope, node, struct_init, ty_inst, .struct_init); } @@ -1423,8 +1433,8 @@ fn structInitExprRlNone( const init_inst = try gz.addPlNode(tag, node, Zir.Inst.StructInitAnon{ .fields_len = @intCast(u32, fields_list.len), }); - try astgen.extra.ensureCapacity(gpa, astgen.extra.items.len + - fields_list.len * @typeInfo(Zir.Inst.StructInitAnon.Item).Struct.fields.len); + try astgen.extra.ensureUnusedCapacity(gpa, fields_list.len * + @typeInfo(Zir.Inst.StructInitAnon.Item).Struct.fields.len); for (fields_list) |field| { _ = gz.astgen.addExtraAssumeCapacity(field); } @@ -1496,8 +1506,8 @@ fn structInitExprRlTy( const init_inst = try gz.addPlNode(tag, node, Zir.Inst.StructInit{ .fields_len = @intCast(u32, fields_list.len), }); - try astgen.extra.ensureCapacity(gpa, astgen.extra.items.len + - fields_list.len * @typeInfo(Zir.Inst.StructInit.Item).Struct.fields.len); + try astgen.extra.ensureUnusedCapacity(gpa, fields_list.len * + @typeInfo(Zir.Inst.StructInit.Item).Struct.fields.len); for (fields_list) |field| { _ = gz.astgen.addExtraAssumeCapacity(field); } @@ -1894,7 +1904,10 @@ fn unusedResultExpr(gz: *GenZir, scope: *Scope, statement: ast.Node.Index) Inner // ZIR instructions that might be a type other than `noreturn` or `void`. .add, .addwrap, - .arg, + .param, + .param_comptime, + .param_anytype, + .param_anytype_comptime, .alloc, .alloc_mut, .alloc_comptime, @@ -2090,6 +2103,7 @@ fn unusedResultExpr(gz: *GenZir, scope: *Scope, statement: ast.Node.Index) Inner .splat, .reduce, .shuffle, + .select, .atomic_load, .atomic_rmw, .atomic_store, @@ -2097,8 +2111,10 @@ fn unusedResultExpr(gz: *GenZir, scope: *Scope, statement: ast.Node.Index) Inner .builtin_call, .field_ptr_type, .field_parent_ptr, + .maximum, .memcpy, .memset, + .minimum, .builtin_async_call, .c_import, .@"resume", @@ -2115,6 +2131,7 @@ fn unusedResultExpr(gz: *GenZir, scope: *Scope, statement: ast.Node.Index) Inner .condbr_inline, .compile_error, .ret_node, + .ret_load, .ret_coerce, .ret_err_value, .@"unreachable", @@ -2461,7 +2478,7 @@ fn varDecl( // Move the init_scope instructions into the parent scope, swapping // store_to_block_ptr for store_to_inferred_ptr. const expected_len = parent_zir.items.len + init_scope.instructions.items.len; - try parent_zir.ensureCapacity(gpa, expected_len); + try parent_zir.ensureTotalCapacity(gpa, expected_len); for (init_scope.instructions.items) |src_inst| { if (zir_tags[src_inst] == .store_to_block_ptr) { if (zir_datas[src_inst].bin.lhs == init_scope.rl_ptr) { @@ -2607,7 +2624,7 @@ fn assignOp( const lhs_ptr = try lvalExpr(gz, scope, node_datas[infix_node].lhs); const lhs = try gz.addUnNode(.load, lhs_ptr, infix_node); const lhs_type = try gz.addUnNode(.typeof, lhs, infix_node); - const rhs = try expr(gz, scope, .{ .ty = lhs_type }, node_datas[infix_node].rhs); + const rhs = try expr(gz, scope, .{ .coerced_ty = lhs_type }, node_datas[infix_node].rhs); const result = try gz.addPlNode(op_inst_tag, infix_node, Zir.Inst.Bin{ .lhs = lhs, @@ -2723,10 +2740,10 @@ fn ptrType( } const gpa = gz.astgen.gpa; - try gz.instructions.ensureCapacity(gpa, gz.instructions.items.len + 1); - try gz.astgen.instructions.ensureCapacity(gpa, gz.astgen.instructions.len + 1); - try gz.astgen.extra.ensureCapacity(gpa, gz.astgen.extra.items.len + - @typeInfo(Zir.Inst.PtrType).Struct.fields.len + trailing_count); + try gz.instructions.ensureUnusedCapacity(gpa, 1); + try gz.astgen.instructions.ensureUnusedCapacity(gpa, 1); + try gz.astgen.extra.ensureUnusedCapacity(gpa, @typeInfo(Zir.Inst.PtrType).Struct.fields.len + + trailing_count); const payload_index = gz.astgen.addExtraAssumeCapacity(Zir.Inst.PtrType{ .elem_type = elem_type }); if (sentinel_ref != .none) { @@ -2872,6 +2889,16 @@ fn fnDecl( }; defer decl_gz.instructions.deinit(gpa); + var fn_gz: GenZir = .{ + .force_comptime = false, + .in_defer = false, + .decl_node_index = fn_proto.ast.proto_node, + .decl_line = decl_gz.decl_line, + .parent = &decl_gz.base, + .astgen = astgen, + }; + defer fn_gz.instructions.deinit(gpa); + // TODO: support noinline const is_pub = fn_proto.visib_token != null; const is_export = blk: { @@ -2886,58 +2913,82 @@ fn fnDecl( const maybe_inline_token = fn_proto.extern_export_inline_token orelse break :blk false; break :blk token_tags[maybe_inline_token] == .keyword_inline; }; - const align_inst: Zir.Inst.Ref = if (fn_proto.ast.align_expr == 0) .none else inst: { - break :inst try expr(&decl_gz, &decl_gz.base, align_rl, fn_proto.ast.align_expr); - }; - const section_inst: Zir.Inst.Ref = if (fn_proto.ast.section_expr == 0) .none else inst: { - break :inst try comptimeExpr(&decl_gz, &decl_gz.base, .{ .ty = .const_slice_u8_type }, fn_proto.ast.section_expr); - }; + try wip_decls.next(gpa, is_pub, is_export, fn_proto.ast.align_expr != 0, fn_proto.ast.section_expr != 0); - try wip_decls.next(gpa, is_pub, is_export, align_inst != .none, section_inst != .none); - - // The AST params array does not contain anytype and ... parameters. - // We must iterate to count how many param types to allocate. - const param_count = blk: { - var count: usize = 0; - var it = fn_proto.iterate(tree.*); - while (it.next()) |param| { - if (param.anytype_ellipsis3) |token| switch (token_tags[token]) { - .ellipsis3 => break, - .keyword_anytype => {}, - else => unreachable, - }; - count += 1; - } - break :blk count; - }; - const param_types = try gpa.alloc(Zir.Inst.Ref, param_count); - defer gpa.free(param_types); - - var is_var_args = false; - { + var params_scope = &fn_gz.base; + const is_var_args = is_var_args: { var param_type_i: usize = 0; var it = fn_proto.iterate(tree.*); while (it.next()) |param| : (param_type_i += 1) { - if (param.anytype_ellipsis3) |token| { + const is_comptime = if (param.comptime_noalias) |token| + token_tags[token] == .keyword_comptime + else + false; + + const is_anytype = if (param.anytype_ellipsis3) |token| blk: { switch (token_tags[token]) { - .keyword_anytype => { - param_types[param_type_i] = .none; - continue; - }, - .ellipsis3 => { - is_var_args = true; - break; - }, + .keyword_anytype => break :blk true, + .ellipsis3 => break :is_var_args true, else => unreachable, } - } - const param_type_node = param.type_expr; - assert(param_type_node != 0); - param_types[param_type_i] = - try expr(&decl_gz, &decl_gz.base, .{ .ty = .type_type }, param_type_node); + } else false; + + const param_name: u32 = if (param.name_token) |name_token| blk: { + if (mem.eql(u8, "_", tree.tokenSlice(name_token))) + break :blk 0; + + const param_name = try astgen.identAsString(name_token); + if (!is_extern) { + try astgen.detectLocalShadowing(params_scope, param_name, name_token); + } + break :blk param_name; + } else if (!is_extern) { + if (param.anytype_ellipsis3) |tok| { + return astgen.failTok(tok, "missing parameter name", .{}); + } else { + return astgen.failNode(param.type_expr, "missing parameter name", .{}); + } + } else 0; + + const param_inst = if (is_anytype) param: { + const name_token = param.name_token orelse param.anytype_ellipsis3.?; + const tag: Zir.Inst.Tag = if (is_comptime) + .param_anytype_comptime + else + .param_anytype; + break :param try decl_gz.addStrTok(tag, param_name, name_token); + } else param: { + const param_type_node = param.type_expr; + assert(param_type_node != 0); + var param_gz = decl_gz.makeSubBlock(scope); + defer param_gz.instructions.deinit(gpa); + const param_type = try expr(¶m_gz, params_scope, coerced_type_rl, param_type_node); + const param_inst_expected = @intCast(u32, astgen.instructions.len + 1); + _ = try param_gz.addBreak(.break_inline, param_inst_expected, param_type); + + const main_tokens = tree.nodes.items(.main_token); + const name_token = param.name_token orelse main_tokens[param_type_node]; + const tag: Zir.Inst.Tag = if (is_comptime) .param_comptime else .param; + const param_inst = try decl_gz.addParam(tag, name_token, param_name, param_gz.instructions.items); + assert(param_inst_expected == param_inst); + break :param indexToRef(param_inst); + }; + + if (param_name == 0) continue; + + const sub_scope = try astgen.arena.create(Scope.LocalVal); + sub_scope.* = .{ + .parent = params_scope, + .gen_zir = &decl_gz, + .name = param_name, + .inst = param_inst, + .token_src = param.name_token.?, + .id_cat = .@"function parameter", + }; + params_scope = &sub_scope.base; } - assert(param_type_i == param_count); - } + break :is_var_args false; + }; const lib_name: u32 = if (fn_proto.lib_name) |lib_name_token| blk: { const lib_name_str = try astgen.strLitAsString(lib_name_token); @@ -2947,12 +2998,17 @@ fn fnDecl( const maybe_bang = tree.firstToken(fn_proto.ast.return_type) - 1; const is_inferred_error = token_tags[maybe_bang] == .bang; - const return_type_inst = try AstGen.expr( - &decl_gz, - &decl_gz.base, - .{ .ty = .type_type }, - fn_proto.ast.return_type, - ); + const align_inst: Zir.Inst.Ref = if (fn_proto.ast.align_expr == 0) .none else inst: { + break :inst try expr(&decl_gz, params_scope, align_rl, fn_proto.ast.align_expr); + }; + const section_inst: Zir.Inst.Ref = if (fn_proto.ast.section_expr == 0) .none else inst: { + break :inst try comptimeExpr(&decl_gz, params_scope, .{ .ty = .const_slice_u8_type }, fn_proto.ast.section_expr); + }; + + var ret_gz = decl_gz.makeSubBlock(params_scope); + defer ret_gz.instructions.deinit(gpa); + const ret_ty = try expr(&ret_gz, params_scope, coerced_type_rl, fn_proto.ast.return_type); + const ret_br = try ret_gz.addBreak(.break_inline, 0, ret_ty); const cc: Zir.Inst.Ref = blk: { if (fn_proto.ast.callconv_expr != 0) { @@ -2963,9 +3019,9 @@ fn fnDecl( .{}, ); } - break :blk try AstGen.expr( + break :blk try expr( &decl_gz, - &decl_gz.base, + params_scope, .{ .ty = .calling_convention_type }, fn_proto.ast.callconv_expr, ); @@ -2988,8 +3044,9 @@ fn fnDecl( } break :func try decl_gz.addFunc(.{ .src_node = decl_node, - .ret_ty = return_type_inst, - .param_types = param_types, + .ret_ty = ret_gz.instructions.items, + .ret_br = ret_br, + .param_block = block_inst, .body = &[0]Zir.Inst.Index{}, .cc = cc, .align_inst = .none, // passed in the per-decl data @@ -3004,67 +3061,12 @@ fn fnDecl( return astgen.failTok(fn_proto.ast.fn_token, "non-extern function is variadic", .{}); } - var fn_gz: GenZir = .{ - .force_comptime = false, - .in_defer = false, - .decl_node_index = fn_proto.ast.proto_node, - .decl_line = decl_gz.decl_line, - .parent = &decl_gz.base, - .astgen = astgen, - }; - defer fn_gz.instructions.deinit(gpa); - const prev_fn_block = astgen.fn_block; astgen.fn_block = &fn_gz; defer astgen.fn_block = prev_fn_block; - // Iterate over the parameters. We put the param names as the first N - // items inside `extra` so that debug info later can refer to the parameter names - // even while the respective source code is unloaded. - try astgen.extra.ensureUnusedCapacity(gpa, param_count); - - { - var params_scope = &fn_gz.base; - var i: usize = 0; - var it = fn_proto.iterate(tree.*); - while (it.next()) |param| : (i += 1) { - const name_token = param.name_token orelse { - if (param.anytype_ellipsis3) |tok| { - return astgen.failTok(tok, "missing parameter name", .{}); - } else { - return astgen.failNode(param.type_expr, "missing parameter name", .{}); - } - }; - if (param.type_expr != 0) - _ = try typeExpr(&fn_gz, params_scope, param.type_expr); - if (mem.eql(u8, "_", tree.tokenSlice(name_token))) - continue; - const param_name = try astgen.identAsString(name_token); - // Create an arg instruction. This is needed to emit a semantic analysis - // error for shadowing decls. - try astgen.detectLocalShadowing(params_scope, param_name, name_token); - const arg_inst = try fn_gz.addStrTok(.arg, param_name, name_token); - const sub_scope = try astgen.arena.create(Scope.LocalVal); - sub_scope.* = .{ - .parent = params_scope, - .gen_zir = &fn_gz, - .name = param_name, - .inst = arg_inst, - .token_src = name_token, - .id_cat = .@"function parameter", - }; - params_scope = &sub_scope.base; - - // Additionally put the param name into `string_bytes` and reference it with - // `extra` so that we have access to the data in codegen, for debug info. - const str_index = try astgen.identAsString(name_token); - try astgen.extra.append(astgen.gpa, str_index); - } - _ = try typeExpr(&fn_gz, params_scope, fn_proto.ast.return_type); - - _ = try expr(&fn_gz, params_scope, .none, body_node); - try checkUsed(gz, &fn_gz.base, params_scope); - } + _ = try expr(&fn_gz, params_scope, .none, body_node); + try checkUsed(gz, &fn_gz.base, params_scope); const need_implicit_ret = blk: { if (fn_gz.instructions.items.len == 0) @@ -3081,8 +3083,9 @@ fn fnDecl( break :func try decl_gz.addFunc(.{ .src_node = decl_node, - .ret_ty = return_type_inst, - .param_types = param_types, + .param_block = block_inst, + .ret_ty = ret_gz.instructions.items, + .ret_br = ret_br, .body = fn_gz.instructions.items, .cc = cc, .align_inst = .none, // passed in the per-decl data @@ -3426,8 +3429,9 @@ fn testDecl( const func_inst = try decl_block.addFunc(.{ .src_node = node, - .ret_ty = .void_type, - .param_types = &[0]Zir.Inst.Ref{}, + .param_block = block_inst, + .ret_ty = &.{}, + .ret_br = 0, .body = fn_block.instructions.items, .cc = .none, .align_inst = .none, @@ -4183,7 +4187,7 @@ fn containerDecl( var fields_data = ArrayListUnmanaged(u32){}; defer fields_data.deinit(gpa); - try fields_data.ensureCapacity(gpa, counts.total_fields + counts.values); + try fields_data.ensureTotalCapacity(gpa, counts.total_fields + counts.values); // We only need this if there are greater than 32 fields. var bit_bag = ArrayListUnmanaged(u32){}; @@ -4788,11 +4792,10 @@ fn finishThenElseBlock( const strat = rl.strategy(block_scope); switch (strat.tag) { .break_void => { - if (!parent_gz.refIsNoReturn(then_result)) { + if (!then_scope.endsWithNoReturn()) { _ = try then_scope.addBreak(break_tag, then_break_block, .void_value); } - const elide_else = if (else_result != .none) parent_gz.refIsNoReturn(else_result) else false; - if (!elide_else) { + if (!else_scope.endsWithNoReturn()) { _ = try else_scope.addBreak(break_tag, main_block, .void_value); } assert(!strat.elide_store_to_block_ptr_instructions); @@ -4800,11 +4803,11 @@ fn finishThenElseBlock( return indexToRef(main_block); }, .break_operand => { - if (!parent_gz.refIsNoReturn(then_result)) { + if (!then_scope.endsWithNoReturn()) { _ = try then_scope.addBreak(break_tag, then_break_block, then_result); } if (else_result != .none) { - if (!parent_gz.refIsNoReturn(else_result)) { + if (!else_scope.endsWithNoReturn()) { _ = try else_scope.addBreak(break_tag, main_block, else_result); } } else { @@ -5129,8 +5132,7 @@ fn setCondBrPayload( ) !void { const astgen = then_scope.astgen; - try astgen.extra.ensureCapacity(astgen.gpa, astgen.extra.items.len + - @typeInfo(Zir.Inst.CondBr).Struct.fields.len + + try astgen.extra.ensureUnusedCapacity(astgen.gpa, @typeInfo(Zir.Inst.CondBr).Struct.fields.len + then_scope.instructions.items.len + else_scope.instructions.items.len); const zir_datas = astgen.instructions.items(.data); @@ -5421,7 +5423,7 @@ fn forExpr( const tree = astgen.tree; const token_tags = tree.tokens.items(.tag); - const array_ptr = try expr(parent_gz, scope, .ref, for_full.ast.cond_expr); + const array_ptr = try expr(parent_gz, scope, .none_or_ref, for_full.ast.cond_expr); const len = try parent_gz.addUnNode(.indexable_ptr_len, array_ptr, for_full.ast.cond_expr); const index_ptr = blk: { @@ -5784,10 +5786,9 @@ fn switchExpr( _ = try case_scope.addBreak(.@"break", switch_block, case_result); } // Documentation for this: `Zir.Inst.SwitchBlock` and `Zir.Inst.SwitchBlockMulti`. - try scalar_cases_payload.ensureCapacity(gpa, scalar_cases_payload.items.len + + try scalar_cases_payload.ensureUnusedCapacity(gpa, case_scope.instructions.items.len + 3 + // operand, scalar_cases_len, else body len - @boolToInt(multi_cases_len != 0) + - case_scope.instructions.items.len); + @boolToInt(multi_cases_len != 0)); scalar_cases_payload.appendAssumeCapacity(@enumToInt(operand)); scalar_cases_payload.appendAssumeCapacity(scalar_cases_len); if (multi_cases_len != 0) { @@ -5797,9 +5798,11 @@ fn switchExpr( scalar_cases_payload.appendSliceAssumeCapacity(case_scope.instructions.items); } else { // Documentation for this: `Zir.Inst.SwitchBlock` and `Zir.Inst.SwitchBlockMulti`. - try scalar_cases_payload.ensureCapacity(gpa, scalar_cases_payload.items.len + - 2 + // operand, scalar_cases_len - @boolToInt(multi_cases_len != 0)); + try scalar_cases_payload.ensureUnusedCapacity( + gpa, + @as(usize, 2) + // operand, scalar_cases_len + @boolToInt(multi_cases_len != 0), + ); scalar_cases_payload.appendAssumeCapacity(@enumToInt(operand)); scalar_cases_payload.appendAssumeCapacity(scalar_cases_len); if (multi_cases_len != 0) { @@ -5920,8 +5923,8 @@ fn switchExpr( block_scope.break_count += 1; _ = try case_scope.addBreak(.@"break", switch_block, case_result); } - try scalar_cases_payload.ensureCapacity(gpa, scalar_cases_payload.items.len + - 2 + case_scope.instructions.items.len); + try scalar_cases_payload.ensureUnusedCapacity(gpa, 2 + + case_scope.instructions.items.len); scalar_cases_payload.appendAssumeCapacity(@enumToInt(item_inst)); scalar_cases_payload.appendAssumeCapacity(@intCast(u32, case_scope.instructions.items.len)); scalar_cases_payload.appendSliceAssumeCapacity(case_scope.instructions.items); @@ -5957,8 +5960,8 @@ fn switchExpr( const payload_index = astgen.extra.items.len; const zir_datas = astgen.instructions.items(.data); zir_datas[switch_block].pl_node.payload_index = @intCast(u32, payload_index); - try astgen.extra.ensureCapacity(gpa, astgen.extra.items.len + - scalar_cases_payload.items.len + multi_cases_payload.items.len); + try astgen.extra.ensureUnusedCapacity(gpa, scalar_cases_payload.items.len + + multi_cases_payload.items.len); const strat = rl.strategy(&block_scope); switch (strat.tag) { .break_operand => { @@ -6233,7 +6236,7 @@ fn ret(gz: *GenZir, scope: *Scope, node: ast.Node.Index) InnerError!Zir.Inst.Ref // Value is always an error. Emit both error defers and regular defers. const err_code = try gz.addUnNode(.err_union_code, operand, node); try genDefers(gz, defer_outer, scope, .{ .both = err_code }); - _ = try gz.addUnNode(.ret_node, operand, node); + try gz.addRet(rl, operand, node); return Zir.Inst.Ref.unreachable_value; }, .maybe => { @@ -6241,7 +6244,7 @@ fn ret(gz: *GenZir, scope: *Scope, node: ast.Node.Index) InnerError!Zir.Inst.Ref if (!defer_counts.have_err) { // Only regular defers; no branch needed. try genDefers(gz, defer_outer, scope, .normal_only); - _ = try gz.addUnNode(.ret_node, operand, node); + try gz.addRet(rl, operand, node); return Zir.Inst.Ref.unreachable_value; } @@ -6253,7 +6256,7 @@ fn ret(gz: *GenZir, scope: *Scope, node: ast.Node.Index) InnerError!Zir.Inst.Ref defer then_scope.instructions.deinit(astgen.gpa); try genDefers(&then_scope, defer_outer, scope, .normal_only); - _ = try then_scope.addUnNode(.ret_node, operand, node); + try then_scope.addRet(rl, operand, node); var else_scope = gz.makeSubBlock(scope); defer else_scope.instructions.deinit(astgen.gpa); @@ -6262,7 +6265,7 @@ fn ret(gz: *GenZir, scope: *Scope, node: ast.Node.Index) InnerError!Zir.Inst.Ref .both = try else_scope.addUnNode(.err_union_code, operand, node), }; try genDefers(&else_scope, defer_outer, scope, which_ones); - _ = try else_scope.addUnNode(.ret_node, operand, node); + try else_scope.addRet(rl, operand, node); try setCondBrPayload(condbr, is_non_err, &then_scope, &else_scope); @@ -6766,7 +6769,7 @@ fn as( ) InnerError!Zir.Inst.Ref { const dest_type = try typeExpr(gz, scope, lhs); switch (rl) { - .none, .none_or_ref, .discard, .ref, .ty => { + .none, .none_or_ref, .discard, .ref, .ty, .coerced_ty => { const result = try reachableExpr(gz, scope, .{ .ty = dest_type }, rhs, node); return rvalue(gz, rl, result, node); }, @@ -6789,7 +6792,7 @@ fn unionInit( const union_type = try typeExpr(gz, scope, params[0]); const field_name = try comptimeExpr(gz, scope, .{ .ty = .const_slice_u8_type }, params[1]); switch (rl) { - .none, .none_or_ref, .discard, .ref, .ty, .inferred_ptr => { + .none, .none_or_ref, .discard, .ref, .ty, .coerced_ty, .inferred_ptr => { _ = try gz.addPlNode(.field_type_ref, params[1], Zir.Inst.FieldTypeRef{ .container_type = union_type, .field_name = field_name, @@ -6875,7 +6878,7 @@ fn bitCast( const astgen = gz.astgen; const dest_type = try typeExpr(gz, scope, lhs); switch (rl) { - .none, .none_or_ref, .discard, .ty => { + .none, .none_or_ref, .discard, .ty, .coerced_ty => { const operand = try expr(gz, scope, .none, rhs); const result = try gz.addPlNode(.bitcast, node, Zir.Inst.Bin{ .lhs = dest_type, @@ -7226,6 +7229,25 @@ fn builtinCall( return rvalue(gz, rl, result, node); }, + .maximum => { + const a = try expr(gz, scope, .none, params[0]); + const b = try expr(gz, scope, .none, params[1]); + const result = try gz.addPlNode(.maximum, node, Zir.Inst.Bin{ + .lhs = a, + .rhs = b, + }); + return rvalue(gz, rl, result, node); + }, + .minimum => { + const a = try expr(gz, scope, .none, params[0]); + const b = try expr(gz, scope, .none, params[1]); + const result = try gz.addPlNode(.minimum, node, Zir.Inst.Bin{ + .lhs = a, + .rhs = b, + }); + return rvalue(gz, rl, result, node); + }, + .add_with_overflow => return overflowArithmetic(gz, scope, rl, node, params, .add_with_overflow), .sub_with_overflow => return overflowArithmetic(gz, scope, rl, node, params, .sub_with_overflow), .mul_with_overflow => return overflowArithmetic(gz, scope, rl, node, params, .mul_with_overflow), @@ -7375,6 +7397,15 @@ fn builtinCall( }); return rvalue(gz, rl, result, node); }, + .select => { + const result = try gz.addPlNode(.select, node, Zir.Inst.Select{ + .elem_type = try typeExpr(gz, scope, params[0]), + .pred = try expr(gz, scope, .none, params[1]), + .a = try expr(gz, scope, .none, params[2]), + .b = try expr(gz, scope, .none, params[3]), + }); + return rvalue(gz, rl, result, node); + }, .async_call => { const result = try gz.addPlNode(.builtin_async_call, node, Zir.Inst.AsyncCall{ .frame_buffer = try expr(gz, scope, .none, params[0]), @@ -7657,7 +7688,7 @@ fn callExpr( .param_index = @intCast(u32, i), } }, }); - args[i] = try expr(gz, scope, .{ .ty = param_type }, param_node); + args[i] = try expr(gz, scope, .{ .coerced_ty = param_type }, param_node); } const modifier: std.builtin.CallOptions.Modifier = blk: { @@ -7723,6 +7754,7 @@ pub const simple_types = std.ComptimeStringMap(Zir.Inst.Ref, .{ .{ "u32", .u32_type }, .{ "u64", .u64_type }, .{ "u128", .u128_type }, + .{ "u1", .u1_type }, .{ "u8", .u8_type }, .{ "undefined", .undef }, .{ "usize", .usize_type }, @@ -8349,7 +8381,7 @@ fn rvalue( src_node: ast.Node.Index, ) InnerError!Zir.Inst.Ref { switch (rl) { - .none, .none_or_ref => return result, + .none, .none_or_ref, .coerced_ty => return result, .discard => { // Emit a compile error for discarding error values. _ = try gz.addUnNode(.ensure_result_non_error, result, src_node); @@ -8369,6 +8401,7 @@ fn rvalue( const as_usize = @as(u64, @enumToInt(Zir.Inst.Ref.usize_type)) << 32; const as_void = @as(u64, @enumToInt(Zir.Inst.Ref.void_type)) << 32; switch ((@as(u64, @enumToInt(ty_inst)) << 32) | @as(u64, @enumToInt(result))) { + as_ty | @enumToInt(Zir.Inst.Ref.u1_type), as_ty | @enumToInt(Zir.Inst.Ref.u8_type), as_ty | @enumToInt(Zir.Inst.Ref.i8_type), as_ty | @enumToInt(Zir.Inst.Ref.u16_type), @@ -8574,7 +8607,7 @@ fn failNodeNotes( } const notes_index: u32 = if (notes.len != 0) blk: { const notes_start = astgen.extra.items.len; - try astgen.extra.ensureCapacity(astgen.gpa, notes_start + 1 + notes.len); + try astgen.extra.ensureTotalCapacity(astgen.gpa, notes_start + 1 + notes.len); astgen.extra.appendAssumeCapacity(@intCast(u32, notes.len)); astgen.extra.appendSliceAssumeCapacity(notes); break :blk @intCast(u32, notes_start); @@ -8615,7 +8648,7 @@ fn failTokNotes( } const notes_index: u32 = if (notes.len != 0) blk: { const notes_start = astgen.extra.items.len; - try astgen.extra.ensureCapacity(astgen.gpa, notes_start + 1 + notes.len); + try astgen.extra.ensureTotalCapacity(astgen.gpa, notes_start + 1 + notes.len); astgen.extra.appendAssumeCapacity(@intCast(u32, notes.len)); astgen.extra.appendSliceAssumeCapacity(notes); break :blk @intCast(u32, notes_start); @@ -8779,7 +8812,7 @@ fn strLitNodeAsString(astgen: *AstGen, node: ast.Node.Index) !IndexSlice { while (tok_i <= end) : (tok_i += 1) { const slice = tree.tokenSlice(tok_i); const line_bytes = slice[2 .. slice.len - 1]; - try string_bytes.ensureCapacity(gpa, string_bytes.items.len + line_bytes.len + 1); + try string_bytes.ensureUnusedCapacity(gpa, line_bytes.len + 1); string_bytes.appendAssumeCapacity('\n'); string_bytes.appendSliceAssumeCapacity(line_bytes); } @@ -8970,6 +9003,14 @@ const GenZir = struct { used: bool = false, }; + fn endsWithNoReturn(gz: GenZir) bool { + const tags = gz.astgen.instructions.items(.tag); + if (gz.instructions.items.len == 0) return false; + const last_inst = gz.instructions.items[gz.instructions.items.len - 1]; + return tags[last_inst].isNoReturn(); + } + + /// TODO all uses of this should be replaced with uses of `endsWithNoReturn`. fn refIsNoReturn(gz: GenZir, inst_ref: Zir.Inst.Ref) bool { if (inst_ref == .unreachable_value) return true; if (refToIndex(inst_ref)) |inst_index| { @@ -9020,7 +9061,7 @@ const GenZir = struct { // we emit ZIR for the block break instructions to have the result values, // and then rvalue() on that to pass the value to the result location. switch (parent_rl) { - .ty => |ty_inst| { + .ty, .coerced_ty => |ty_inst| { gz.rl_ty_inst = ty_inst; gz.break_result_loc = parent_rl; }, @@ -9046,8 +9087,8 @@ const GenZir = struct { fn setBoolBrBody(gz: GenZir, inst: Zir.Inst.Index) !void { const gpa = gz.astgen.gpa; - try gz.astgen.extra.ensureCapacity(gpa, gz.astgen.extra.items.len + - @typeInfo(Zir.Inst.Block).Struct.fields.len + gz.instructions.items.len); + try gz.astgen.extra.ensureUnusedCapacity(gpa, @typeInfo(Zir.Inst.Block).Struct.fields.len + + gz.instructions.items.len); const zir_datas = gz.astgen.instructions.items(.data); zir_datas[inst].bool_br.payload_index = gz.astgen.addExtraAssumeCapacity( Zir.Inst.Block{ .body_len = @intCast(u32, gz.instructions.items.len) }, @@ -9057,8 +9098,8 @@ const GenZir = struct { fn setBlockBody(gz: GenZir, inst: Zir.Inst.Index) !void { const gpa = gz.astgen.gpa; - try gz.astgen.extra.ensureCapacity(gpa, gz.astgen.extra.items.len + - @typeInfo(Zir.Inst.Block).Struct.fields.len + gz.instructions.items.len); + try gz.astgen.extra.ensureUnusedCapacity(gpa, @typeInfo(Zir.Inst.Block).Struct.fields.len + + gz.instructions.items.len); const zir_datas = gz.astgen.instructions.items(.data); zir_datas[inst].pl_node.payload_index = gz.astgen.addExtraAssumeCapacity( Zir.Inst.Block{ .body_len = @intCast(u32, gz.instructions.items.len) }, @@ -9070,8 +9111,8 @@ const GenZir = struct { /// `store_to_block_ptr` instructions with lhs set to .none. fn setBlockBodyEliding(gz: GenZir, inst: Zir.Inst.Index) !void { const gpa = gz.astgen.gpa; - try gz.astgen.extra.ensureCapacity(gpa, gz.astgen.extra.items.len + - @typeInfo(Zir.Inst.Block).Struct.fields.len + gz.instructions.items.len); + try gz.astgen.extra.ensureUnusedCapacity(gpa, @typeInfo(Zir.Inst.Block).Struct.fields.len + + gz.instructions.items.len); const zir_datas = gz.astgen.instructions.items(.data); const zir_tags = gz.astgen.instructions.items(.tag); const block_pl_index = gz.astgen.addExtraAssumeCapacity(Zir.Inst.Block{ @@ -9092,9 +9133,10 @@ const GenZir = struct { fn addFunc(gz: *GenZir, args: struct { src_node: ast.Node.Index, - param_types: []const Zir.Inst.Ref, body: []const Zir.Inst.Index, - ret_ty: Zir.Inst.Ref, + param_block: Zir.Inst.Index, + ret_ty: []const Zir.Inst.Index, + ret_br: Zir.Inst.Index, cc: Zir.Inst.Ref, align_inst: Zir.Inst.Ref, lib_name: u32, @@ -9104,7 +9146,6 @@ const GenZir = struct { is_extern: bool, }) !Zir.Inst.Ref { assert(args.src_node != 0); - assert(args.ret_ty != .none); const astgen = gz.astgen; const gpa = astgen.gpa; @@ -9146,15 +9187,15 @@ const GenZir = struct { try astgen.extra.ensureUnusedCapacity( gpa, @typeInfo(Zir.Inst.ExtendedFunc).Struct.fields.len + - args.param_types.len + args.body.len + src_locs.len + + args.ret_ty.len + args.body.len + src_locs.len + @boolToInt(args.lib_name != 0) + @boolToInt(args.align_inst != .none) + @boolToInt(args.cc != .none), ); const payload_index = astgen.addExtraAssumeCapacity(Zir.Inst.ExtendedFunc{ .src_node = gz.nodeIndexToRelative(args.src_node), - .return_type = args.ret_ty, - .param_types_len = @intCast(u32, args.param_types.len), + .param_block = args.param_block, + .ret_body_len = @intCast(u32, args.ret_ty.len), .body_len = @intCast(u32, args.body.len), }); if (args.lib_name != 0) { @@ -9166,11 +9207,14 @@ const GenZir = struct { if (args.align_inst != .none) { astgen.extra.appendAssumeCapacity(@enumToInt(args.align_inst)); } - astgen.appendRefsAssumeCapacity(args.param_types); + astgen.extra.appendSliceAssumeCapacity(args.ret_ty); astgen.extra.appendSliceAssumeCapacity(args.body); astgen.extra.appendSliceAssumeCapacity(src_locs); const new_index = @intCast(Zir.Inst.Index, astgen.instructions.len); + if (args.ret_br != 0) { + astgen.instructions.items(.data)[args.ret_br].@"break".block_inst = new_index; + } astgen.instructions.appendAssumeCapacity(.{ .tag = .extended, .data = .{ .extended = .{ @@ -9190,24 +9234,27 @@ const GenZir = struct { gz.instructions.appendAssumeCapacity(new_index); return indexToRef(new_index); } else { - try gz.astgen.extra.ensureUnusedCapacity( + try astgen.extra.ensureUnusedCapacity( gpa, @typeInfo(Zir.Inst.Func).Struct.fields.len + - args.param_types.len + args.body.len + src_locs.len, + args.ret_ty.len + args.body.len + src_locs.len, ); - const payload_index = gz.astgen.addExtraAssumeCapacity(Zir.Inst.Func{ - .return_type = args.ret_ty, - .param_types_len = @intCast(u32, args.param_types.len), + const payload_index = astgen.addExtraAssumeCapacity(Zir.Inst.Func{ + .param_block = args.param_block, + .ret_body_len = @intCast(u32, args.ret_ty.len), .body_len = @intCast(u32, args.body.len), }); - gz.astgen.appendRefsAssumeCapacity(args.param_types); - gz.astgen.extra.appendSliceAssumeCapacity(args.body); - gz.astgen.extra.appendSliceAssumeCapacity(src_locs); + astgen.extra.appendSliceAssumeCapacity(args.ret_ty); + astgen.extra.appendSliceAssumeCapacity(args.body); + astgen.extra.appendSliceAssumeCapacity(src_locs); const tag: Zir.Inst.Tag = if (args.is_inferred_error) .func_inferred else .func; - const new_index = @intCast(Zir.Inst.Index, gz.astgen.instructions.len); - gz.astgen.instructions.appendAssumeCapacity(.{ + const new_index = @intCast(Zir.Inst.Index, astgen.instructions.len); + if (args.ret_br != 0) { + astgen.instructions.items(.data)[args.ret_br].@"break".block_inst = new_index; + } + astgen.instructions.appendAssumeCapacity(.{ .tag = tag, .data = .{ .pl_node = .{ .src_node = gz.nodeIndexToRelative(args.src_node), @@ -9283,10 +9330,10 @@ const GenZir = struct { assert(callee != .none); assert(src_node != 0); const gpa = gz.astgen.gpa; - try gz.instructions.ensureCapacity(gpa, gz.instructions.items.len + 1); - try gz.astgen.instructions.ensureCapacity(gpa, gz.astgen.instructions.len + 1); - try gz.astgen.extra.ensureCapacity(gpa, gz.astgen.extra.items.len + - @typeInfo(Zir.Inst.Call).Struct.fields.len + args.len); + try gz.instructions.ensureUnusedCapacity(gpa, 1); + try gz.astgen.instructions.ensureUnusedCapacity(gpa, 1); + try gz.astgen.extra.ensureUnusedCapacity(gpa, @typeInfo(Zir.Inst.Call).Struct.fields.len + + args.len); const payload_index = gz.astgen.addExtraAssumeCapacity(Zir.Inst.Call{ .callee = callee, @@ -9315,8 +9362,8 @@ const GenZir = struct { ) !Zir.Inst.Index { assert(lhs != .none); const gpa = gz.astgen.gpa; - try gz.instructions.ensureCapacity(gpa, gz.instructions.items.len + 1); - try gz.astgen.instructions.ensureCapacity(gpa, gz.astgen.instructions.len + 1); + try gz.instructions.ensureUnusedCapacity(gpa, 1); + try gz.astgen.instructions.ensureUnusedCapacity(gpa, 1); const new_index = @intCast(Zir.Inst.Index, gz.astgen.instructions.len); gz.astgen.instructions.appendAssumeCapacity(.{ @@ -9389,8 +9436,8 @@ const GenZir = struct { extra: anytype, ) !Zir.Inst.Ref { const gpa = gz.astgen.gpa; - try gz.instructions.ensureCapacity(gpa, gz.instructions.items.len + 1); - try gz.astgen.instructions.ensureCapacity(gpa, gz.astgen.instructions.len + 1); + try gz.instructions.ensureUnusedCapacity(gpa, 1); + try gz.astgen.instructions.ensureUnusedCapacity(gpa, 1); const payload_index = try gz.astgen.addExtra(extra); const new_index = @intCast(Zir.Inst.Index, gz.astgen.instructions.len); @@ -9405,6 +9452,38 @@ const GenZir = struct { return indexToRef(new_index); } + fn addParam( + gz: *GenZir, + tag: Zir.Inst.Tag, + /// Absolute token index. This function does the conversion to Decl offset. + abs_tok_index: ast.TokenIndex, + name: u32, + body: []const u32, + ) !Zir.Inst.Index { + const gpa = gz.astgen.gpa; + try gz.instructions.ensureUnusedCapacity(gpa, 1); + try gz.astgen.instructions.ensureUnusedCapacity(gpa, 1); + try gz.astgen.extra.ensureUnusedCapacity(gpa, @typeInfo(Zir.Inst.Param).Struct.fields.len + + body.len); + + const payload_index = gz.astgen.addExtraAssumeCapacity(Zir.Inst.Param{ + .name = name, + .body_len = @intCast(u32, body.len), + }); + gz.astgen.extra.appendSliceAssumeCapacity(body); + + const new_index = @intCast(Zir.Inst.Index, gz.astgen.instructions.len); + gz.astgen.instructions.appendAssumeCapacity(.{ + .tag = tag, + .data = .{ .pl_tok = .{ + .src_tok = gz.tokenIndexToRelative(abs_tok_index), + .payload_index = payload_index, + } }, + }); + gz.instructions.appendAssumeCapacity(new_index); + return new_index; + } + fn addExtendedPayload( gz: *GenZir, opcode: Zir.Inst.Extended, @@ -9412,8 +9491,8 @@ const GenZir = struct { ) !Zir.Inst.Ref { const gpa = gz.astgen.gpa; - try gz.instructions.ensureCapacity(gpa, gz.instructions.items.len + 1); - try gz.astgen.instructions.ensureCapacity(gpa, gz.astgen.instructions.len + 1); + try gz.instructions.ensureUnusedCapacity(gpa, 1); + try gz.astgen.instructions.ensureUnusedCapacity(gpa, 1); const payload_index = try gz.astgen.addExtra(extra); const new_index = @intCast(Zir.Inst.Index, gz.astgen.instructions.len); @@ -9469,8 +9548,8 @@ const GenZir = struct { elem_type: Zir.Inst.Ref, ) !Zir.Inst.Ref { const gpa = gz.astgen.gpa; - try gz.instructions.ensureCapacity(gpa, gz.instructions.items.len + 1); - try gz.astgen.instructions.ensureCapacity(gpa, gz.astgen.instructions.len + 1); + try gz.instructions.ensureUnusedCapacity(gpa, 1); + try gz.astgen.instructions.ensureUnusedCapacity(gpa, 1); const payload_index = try gz.astgen.addExtra(Zir.Inst.ArrayTypeSentinel{ .sentinel = sentinel, @@ -9725,7 +9804,7 @@ const GenZir = struct { /// Leaves the `payload_index` field undefined. fn addCondBr(gz: *GenZir, tag: Zir.Inst.Tag, node: ast.Node.Index) !Zir.Inst.Index { const gpa = gz.astgen.gpa; - try gz.instructions.ensureCapacity(gpa, gz.instructions.items.len + 1); + try gz.instructions.ensureUnusedCapacity(gpa, 1); const new_index = @intCast(Zir.Inst.Index, gz.astgen.instructions.len); try gz.astgen.instructions.append(gpa, .{ .tag = tag, @@ -9906,6 +9985,14 @@ const GenZir = struct { gz.instructions.appendAssumeCapacity(new_index); return new_index; } + + fn addRet(gz: *GenZir, rl: ResultLoc, operand: Zir.Inst.Ref, node: ast.Node.Index) !void { + switch (rl) { + .ptr => |ret_ptr| _ = try gz.addUnNode(.ret_load, ret_ptr, node), + .ty => _ = try gz.addUnNode(.ret_node, operand, node), + else => unreachable, + } + } }; /// This can only be for short-lived references; the memory becomes invalidated diff --git a/src/BuiltinFn.zig b/src/BuiltinFn.zig index 3964512838..8f23ec86d7 100644 --- a/src/BuiltinFn.zig +++ b/src/BuiltinFn.zig @@ -57,8 +57,10 @@ pub const Tag = enum { int_to_error, int_to_float, int_to_ptr, + maximum, memcpy, memset, + minimum, wasm_memory_size, wasm_memory_grow, mod, @@ -69,6 +71,7 @@ pub const Tag = enum { ptr_to_int, rem, return_address, + select, set_align_stack, set_cold, set_eval_branch_quota, @@ -517,6 +520,13 @@ pub const list = list: { .param_count = 2, }, }, + .{ + "@maximum", + .{ + .tag = .maximum, + .param_count = 2, + }, + }, .{ "@memcpy", .{ @@ -531,6 +541,13 @@ pub const list = list: { .param_count = 3, }, }, + .{ + "@minimum", + .{ + .tag = .minimum, + .param_count = 2, + }, + }, .{ "@wasmMemorySize", .{ @@ -601,6 +618,13 @@ pub const list = list: { .param_count = 0, }, }, + .{ + "@select", + .{ + .tag = .select, + .param_count = 4, + }, + }, .{ "@setAlignStack", .{ diff --git a/src/Cache.zig b/src/Cache.zig index 94c1b41c61..28401c3d18 100644 --- a/src/Cache.zig +++ b/src/Cache.zig @@ -356,7 +356,7 @@ pub const Manifest = struct { const input_file_count = self.files.items.len; var any_file_changed = false; - var line_iter = mem.tokenize(file_contents, "\n"); + var line_iter = mem.tokenize(u8, file_contents, "\n"); var idx: usize = 0; while (line_iter.next()) |line| { defer idx += 1; @@ -373,7 +373,7 @@ pub const Manifest = struct { break :blk new; }; - var iter = mem.tokenize(line, " "); + var iter = mem.tokenize(u8, line, " "); const size = iter.next() orelse return error.InvalidFormat; const inode = iter.next() orelse return error.InvalidFormat; const mtime_nsec_str = iter.next() orelse return error.InvalidFormat; diff --git a/src/Compilation.zig b/src/Compilation.zig index a34d0cd198..24e2d9e67f 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -944,8 +944,6 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation { if (options.sysroot) |sysroot| { break :blk sysroot; } else if (darwin_can_use_system_sdk) { - // TODO Revisit this targeting versions lower than macOS 11 when LLVM 12 is out. - // See https://github.com/ziglang/zig/issues/6996 const at_least_big_sur = options.target.os.getVersionRange().semver.min.major >= 11; break :blk if (at_least_big_sur) try std.zig.system.getSDKPath(arena) else null; } else { @@ -1029,7 +1027,7 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation { options.target, options.is_native_abi, link_libc, - options.system_libs.len != 0, + options.system_libs.len != 0 or options.frameworks.len != 0, options.libc_installation, ); @@ -1229,6 +1227,12 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation { } else main_pkg; errdefer if (options.is_test) root_pkg.destroy(gpa); + var other_pkg_iter = main_pkg.table.valueIterator(); + while (other_pkg_iter.next()) |pkg| { + try pkg.*.add(gpa, "builtin", builtin_pkg); + try pkg.*.add(gpa, "std", std_pkg); + } + try main_pkg.addAndAdopt(gpa, "builtin", builtin_pkg); try main_pkg.add(gpa, "root", root_pkg); try main_pkg.addAndAdopt(gpa, "std", std_pkg); @@ -1709,7 +1713,9 @@ pub fn update(self: *Compilation) !void { // in the start code, but when using the stage1 backend that won't happen, // so in order to run AstGen on the root source file we put it into the // import_table here. - if (use_stage1) { + // Likewise, in the case of `zig test`, the test runner is the root source file, + // and so there is nothing to import the main file. + if (use_stage1 or self.bin_file.options.is_test) { _ = try module.importPkg(module.main_pkg); } @@ -1725,6 +1731,9 @@ pub fn update(self: *Compilation) !void { if (!use_stage1) { try self.work_queue.writeItem(.{ .analyze_pkg = std_pkg }); + if (self.bin_file.options.is_test) { + try self.work_queue.writeItem(.{ .analyze_pkg = module.main_pkg }); + } } } @@ -1732,6 +1741,13 @@ pub fn update(self: *Compilation) !void { if (!use_stage1) { if (self.bin_file.options.module) |module| { + if (self.bin_file.options.is_test and self.totalErrorCount() == 0) { + // The `test_functions` decl has been intentionally postponed until now, + // at which point we must populate it with the list of test functions that + // have been discovered and not filtered out. + try module.populateTestFunctions(); + } + // Process the deletion set. We use a while loop here because the // deletion set may grow as we call `clearDecl` within this loop, // and more unreferenced Decls are revealed. @@ -2049,28 +2065,19 @@ pub fn performAllTheWork(self: *Compilation) error{ TimerUnsupported, OutOfMemor .complete, .codegen_failure_retryable => { if (build_options.omit_stage2) @panic("sadly stage2 is omitted from this build to save memory on the CI server"); + const module = self.bin_file.options.module.?; assert(decl.has_tv); assert(decl.ty.hasCodeGenBits()); - self.bin_file.updateDecl(module, decl) catch |err| switch (err) { - error.OutOfMemory => return error.OutOfMemory, - error.AnalysisFail => { - decl.analysis = .codegen_failure; - continue; - }, - else => { - try module.failed_decls.ensureUnusedCapacity(gpa, 1); - module.failed_decls.putAssumeCapacityNoClobber(decl, try Module.ErrorMsg.create( - gpa, - decl.srcLoc(), - "unable to codegen: {s}", - .{@errorName(err)}, - )); - decl.analysis = .codegen_failure_retryable; - continue; - }, - }; + if (decl.alive) { + try module.linkerUpdateDecl(decl); + continue; + } + + // Instead of sending this decl to the linker, we actually will delete it + // because we found out that it in fact was never referenced. + module.deleteUnusedDecl(decl); }, }, .codegen_func => |func| switch (func.owner_decl.analysis) { @@ -2115,7 +2122,7 @@ pub fn performAllTheWork(self: *Compilation) error{ TimerUnsupported, OutOfMemor if (builtin.mode == .Debug and self.verbose_air) { std.debug.print("# Begin Function AIR: {s}:\n", .{decl.name}); @import("print_air.zig").dump(gpa, air, decl.namespace.file_scope.zir, liveness); - std.debug.print("# End Function AIR: {s}:\n", .{decl.name}); + std.debug.print("# End Function AIR: {s}\n\n", .{decl.name}); } self.bin_file.updateFunc(module, func, air, liveness) catch |err| switch (err) { @@ -3340,7 +3347,7 @@ pub fn hasSharedLibraryExt(filename: []const u8) bool { return true; } // Look for .so.X, .so.X.Y, .so.X.Y.Z - var it = mem.split(filename, "."); + var it = mem.split(u8, filename, "."); _ = it.next().?; var so_txt = it.next() orelse return false; while (!mem.eql(u8, so_txt, "so")) { @@ -4085,7 +4092,7 @@ fn updateStage1Module(comp: *Compilation, main_progress_node: *std.Progress.Node }; if (directory.handle.readFileAlloc(comp.gpa, libs_txt_basename, 10 * 1024 * 1024)) |libs_txt| { - var it = mem.tokenize(libs_txt, "\n"); + var it = mem.tokenize(u8, libs_txt, "\n"); while (it.next()) |lib_name| { try comp.stage1AddLinkLib(lib_name); } diff --git a/src/Liveness.zig b/src/Liveness.zig index c6617e9b29..48603fc7c9 100644 --- a/src/Liveness.zig +++ b/src/Liveness.zig @@ -231,6 +231,8 @@ fn analyzeInst( .mul, .mulwrap, .div, + .ptr_add, + .ptr_sub, .bit_and, .bit_or, .xor, @@ -245,6 +247,8 @@ fn analyzeInst( .store, .slice_elem_val, .ptr_slice_elem_val, + .ptr_elem_val, + .ptr_ptr_elem_val, => { const o = inst_datas[inst].bin_op; return trackOperands(a, new_set, inst, main_tomb, .{ o.lhs, o.rhs, .none }); @@ -256,16 +260,15 @@ fn analyzeInst( .const_ty, .breakpoint, .dbg_stmt, - .varptr, .unreach, => return trackOperands(a, new_set, inst, main_tomb, .{ .none, .none, .none }), .not, .bitcast, .load, - .ref, .floatcast, .intcast, + .trunc, .optional_payload, .optional_payload_ptr, .wrap_optional, @@ -291,6 +294,7 @@ fn analyzeInst( .is_err_ptr, .is_non_err_ptr, .ptrtoint, + .bool_to_int, .ret, => { const operand = inst_datas[inst].un_op; @@ -320,9 +324,9 @@ fn analyzeInst( } return extra_tombs.finish(); }, - .struct_field_ptr => { + .struct_field_ptr, .struct_field_val => { const extra = a.air.extraData(Air.StructField, inst_datas[inst].ty_pl.payload).data; - return trackOperands(a, new_set, inst, main_tomb, .{ extra.struct_ptr, .none, .none }); + return trackOperands(a, new_set, inst, main_tomb, .{ extra.struct_operand, .none, .none }); }, .br => { const br = inst_datas[inst].br; diff --git a/src/Module.zig b/src/Module.zig index 8ebb1c203c..42b36b5a04 100644 --- a/src/Module.zig +++ b/src/Module.zig @@ -61,6 +61,11 @@ export_owners: std.AutoArrayHashMapUnmanaged(*Decl, []*Export) = .{}, /// Keys are fully resolved file paths. This table owns the keys and values. import_table: std.StringArrayHashMapUnmanaged(*Scope.File) = .{}, +/// The set of all the generic function instantiations. This is used so that when a generic +/// function is called twice with the same comptime parameter arguments, both calls dispatch +/// to the same function. +monomorphed_funcs: MonomorphedFuncsSet = .{}, + /// We optimize memory usage for a compilation with no compile errors by storing the /// error messages and mapping outside of `Decl`. /// The ErrorMsg memory is owned by the decl, using Module's general purpose allocator. @@ -112,6 +117,46 @@ compile_log_text: ArrayListUnmanaged(u8) = .{}, emit_h: ?*GlobalEmitH, +test_functions: std.AutoArrayHashMapUnmanaged(*Decl, void) = .{}, + +const MonomorphedFuncsSet = std.HashMapUnmanaged( + *Fn, + void, + MonomorphedFuncsContext, + std.hash_map.default_max_load_percentage, +); + +const MonomorphedFuncsContext = struct { + pub fn eql(ctx: @This(), a: *Fn, b: *Fn) bool { + _ = ctx; + return a == b; + } + + /// Must match `Sema.GenericCallAdapter.hash`. + pub fn hash(ctx: @This(), key: *Fn) u64 { + _ = ctx; + var hasher = std.hash.Wyhash.init(0); + + // The generic function Decl is guaranteed to be the first dependency + // of each of its instantiations. + const generic_owner_decl = key.owner_decl.dependencies.keys()[0]; + const generic_func = generic_owner_decl.val.castTag(.function).?.data; + std.hash.autoHash(&hasher, @ptrToInt(generic_func)); + + // This logic must be kept in sync with the logic in `analyzeCall` that + // computes the hash. + const comptime_args = key.comptime_args.?; + const generic_ty_info = generic_owner_decl.ty.fnInfo(); + for (generic_ty_info.param_types) |param_ty, i| { + if (generic_ty_info.paramIsComptime(i) and param_ty.tag() != .generic_poison) { + comptime_args[i].val.hash(param_ty, &hasher); + } + } + + return hasher.final(); + } +}; + /// A `Module` has zero or one of these depending on whether `-femit-h` is enabled. pub const GlobalEmitH = struct { /// Where to put the output. @@ -253,6 +298,15 @@ pub const Decl = struct { has_align: bool, /// Whether the ZIR code provides a linksection instruction. has_linksection: bool, + /// Flag used by garbage collection to mark and sweep. + /// Decls which correspond to an AST node always have this field set to `true`. + /// Anonymous Decls are initialized with this field set to `false` and then it + /// is the responsibility of machine code backends to mark it `true` whenever + /// a `decl_ref` Value is encountered that points to this Decl. + /// When the `codegen_decl` job is encountered in the main work queue, if the + /// Decl is marked alive, then it sends the Decl to the linker. Otherwise it + /// deletes the Decl on the spot. + alive: bool, /// Represents the position of the code in the output file. /// This is populated regardless of semantic analysis and code generation. @@ -282,6 +336,7 @@ pub const Decl = struct { pub fn destroy(decl: *Decl, module: *Module) void { const gpa = module.gpa; log.debug("destroy {*} ({s})", .{ decl, decl.name }); + _ = module.test_functions.swapRemove(decl); if (decl.deletion_flag) { assert(module.deletion_set.swapRemove(decl)); } @@ -745,6 +800,11 @@ pub const Union = struct { pub const Fn = struct { /// The Decl that corresponds to the function itself. owner_decl: *Decl, + /// If this is not null, this function is a generic function instantiation, and + /// there is a `TypedValue` here for each parameter of the function. + /// Non-comptime parameters are marked with a `generic_poison` for the value. + /// Non-anytype parameters are marked with a `generic_poison` for the type. + comptime_args: ?[*]TypedValue = null, /// The ZIR instruction that is a function instruction. Use this to find /// the body. We store this rather than the body directly so that when ZIR /// is regenerated on update(), we can map this to the new corresponding @@ -783,6 +843,9 @@ pub const Fn = struct { pub fn getInferredErrorSet(func: *Fn) ?*std.StringHashMapUnmanaged(void) { const ret_ty = func.owner_decl.ty.fnReturnType(); + if (ret_ty.tag() == .generic_poison) { + return null; + } if (ret_ty.zigTypeTag() == .ErrorUnion) { if (ret_ty.errorUnionSet().castTag(.error_set_inferred)) |payload| { return &payload.data.map; @@ -1157,6 +1220,8 @@ pub const Scope = struct { /// for the one that will be the same for all Block instances. src_decl: *Decl, instructions: ArrayListUnmanaged(Air.Inst.Index), + // `param` instructions are collected here to be used by the `func` instruction. + params: std.ArrayListUnmanaged(Param) = .{}, label: ?*Label = null, inlining: ?*Inlining, /// If runtime_index is not 0 then one of these is guaranteed to be non null. @@ -1171,6 +1236,12 @@ pub const Scope = struct { /// when null, it is determined by build mode, changed by @setRuntimeSafety want_safety: ?bool = null, + const Param = struct { + /// `noreturn` means `anytype`. + ty: Type, + is_comptime: bool, + }; + /// This `Block` maps a block ZIR instruction to the corresponding /// AIR instruction for break instruction analysis. pub const Label = struct { @@ -1305,6 +1376,16 @@ pub const Scope = struct { }); } + pub fn addArg(block: *Block, ty: Type, name: u32) error{OutOfMemory}!Air.Inst.Ref { + return block.addInst(.{ + .tag = .arg, + .data = .{ .ty_str = .{ + .ty = try block.sema.addType(ty), + .str = name, + } }, + }); + } + pub fn addInst(block: *Block, inst: Air.Inst) error{OutOfMemory}!Air.Inst.Ref { return Air.indexToRef(try block.addInstAsIndex(inst)); } @@ -1321,6 +1402,42 @@ pub const Scope = struct { block.instructions.appendAssumeCapacity(result_index); return result_index; } + + pub fn startAnonDecl(block: *Block) !WipAnonDecl { + return WipAnonDecl{ + .block = block, + .new_decl_arena = std.heap.ArenaAllocator.init(block.sema.gpa), + .finished = false, + }; + } + + pub const WipAnonDecl = struct { + block: *Scope.Block, + new_decl_arena: std.heap.ArenaAllocator, + finished: bool, + + pub fn arena(wad: *WipAnonDecl) *Allocator { + return &wad.new_decl_arena.allocator; + } + + pub fn deinit(wad: *WipAnonDecl) void { + if (!wad.finished) { + wad.new_decl_arena.deinit(); + } + wad.* = undefined; + } + + pub fn finish(wad: *WipAnonDecl, ty: Type, val: Value) !*Decl { + const new_decl = try wad.block.sema.mod.createAnonymousDecl(&wad.block.base, .{ + .ty = ty, + .val = val, + }); + errdefer wad.block.sema.mod.deleteAnonDecl(&wad.block.base, new_decl); + try new_decl.finalizeNewArena(&wad.new_decl_arena); + wad.finished = true; + return new_decl; + } + }; }; }; @@ -1582,8 +1699,11 @@ pub const SrcLoc = struct { .@"asm" => tree.asmFull(node), else => unreachable, }; + const asm_output = full.outputs[0]; + const node_datas = tree.nodes.items(.data); + const ret_ty_node = node_datas[asm_output].lhs; const main_tokens = tree.nodes.items(.main_token); - const tok_index = main_tokens[full.outputs[0]]; + const tok_index = main_tokens[ret_ty_node]; const token_starts = tree.tokens.items(.start); return token_starts[tok_index]; }, @@ -1697,6 +1817,7 @@ pub const SrcLoc = struct { .node_offset_fn_type_cc => |node_off| { const tree = try src_loc.file_scope.getTree(gpa); + const node_datas = tree.nodes.items(.data); const node_tags = tree.nodes.items(.tag); const node = src_loc.declRelativeToNodeIndex(node_off); var params: [1]ast.Node.Index = undefined; @@ -1705,6 +1826,13 @@ pub const SrcLoc = struct { .fn_proto_multi => tree.fnProtoMulti(node), .fn_proto_one => tree.fnProtoOne(¶ms, node), .fn_proto => tree.fnProto(node), + .fn_decl => switch (node_tags[node_datas[node].lhs]) { + .fn_proto_simple => tree.fnProtoSimple(¶ms, node_datas[node].lhs), + .fn_proto_multi => tree.fnProtoMulti(node_datas[node].lhs), + .fn_proto_one => tree.fnProtoOne(¶ms, node_datas[node].lhs), + .fn_proto => tree.fnProto(node_datas[node].lhs), + else => unreachable, + }, else => unreachable, }; const main_tokens = tree.nodes.items(.main_token); @@ -2039,7 +2167,20 @@ pub const LazySrcLoc = union(enum) { }; pub const SemaError = error{ OutOfMemory, AnalysisFail }; -pub const CompileError = error{ OutOfMemory, AnalysisFail, NeededSourceLocation }; +pub const CompileError = error{ + OutOfMemory, + /// When this is returned, the compile error for the failure has already been recorded. + AnalysisFail, + /// Returned when a compile error needed to be reported but a provided LazySrcLoc was set + /// to the `unneeded` tag. The source location was, in fact, needed. It is expected that + /// somewhere up the call stack, the operation will be retried after doing expensive work + /// to compute a source location. + NeededSourceLocation, + /// A Type or Value was needed to be used during semantic analysis, but it was not available + /// because the function is generic. This is only seen when analyzing the body of a param + /// instruction. + GenericPoison, +}; pub fn deinit(mod: *Module) void { const gpa = mod.gpa; @@ -2120,6 +2261,8 @@ pub fn deinit(mod: *Module) void { mod.global_error_set.deinit(gpa); mod.error_name_list.deinit(gpa); + mod.test_functions.deinit(gpa); + mod.monomorphed_funcs.deinit(gpa); } fn freeExportList(gpa: *Allocator, export_list: []*Export) void { @@ -2735,14 +2878,16 @@ pub fn ensureDeclAnalyzed(mod: *Module, decl: *Decl) SemaError!void { } return error.AnalysisFail; }, - else => { + error.NeededSourceLocation => unreachable, + error.GenericPoison => unreachable, + else => |e| { decl.analysis = .sema_failure_retryable; try mod.failed_decls.ensureUnusedCapacity(mod.gpa, 1); mod.failed_decls.putAssumeCapacityNoClobber(decl, try ErrorMsg.create( mod.gpa, decl.srcLoc(), "unable to analyze: {s}", - .{@errorName(err)}, + .{@errorName(e)}, )); return error.AnalysisFail; }, @@ -2821,6 +2966,7 @@ pub fn semaFile(mod: *Module, file: *Scope.File) SemaError!void { new_decl.val = struct_val; new_decl.has_tv = true; new_decl.owns_tv = true; + new_decl.alive = true; // This Decl corresponds to a File and is therefore always alive. new_decl.analysis = .in_progress; new_decl.generation = mod.generation; @@ -2840,8 +2986,8 @@ pub fn semaFile(mod: *Module, file: *Scope.File) SemaError!void { .owner_decl = new_decl, .namespace = &struct_obj.namespace, .func = null, + .fn_ret_ty = Type.initTag(.void), .owner_func = null, - .param_inst_list = &.{}, }; defer sema.deinit(); var block_scope: Scope.Block = .{ @@ -2895,8 +3041,8 @@ fn semaDecl(mod: *Module, decl: *Decl) !bool { .owner_decl = decl, .namespace = decl.namespace, .func = null, + .fn_ret_ty = Type.initTag(.void), .owner_func = null, - .param_inst_list = &.{}, }; defer sema.deinit(); @@ -2922,7 +3068,10 @@ fn semaDecl(mod: *Module, decl: *Decl) !bool { .inlining = null, .is_comptime = true, }; - defer block_scope.instructions.deinit(gpa); + defer { + block_scope.instructions.deinit(gpa); + block_scope.params.deinit(gpa); + } const zir_block_index = decl.zirBlockIndex(); const inst_data = zir_datas[zir_block_index].pl_node; @@ -2931,7 +3080,7 @@ fn semaDecl(mod: *Module, decl: *Decl) !bool { const break_index = try sema.analyzeBody(&block_scope, body); const result_ref = zir_datas[break_index].@"break".operand; const src: LazySrcLoc = .{ .node_offset = 0 }; - const decl_tv = try sema.resolveInstConst(&block_scope, src, result_ref); + const decl_tv = try sema.resolveInstValue(&block_scope, src, result_ref); const align_val = blk: { const align_ref = decl.zirAlignRef(); if (align_ref == .none) break :blk Value.initTag(.null_value); @@ -2942,6 +3091,7 @@ fn semaDecl(mod: *Module, decl: *Decl) !bool { if (linksection_ref == .none) break :blk Value.initTag(.null_value); break :blk (try sema.resolveInstConst(&block_scope, src, linksection_ref)).val; }; + try sema.resolveTypeLayout(&block_scope, src, decl_tv.ty); // We need the memory for the Type to go into the arena for the Decl var decl_arena = std.heap.ArenaAllocator.init(gpa); @@ -2979,8 +3129,8 @@ fn semaDecl(mod: *Module, decl: *Decl) !bool { const is_inline = decl_tv.ty.fnCallingConvention() == .Inline; if (!is_inline and decl_tv.ty.hasCodeGenBits()) { // We don't fully codegen the decl until later, but we do need to reserve a global - // offset table index for it. This allows us to codegen decls out of dependency order, - // increasing how many computations can be done in parallel. + // offset table index for it. This allows us to codegen decls out of dependency + // order, increasing how many computations can be done in parallel. try mod.comp.bin_file.allocateDeclIndexes(decl); try mod.comp.work_queue.writeItem(.{ .codegen_func = func }); if (type_changed and mod.emit_h != null) { @@ -3319,6 +3469,7 @@ fn scanDecl(iter: *ScanDeclIter, decl_sub_index: usize, flags: u4) SemaError!voi // the test name filter. if (!mod.comp.bin_file.options.is_test) break :blk false; if (decl_pkg != mod.main_pkg) break :blk false; + try mod.test_functions.put(gpa, new_decl, {}); break :blk true; }, else => blk: { @@ -3326,6 +3477,7 @@ fn scanDecl(iter: *ScanDeclIter, decl_sub_index: usize, flags: u4) SemaError!voi if (!mod.comp.bin_file.options.is_test) break :blk false; if (decl_pkg != mod.main_pkg) break :blk false; // TODO check the name against --test-filter + try mod.test_functions.put(gpa, new_decl, {}); break :blk true; }, }; @@ -3337,6 +3489,7 @@ fn scanDecl(iter: *ScanDeclIter, decl_sub_index: usize, flags: u4) SemaError!voi new_decl.has_align = has_align; new_decl.has_linksection = has_linksection; new_decl.zir_decl_index = @intCast(u32, decl_sub_index); + new_decl.alive = true; // This Decl corresponds to an AST node and therefore always alive. return; } gpa.free(decl_name); @@ -3476,6 +3629,43 @@ pub fn clearDecl( decl.analysis = .unreferenced; } +pub fn deleteUnusedDecl(mod: *Module, decl: *Decl) void { + log.debug("deleteUnusedDecl {*} ({s})", .{ decl, decl.name }); + + // TODO: remove `allocateDeclIndexes` and make the API that the linker backends + // are required to notice the first time `updateDecl` happens and keep track + // of it themselves. However they can rely on getting a `freeDecl` call if any + // `updateDecl` or `updateFunc` calls happen. This will allow us to avoid any call + // into the linker backend here, since the linker backend will never have been told + // about the Decl in the first place. + // Until then, we did call `allocateDeclIndexes` on this anonymous Decl and so we + // must call `freeDecl` in the linker backend now. + if (decl.has_tv) { + if (decl.ty.hasCodeGenBits()) { + mod.comp.bin_file.freeDecl(decl); + } + } + + const dependants = decl.dependants.keys(); + assert(dependants[0].namespace.anon_decls.swapRemove(decl)); + + for (dependants) |dep| { + dep.removeDependency(decl); + } + + for (decl.dependencies.keys()) |dep| { + dep.removeDependant(decl); + } + decl.destroy(mod); +} + +pub fn deleteAnonDecl(mod: *Module, scope: *Scope, decl: *Decl) void { + log.debug("deleteAnonDecl {*} ({s})", .{ decl, decl.name }); + const scope_decl = scope.ownerDecl().?; + assert(scope_decl.namespace.anon_decls.swapRemove(decl)); + decl.destroy(mod); +} + /// Delete all the Export objects that are caused by this Decl. Re-analysis of /// this Decl will cause them to be re-created (or not). fn deleteDeclExports(mod: *Module, decl: *Decl) void { @@ -3526,8 +3716,6 @@ pub fn analyzeFnBody(mod: *Module, decl: *Decl, func: *Fn) SemaError!Air { defer decl.value_arena.?.* = arena.state; const fn_ty = decl.ty; - const param_inst_list = try gpa.alloc(Air.Inst.Ref, fn_ty.fnParamLen()); - defer gpa.free(param_inst_list); var sema: Sema = .{ .mod = mod, @@ -3537,8 +3725,8 @@ pub fn analyzeFnBody(mod: *Module, decl: *Decl, func: *Fn) SemaError!Air { .owner_decl = decl, .namespace = decl.namespace, .func = func, + .fn_ret_ty = func.owner_decl.ty.fnReturnType(), .owner_func = func, - .param_inst_list = param_inst_list, }; defer sema.deinit(); @@ -3557,29 +3745,71 @@ pub fn analyzeFnBody(mod: *Module, decl: *Decl, func: *Fn) SemaError!Air { }; defer inner_block.instructions.deinit(gpa); - // AIR requires the arg parameters to be the first N instructions. - try inner_block.instructions.ensureTotalCapacity(gpa, param_inst_list.len); - for (param_inst_list) |*param_inst, param_index| { - const param_type = fn_ty.fnParamType(param_index); + const fn_info = sema.code.getFnInfo(func.zir_body_inst); + const zir_tags = sema.code.instructions.items(.tag); + + // Here we are performing "runtime semantic analysis" for a function body, which means + // we must map the parameter ZIR instructions to `arg` AIR instructions. + // AIR requires the `arg` parameters to be the first N instructions. + // This could be a generic function instantiation, however, in which case we need to + // map the comptime parameters to constant values and only emit arg AIR instructions + // for the runtime ones. + const runtime_params_len = @intCast(u32, fn_ty.fnParamLen()); + try inner_block.instructions.ensureTotalCapacity(gpa, runtime_params_len); + try sema.air_instructions.ensureUnusedCapacity(gpa, fn_info.total_params_len * 2); // * 2 for the `addType` + try sema.inst_map.ensureUnusedCapacity(gpa, fn_info.total_params_len); + + var runtime_param_index: usize = 0; + var total_param_index: usize = 0; + for (fn_info.param_body) |inst| { + const name = switch (zir_tags[inst]) { + .param, .param_comptime => blk: { + const inst_data = sema.code.instructions.items(.data)[inst].pl_tok; + const extra = sema.code.extraData(Zir.Inst.Param, inst_data.payload_index).data; + break :blk extra.name; + }, + + .param_anytype, .param_anytype_comptime => blk: { + const str_tok = sema.code.instructions.items(.data)[inst].str_tok; + break :blk str_tok.start; + }, + + else => continue, + }; + if (func.comptime_args) |comptime_args| { + const arg_tv = comptime_args[total_param_index]; + if (arg_tv.val.tag() != .generic_poison) { + // We have a comptime value for this parameter. + const arg = try sema.addConstant(arg_tv.ty, arg_tv.val); + sema.inst_map.putAssumeCapacityNoClobber(inst, arg); + total_param_index += 1; + continue; + } + } + const param_type = fn_ty.fnParamType(runtime_param_index); const ty_ref = try sema.addType(param_type); const arg_index = @intCast(u32, sema.air_instructions.len); inner_block.instructions.appendAssumeCapacity(arg_index); - param_inst.* = Air.indexToRef(arg_index); - try sema.air_instructions.append(gpa, .{ + sema.air_instructions.appendAssumeCapacity(.{ .tag = .arg, - .data = .{ - .ty_str = .{ - .ty = ty_ref, - .str = undefined, // Set in the semantic analysis of the arg instruction. - }, - }, + .data = .{ .ty_str = .{ + .ty = ty_ref, + .str = name, + } }, }); + sema.inst_map.putAssumeCapacityNoClobber(inst, Air.indexToRef(arg_index)); + total_param_index += 1; + runtime_param_index += 1; } func.state = .in_progress; log.debug("set {s} to in_progress", .{decl.name}); - try sema.analyzeFnBody(&inner_block, func.zir_body_inst); + _ = sema.analyzeBody(&inner_block, fn_info.body) catch |err| switch (err) { + error.NeededSourceLocation => @panic("zig compiler bug: NeededSourceLocation"), + error.GenericPoison => @panic("zig compiler bug: GenericPoison"), + else => |e| return e, + }; // Copy the block into place and mark that as the main block. try sema.air_extra.ensureUnusedCapacity(gpa, @typeInfo(Air.Block).Struct.fields.len + @@ -3597,7 +3827,6 @@ pub fn analyzeFnBody(mod: *Module, decl: *Decl, func: *Fn) SemaError!Air { .instructions = sema.air_instructions.toOwnedSlice(), .extra = sema.air_extra.toOwnedSlice(gpa), .values = sema.air_values.toOwnedSlice(gpa), - .variables = sema.air_variables.toOwnedSlice(gpa), }; } @@ -3616,7 +3845,7 @@ fn markOutdatedDecl(mod: *Module, decl: *Decl) !void { decl.analysis = .outdated; } -fn allocateNewDecl(mod: *Module, namespace: *Scope.Namespace, src_node: ast.Node.Index) !*Decl { +pub fn allocateNewDecl(mod: *Module, namespace: *Scope.Namespace, src_node: ast.Node.Index) !*Decl { // If we have emit-h then we must allocate a bigger structure to store the emit-h state. const new_decl: *Decl = if (mod.emit_h != null) blk: { const parent_struct = try mod.gpa.create(DeclPlusEmitH); @@ -3664,6 +3893,7 @@ fn allocateNewDecl(mod: *Module, namespace: *Scope.Namespace, src_node: ast.Node .is_exported = false, .has_linksection = false, .has_align = false, + .alive = false, }; return new_decl; } @@ -3702,8 +3932,8 @@ pub fn analyzeExport( else => return mod.fail(scope, src, "unable to export type '{}'", .{exported_decl.ty}), } - try mod.decl_exports.ensureCapacity(mod.gpa, mod.decl_exports.count() + 1); - try mod.export_owners.ensureCapacity(mod.gpa, mod.export_owners.count() + 1); + try mod.decl_exports.ensureUnusedCapacity(mod.gpa, 1); + try mod.export_owners.ensureUnusedCapacity(mod.gpa, 1); const new_export = try mod.gpa.create(Export); errdefer mod.gpa.destroy(new_export); @@ -3753,29 +3983,44 @@ pub fn analyzeExport( errdefer de_gop.value_ptr.* = mod.gpa.shrink(de_gop.value_ptr.*, de_gop.value_ptr.len - 1); } -pub fn deleteAnonDecl(mod: *Module, scope: *Scope, decl: *Decl) void { - const scope_decl = scope.ownerDecl().?; - assert(scope_decl.namespace.anon_decls.swapRemove(decl)); - decl.destroy(mod); -} - /// Takes ownership of `name` even if it returns an error. pub fn createAnonymousDeclNamed( mod: *Module, scope: *Scope, typed_value: TypedValue, name: [:0]u8, +) !*Decl { + return mod.createAnonymousDeclFromDeclNamed(scope.ownerDecl().?, typed_value, name); +} + +pub fn createAnonymousDecl(mod: *Module, scope: *Scope, typed_value: TypedValue) !*Decl { + return mod.createAnonymousDeclFromDecl(scope.ownerDecl().?, typed_value); +} + +pub fn createAnonymousDeclFromDecl(mod: *Module, owner_decl: *Decl, tv: TypedValue) !*Decl { + const name_index = mod.getNextAnonNameIndex(); + const name = try std.fmt.allocPrintZ(mod.gpa, "{s}__anon_{d}", .{ + owner_decl.name, name_index, + }); + return mod.createAnonymousDeclFromDeclNamed(owner_decl, tv, name); +} + +/// Takes ownership of `name` even if it returns an error. +pub fn createAnonymousDeclFromDeclNamed( + mod: *Module, + owner_decl: *Decl, + typed_value: TypedValue, + name: [:0]u8, ) !*Decl { errdefer mod.gpa.free(name); - const scope_decl = scope.ownerDecl().?; - const namespace = scope_decl.namespace; + const namespace = owner_decl.namespace; try namespace.anon_decls.ensureUnusedCapacity(mod.gpa, 1); - const new_decl = try mod.allocateNewDecl(namespace, scope_decl.src_node); + const new_decl = try mod.allocateNewDecl(namespace, owner_decl.src_node); new_decl.name = name; - new_decl.src_line = scope_decl.src_line; + new_decl.src_line = owner_decl.src_line; new_decl.ty = typed_value.ty; new_decl.val = typed_value.val; new_decl.has_tv = true; @@ -3796,15 +4041,6 @@ pub fn createAnonymousDeclNamed( return new_decl; } -pub fn createAnonymousDecl(mod: *Module, scope: *Scope, typed_value: TypedValue) !*Decl { - const scope_decl = scope.ownerDecl().?; - const name_index = mod.getNextAnonNameIndex(); - const name = try std.fmt.allocPrintZ(mod.gpa, "{s}__anon_{d}", .{ - scope_decl.name, name_index, - }); - return mod.createAnonymousDeclNamed(scope, typed_value, name); -} - pub fn getNextAnonNameIndex(mod: *Module) usize { return @atomicRmw(usize, &mod.next_anon_name_index, .Add, 1, .Monotonic); } @@ -3928,244 +4164,6 @@ pub fn failWithOwnedErrorMsg(mod: *Module, scope: *Scope, err_msg: *ErrorMsg) Co return error.AnalysisFail; } -pub fn intAdd(allocator: *Allocator, lhs: Value, rhs: Value) !Value { - // TODO is this a performance issue? maybe we should try the operation without - // resorting to BigInt first. - var lhs_space: Value.BigIntSpace = undefined; - var rhs_space: Value.BigIntSpace = undefined; - const lhs_bigint = lhs.toBigInt(&lhs_space); - const rhs_bigint = rhs.toBigInt(&rhs_space); - const limbs = try allocator.alloc( - std.math.big.Limb, - std.math.max(lhs_bigint.limbs.len, rhs_bigint.limbs.len) + 1, - ); - var result_bigint = BigIntMutable{ .limbs = limbs, .positive = undefined, .len = undefined }; - result_bigint.add(lhs_bigint, rhs_bigint); - const result_limbs = result_bigint.limbs[0..result_bigint.len]; - - if (result_bigint.positive) { - return Value.Tag.int_big_positive.create(allocator, result_limbs); - } else { - return Value.Tag.int_big_negative.create(allocator, result_limbs); - } -} - -pub fn intSub(allocator: *Allocator, lhs: Value, rhs: Value) !Value { - // TODO is this a performance issue? maybe we should try the operation without - // resorting to BigInt first. - var lhs_space: Value.BigIntSpace = undefined; - var rhs_space: Value.BigIntSpace = undefined; - const lhs_bigint = lhs.toBigInt(&lhs_space); - const rhs_bigint = rhs.toBigInt(&rhs_space); - const limbs = try allocator.alloc( - std.math.big.Limb, - std.math.max(lhs_bigint.limbs.len, rhs_bigint.limbs.len) + 1, - ); - var result_bigint = BigIntMutable{ .limbs = limbs, .positive = undefined, .len = undefined }; - result_bigint.sub(lhs_bigint, rhs_bigint); - const result_limbs = result_bigint.limbs[0..result_bigint.len]; - - if (result_bigint.positive) { - return Value.Tag.int_big_positive.create(allocator, result_limbs); - } else { - return Value.Tag.int_big_negative.create(allocator, result_limbs); - } -} - -pub fn intDiv(allocator: *Allocator, lhs: Value, rhs: Value) !Value { - // TODO is this a performance issue? maybe we should try the operation without - // resorting to BigInt first. - var lhs_space: Value.BigIntSpace = undefined; - var rhs_space: Value.BigIntSpace = undefined; - const lhs_bigint = lhs.toBigInt(&lhs_space); - const rhs_bigint = rhs.toBigInt(&rhs_space); - const limbs_q = try allocator.alloc( - std.math.big.Limb, - lhs_bigint.limbs.len + rhs_bigint.limbs.len + 1, - ); - const limbs_r = try allocator.alloc( - std.math.big.Limb, - lhs_bigint.limbs.len, - ); - const limbs_buffer = try allocator.alloc( - std.math.big.Limb, - std.math.big.int.calcDivLimbsBufferLen(lhs_bigint.limbs.len, rhs_bigint.limbs.len), - ); - var result_q = BigIntMutable{ .limbs = limbs_q, .positive = undefined, .len = undefined }; - var result_r = BigIntMutable{ .limbs = limbs_r, .positive = undefined, .len = undefined }; - result_q.divTrunc(&result_r, lhs_bigint, rhs_bigint, limbs_buffer, null); - const result_limbs = result_q.limbs[0..result_q.len]; - - if (result_q.positive) { - return Value.Tag.int_big_positive.create(allocator, result_limbs); - } else { - return Value.Tag.int_big_negative.create(allocator, result_limbs); - } -} - -pub fn intMul(allocator: *Allocator, lhs: Value, rhs: Value) !Value { - // TODO is this a performance issue? maybe we should try the operation without - // resorting to BigInt first. - var lhs_space: Value.BigIntSpace = undefined; - var rhs_space: Value.BigIntSpace = undefined; - const lhs_bigint = lhs.toBigInt(&lhs_space); - const rhs_bigint = rhs.toBigInt(&rhs_space); - const limbs = try allocator.alloc( - std.math.big.Limb, - lhs_bigint.limbs.len + rhs_bigint.limbs.len + 1, - ); - var result_bigint = BigIntMutable{ .limbs = limbs, .positive = undefined, .len = undefined }; - var limbs_buffer = try allocator.alloc( - std.math.big.Limb, - std.math.big.int.calcMulLimbsBufferLen(lhs_bigint.limbs.len, rhs_bigint.limbs.len, 1), - ); - defer allocator.free(limbs_buffer); - result_bigint.mul(lhs_bigint, rhs_bigint, limbs_buffer, allocator); - const result_limbs = result_bigint.limbs[0..result_bigint.len]; - - if (result_bigint.positive) { - return Value.Tag.int_big_positive.create(allocator, result_limbs); - } else { - return Value.Tag.int_big_negative.create(allocator, result_limbs); - } -} - -pub fn floatAdd( - arena: *Allocator, - float_type: Type, - src: LazySrcLoc, - lhs: Value, - rhs: Value, -) !Value { - _ = src; - switch (float_type.tag()) { - .f16 => { - @panic("TODO add __trunctfhf2 to compiler-rt"); - //const lhs_val = lhs.toFloat(f16); - //const rhs_val = rhs.toFloat(f16); - //return Value.Tag.float_16.create(arena, lhs_val + rhs_val); - }, - .f32 => { - const lhs_val = lhs.toFloat(f32); - const rhs_val = rhs.toFloat(f32); - return Value.Tag.float_32.create(arena, lhs_val + rhs_val); - }, - .f64 => { - const lhs_val = lhs.toFloat(f64); - const rhs_val = rhs.toFloat(f64); - return Value.Tag.float_64.create(arena, lhs_val + rhs_val); - }, - .f128, .comptime_float, .c_longdouble => { - const lhs_val = lhs.toFloat(f128); - const rhs_val = rhs.toFloat(f128); - return Value.Tag.float_128.create(arena, lhs_val + rhs_val); - }, - else => unreachable, - } -} - -pub fn floatSub( - arena: *Allocator, - float_type: Type, - src: LazySrcLoc, - lhs: Value, - rhs: Value, -) !Value { - _ = src; - switch (float_type.tag()) { - .f16 => { - @panic("TODO add __trunctfhf2 to compiler-rt"); - //const lhs_val = lhs.toFloat(f16); - //const rhs_val = rhs.toFloat(f16); - //return Value.Tag.float_16.create(arena, lhs_val - rhs_val); - }, - .f32 => { - const lhs_val = lhs.toFloat(f32); - const rhs_val = rhs.toFloat(f32); - return Value.Tag.float_32.create(arena, lhs_val - rhs_val); - }, - .f64 => { - const lhs_val = lhs.toFloat(f64); - const rhs_val = rhs.toFloat(f64); - return Value.Tag.float_64.create(arena, lhs_val - rhs_val); - }, - .f128, .comptime_float, .c_longdouble => { - const lhs_val = lhs.toFloat(f128); - const rhs_val = rhs.toFloat(f128); - return Value.Tag.float_128.create(arena, lhs_val - rhs_val); - }, - else => unreachable, - } -} - -pub fn floatDiv( - arena: *Allocator, - float_type: Type, - src: LazySrcLoc, - lhs: Value, - rhs: Value, -) !Value { - _ = src; - switch (float_type.tag()) { - .f16 => { - @panic("TODO add __trunctfhf2 to compiler-rt"); - //const lhs_val = lhs.toFloat(f16); - //const rhs_val = rhs.toFloat(f16); - //return Value.Tag.float_16.create(arena, lhs_val / rhs_val); - }, - .f32 => { - const lhs_val = lhs.toFloat(f32); - const rhs_val = rhs.toFloat(f32); - return Value.Tag.float_32.create(arena, lhs_val / rhs_val); - }, - .f64 => { - const lhs_val = lhs.toFloat(f64); - const rhs_val = rhs.toFloat(f64); - return Value.Tag.float_64.create(arena, lhs_val / rhs_val); - }, - .f128, .comptime_float, .c_longdouble => { - const lhs_val = lhs.toFloat(f128); - const rhs_val = rhs.toFloat(f128); - return Value.Tag.float_128.create(arena, lhs_val / rhs_val); - }, - else => unreachable, - } -} - -pub fn floatMul( - arena: *Allocator, - float_type: Type, - src: LazySrcLoc, - lhs: Value, - rhs: Value, -) !Value { - _ = src; - switch (float_type.tag()) { - .f16 => { - @panic("TODO add __trunctfhf2 to compiler-rt"); - //const lhs_val = lhs.toFloat(f16); - //const rhs_val = rhs.toFloat(f16); - //return Value.Tag.float_16.create(arena, lhs_val * rhs_val); - }, - .f32 => { - const lhs_val = lhs.toFloat(f32); - const rhs_val = rhs.toFloat(f32); - return Value.Tag.float_32.create(arena, lhs_val * rhs_val); - }, - .f64 => { - const lhs_val = lhs.toFloat(f64); - const rhs_val = rhs.toFloat(f64); - return Value.Tag.float_64.create(arena, lhs_val * rhs_val); - }, - .f128, .comptime_float, .c_longdouble => { - const lhs_val = lhs.toFloat(f128); - const rhs_val = rhs.toFloat(f128); - return Value.Tag.float_128.create(arena, lhs_val * rhs_val); - }, - else => unreachable, - } -} - pub fn simplePtrType( arena: *Allocator, elem_ty: Type, @@ -4194,7 +4192,6 @@ pub fn simplePtrType( } pub fn ptrType( - mod: *Module, arena: *Allocator, elem_ty: Type, sentinel: ?Value, @@ -4206,7 +4203,6 @@ pub fn ptrType( @"volatile": bool, size: std.builtin.TypeInfo.Pointer.Size, ) Allocator.Error!Type { - _ = mod; assert(host_size == 0 or bit_offset < host_size * 8); // TODO check if type can be represented by simplePtrType @@ -4223,8 +4219,7 @@ pub fn ptrType( }); } -pub fn optionalType(mod: *Module, arena: *Allocator, child_type: Type) Allocator.Error!Type { - _ = mod; +pub fn optionalType(arena: *Allocator, child_type: Type) Allocator.Error!Type { switch (child_type.tag()) { .single_const_pointer => return Type.Tag.optional_single_const_pointer.create( arena, @@ -4239,16 +4234,14 @@ pub fn optionalType(mod: *Module, arena: *Allocator, child_type: Type) Allocator } pub fn arrayType( - mod: *Module, arena: *Allocator, len: u64, sentinel: ?Value, elem_type: Type, ) Allocator.Error!Type { - _ = mod; if (elem_type.eql(Type.initTag(.u8))) { if (sentinel) |some| { - if (some.eql(Value.initTag(.zero))) { + if (some.eql(Value.initTag(.zero), elem_type)) { return Type.Tag.array_u8_sentinel_0.create(arena, len); } } else { @@ -4271,12 +4264,10 @@ pub fn arrayType( } pub fn errorUnionType( - mod: *Module, arena: *Allocator, error_set: Type, payload: Type, ) Allocator.Error!Type { - _ = mod; assert(error_set.zigTypeTag() == .ErrorSet); if (error_set.eql(Type.initTag(.anyerror)) and payload.eql(Type.initTag(.void))) { return Type.initTag(.anyerror_void_error_union); @@ -4470,7 +4461,7 @@ pub fn analyzeStructFields(mod: *Module, struct_obj: *Struct) CompileError!void .namespace = &struct_obj.namespace, .owner_func = null, .func = null, - .param_inst_list = &.{}, + .fn_ret_ty = Type.initTag(.void), }; defer sema.deinit(); @@ -4624,7 +4615,7 @@ pub fn analyzeUnionFields(mod: *Module, union_obj: *Union) CompileError!void { .namespace = &union_obj.namespace, .owner_func = null, .func = null, - .param_inst_list = &.{}, + .fn_ret_ty = Type.initTag(.void), }; defer sema.deinit(); @@ -4801,3 +4792,95 @@ pub fn processExports(mod: *Module) !void { }; } } + +pub fn populateTestFunctions(mod: *Module) !void { + const gpa = mod.gpa; + const builtin_pkg = mod.main_pkg.table.get("builtin").?; + const builtin_file = (mod.importPkg(builtin_pkg) catch unreachable).file; + const builtin_namespace = builtin_file.root_decl.?.namespace; + const decl = builtin_namespace.decls.get("test_functions").?; + var buf: Type.Payload.ElemType = undefined; + const tmp_test_fn_ty = decl.ty.slicePtrFieldType(&buf).elemType(); + + const array_decl = d: { + // Add mod.test_functions to an array decl then make the test_functions + // decl reference it as a slice. + var new_decl_arena = std.heap.ArenaAllocator.init(gpa); + errdefer new_decl_arena.deinit(); + const arena = &new_decl_arena.allocator; + + const test_fn_vals = try arena.alloc(Value, mod.test_functions.count()); + const array_decl = try mod.createAnonymousDeclFromDecl(decl, .{ + .ty = try Type.Tag.array.create(arena, .{ + .len = test_fn_vals.len, + .elem_type = try tmp_test_fn_ty.copy(arena), + }), + .val = try Value.Tag.array.create(arena, test_fn_vals), + }); + for (mod.test_functions.keys()) |test_decl, i| { + const test_name_slice = mem.sliceTo(test_decl.name, 0); + const test_name_decl = n: { + var name_decl_arena = std.heap.ArenaAllocator.init(gpa); + errdefer name_decl_arena.deinit(); + const bytes = try name_decl_arena.allocator.dupe(u8, test_name_slice); + const test_name_decl = try mod.createAnonymousDeclFromDecl(array_decl, .{ + .ty = try Type.Tag.array_u8.create(&name_decl_arena.allocator, bytes.len), + .val = try Value.Tag.bytes.create(&name_decl_arena.allocator, bytes), + }); + try test_name_decl.finalizeNewArena(&name_decl_arena); + break :n test_name_decl; + }; + try mod.linkerUpdateDecl(test_name_decl); + + const field_vals = try arena.create([3]Value); + field_vals.* = .{ + try Value.Tag.slice.create(arena, .{ + .ptr = try Value.Tag.decl_ref.create(arena, test_name_decl), + .len = try Value.Tag.int_u64.create(arena, test_name_slice.len), + }), // name + try Value.Tag.decl_ref.create(arena, test_decl), // func + Value.initTag(.null_value), // async_frame_size + }; + test_fn_vals[i] = try Value.Tag.@"struct".create(arena, field_vals); + } + + try array_decl.finalizeNewArena(&new_decl_arena); + break :d array_decl; + }; + try mod.linkerUpdateDecl(array_decl); + + { + var arena_instance = decl.value_arena.?.promote(gpa); + defer decl.value_arena.?.* = arena_instance.state; + const arena = &arena_instance.allocator; + + decl.ty = try Type.Tag.const_slice.create(arena, try tmp_test_fn_ty.copy(arena)); + decl.val = try Value.Tag.slice.create(arena, .{ + .ptr = try Value.Tag.decl_ref.create(arena, array_decl), + .len = try Value.Tag.int_u64.create(arena, mod.test_functions.count()), + }); + } + try mod.linkerUpdateDecl(decl); +} + +pub fn linkerUpdateDecl(mod: *Module, decl: *Decl) !void { + mod.comp.bin_file.updateDecl(mod, decl) catch |err| switch (err) { + error.OutOfMemory => return error.OutOfMemory, + error.AnalysisFail => { + decl.analysis = .codegen_failure; + return; + }, + else => { + const gpa = mod.gpa; + try mod.failed_decls.ensureUnusedCapacity(gpa, 1); + mod.failed_decls.putAssumeCapacityNoClobber(decl, try ErrorMsg.create( + gpa, + decl.srcLoc(), + "unable to codegen: {s}", + .{@errorName(err)}, + )); + decl.analysis = .codegen_failure_retryable; + return; + }, + }; +} diff --git a/src/RangeSet.zig b/src/RangeSet.zig index fd258d55b0..2a8a55a077 100644 --- a/src/RangeSet.zig +++ b/src/RangeSet.zig @@ -1,5 +1,6 @@ const std = @import("std"); const Order = std.math.Order; +const Type = @import("type.zig").Type; const Value = @import("value.zig").Value; const RangeSet = @This(); const SwitchProngSrc = @import("Module.zig").SwitchProngSrc; @@ -22,9 +23,15 @@ pub fn deinit(self: *RangeSet) void { self.ranges.deinit(); } -pub fn add(self: *RangeSet, first: Value, last: Value, src: SwitchProngSrc) !?SwitchProngSrc { +pub fn add( + self: *RangeSet, + first: Value, + last: Value, + ty: Type, + src: SwitchProngSrc, +) !?SwitchProngSrc { for (self.ranges.items) |range| { - if (last.compare(.gte, range.first) and first.compare(.lte, range.last)) { + if (last.compare(.gte, range.first, ty) and first.compare(.lte, range.last, ty)) { return range.src; // They overlap. } } @@ -37,18 +44,18 @@ pub fn add(self: *RangeSet, first: Value, last: Value, src: SwitchProngSrc) !?Sw } /// Assumes a and b do not overlap -fn lessThan(_: void, a: Range, b: Range) bool { - return a.first.compare(.lt, b.first); +fn lessThan(ty: Type, a: Range, b: Range) bool { + return a.first.compare(.lt, b.first, ty); } -pub fn spans(self: *RangeSet, first: Value, last: Value) !bool { +pub fn spans(self: *RangeSet, first: Value, last: Value, ty: Type) !bool { if (self.ranges.items.len == 0) return false; - std.sort.sort(Range, self.ranges.items, {}, lessThan); + std.sort.sort(Range, self.ranges.items, ty, lessThan); - if (!self.ranges.items[0].first.eql(first) or - !self.ranges.items[self.ranges.items.len - 1].last.eql(last)) + if (!self.ranges.items[0].first.eql(first, ty) or + !self.ranges.items[self.ranges.items.len - 1].last.eql(last, ty)) { return false; } diff --git a/src/Sema.zig b/src/Sema.zig index 3df512596f..96a09553f5 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -14,7 +14,6 @@ code: Zir, air_instructions: std.MultiArrayList(Air.Inst) = .{}, air_extra: std.ArrayListUnmanaged(u32) = .{}, air_values: std.ArrayListUnmanaged(Value) = .{}, -air_variables: std.ArrayListUnmanaged(*Module.Var) = .{}, /// Maps ZIR to AIR. inst_map: InstMap = .{}, /// When analyzing an inline function call, owner_decl is the Decl of the caller @@ -30,13 +29,12 @@ owner_func: ?*Module.Fn, /// This starts out the same as `owner_func` and then diverges in the case of /// an inline or comptime function call. func: ?*Module.Fn, -/// For now, AIR requires arg instructions to be the first N instructions in the -/// AIR code. We store references here for the purpose of `resolveInst`. -/// This can get reworked with AIR memory layout changes, into simply: -/// > Denormalized data to make `resolveInst` faster. This is 0 if not inside a function, -/// > otherwise it is the number of parameters of the function. -/// > param_count: u32 -param_inst_list: []const Air.Inst.Ref, +/// When semantic analysis needs to know the return type of the function whose body +/// is being analyzed, this `Type` should be used instead of going through `func`. +/// This will correctly handle the case of a comptime/inline function call of a +/// generic function which uses a type expression for the return type. +/// The type will be `void` in the case that `func` is `null`. +fn_ret_ty: Type, branch_quota: u32 = 1000, branch_count: u32 = 0, /// This field is updated when a new source location becomes active, so that @@ -44,8 +42,22 @@ branch_count: u32 = 0, /// access to the source location set by the previous instruction which did /// contain a mapped source location. src: LazySrcLoc = .{ .token_offset = 0 }, -next_arg_index: usize = 0, decl_val_table: std.AutoHashMapUnmanaged(*Decl, Air.Inst.Ref) = .{}, +/// When doing a generic function instantiation, this array collects a +/// `Value` object for each parameter that is comptime known and thus elided +/// from the generated function. This memory is allocated by a parent `Sema` and +/// owned by the values arena of the Sema owner_decl. +comptime_args: []TypedValue = &.{}, +/// Marks the function instruction that `comptime_args` applies to so that we +/// don't accidentally apply it to a function prototype which is used in the +/// type expression of a generic function parameter. +comptime_args_fn_inst: Zir.Inst.Index = 0, +/// When `comptime_args` is provided, this field is also provided. It was used as +/// the key in the `monomorphed_funcs` set. The `func` instruction is supposed +/// to use this instead of allocating a fresh one. This avoids an unnecessary +/// extra hash table lookup in the `monomorphed_funcs` set. +/// Sema will set this to null when it takes ownership. +preallocated_new_func: ?*Module.Fn = null, const std = @import("std"); const mem = std.mem; @@ -76,48 +88,11 @@ pub fn deinit(sema: *Sema) void { sema.air_instructions.deinit(gpa); sema.air_extra.deinit(gpa); sema.air_values.deinit(gpa); - sema.air_variables.deinit(gpa); sema.inst_map.deinit(gpa); sema.decl_val_table.deinit(gpa); sema.* = undefined; } -pub fn analyzeFnBody( - sema: *Sema, - block: *Scope.Block, - fn_body_inst: Zir.Inst.Index, -) SemaError!void { - const tags = sema.code.instructions.items(.tag); - const datas = sema.code.instructions.items(.data); - const body: []const Zir.Inst.Index = switch (tags[fn_body_inst]) { - .func, .func_inferred => blk: { - const inst_data = datas[fn_body_inst].pl_node; - const extra = sema.code.extraData(Zir.Inst.Func, inst_data.payload_index); - const param_types_len = extra.data.param_types_len; - const body = sema.code.extra[extra.end + param_types_len ..][0..extra.data.body_len]; - break :blk body; - }, - .extended => blk: { - const extended = datas[fn_body_inst].extended; - assert(extended.opcode == .func); - const extra = sema.code.extraData(Zir.Inst.ExtendedFunc, extended.operand); - const small = @bitCast(Zir.Inst.ExtendedFunc.Small, extended.small); - var extra_index: usize = extra.end; - extra_index += @boolToInt(small.has_lib_name); - extra_index += @boolToInt(small.has_cc); - extra_index += @boolToInt(small.has_align); - extra_index += extra.data.param_types_len; - const body = sema.code.extra[extra_index..][0..extra.data.body_len]; - break :blk body; - }, - else => unreachable, - }; - _ = sema.analyzeBody(block, body) catch |err| switch (err) { - error.NeededSourceLocation => unreachable, - else => |e| return e, - }; -} - /// Returns only the result from the body that is specified. /// Only appropriate to call when it is determined at comptime that this body /// has no peers. @@ -156,19 +131,15 @@ pub fn analyzeBody( // We use a while(true) loop here to avoid a redundant way of breaking out of // the loop. The only way to break out of the loop is with a `noreturn` // instruction. - // TODO: As an optimization, make sure the codegen for these switch prongs - // directly jump to the next one, rather than detouring through the loop - // continue expression. Related: https://github.com/ziglang/zig/issues/8220 var i: usize = 0; while (true) { const inst = body[i]; const air_inst: Air.Inst.Ref = switch (tags[inst]) { // zig fmt: off - .arg => try sema.zirArg(block, inst), .alloc => try sema.zirAlloc(block, inst), .alloc_inferred => try sema.zirAllocInferred(block, inst, Type.initTag(.inferred_alloc_const)), .alloc_inferred_mut => try sema.zirAllocInferred(block, inst, Type.initTag(.inferred_alloc_mut)), - .alloc_inferred_comptime => try sema.zirAllocInferredComptime(block, inst), + .alloc_inferred_comptime => try sema.zirAllocInferredComptime(inst), .alloc_mut => try sema.zirAllocMut(block, inst), .alloc_comptime => try sema.zirAllocComptime(block, inst), .anyframe_type => try sema.zirAnyframeType(block, inst), @@ -195,12 +166,12 @@ pub fn analyzeBody( .call_compile_time => try sema.zirCall(block, inst, .compile_time, false), .call_nosuspend => try sema.zirCall(block, inst, .no_async, false), .call_async => try sema.zirCall(block, inst, .async_kw, false), - .cmp_eq => try sema.zirCmp(block, inst, .eq), - .cmp_gt => try sema.zirCmp(block, inst, .gt), - .cmp_gte => try sema.zirCmp(block, inst, .gte), .cmp_lt => try sema.zirCmp(block, inst, .lt), .cmp_lte => try sema.zirCmp(block, inst, .lte), - .cmp_neq => try sema.zirCmp(block, inst, .neq), + .cmp_eq => try sema.zirCmpEq(block, inst, .eq, .cmp_eq), + .cmp_gte => try sema.zirCmp(block, inst, .gte), + .cmp_gt => try sema.zirCmp(block, inst, .gt), + .cmp_neq => try sema.zirCmpEq(block, inst, .neq, .cmp_neq), .coerce_result_ptr => try sema.zirCoerceResultPtr(block, inst), .decl_ref => try sema.zirDeclRef(block, inst), .decl_val => try sema.zirDeclVal(block, inst), @@ -338,6 +309,7 @@ pub fn analyzeBody( .splat => try sema.zirSplat(block, inst), .reduce => try sema.zirReduce(block, inst), .shuffle => try sema.zirShuffle(block, inst), + .select => try sema.zirSelect(block, inst), .atomic_load => try sema.zirAtomicLoad(block, inst), .atomic_rmw => try sema.zirAtomicRmw(block, inst), .atomic_store => try sema.zirAtomicStore(block, inst), @@ -345,8 +317,10 @@ pub fn analyzeBody( .builtin_call => try sema.zirBuiltinCall(block, inst), .field_ptr_type => try sema.zirFieldPtrType(block, inst), .field_parent_ptr => try sema.zirFieldParentPtr(block, inst), + .maximum => try sema.zirMaximum(block, inst), .memcpy => try sema.zirMemcpy(block, inst), .memset => try sema.zirMemset(block, inst), + .minimum => try sema.zirMinimum(block, inst), .builtin_async_call => try sema.zirBuiltinAsyncCall(block, inst), .@"resume" => try sema.zirResume(block, inst), .@"await" => try sema.zirAwait(block, inst, false), @@ -390,8 +364,9 @@ pub fn analyzeBody( .condbr => return sema.zirCondbr(block, inst), .@"break" => return sema.zirBreak(block, inst), .compile_error => return sema.zirCompileError(block, inst), - .ret_coerce => return sema.zirRetCoerce(block, inst, true), + .ret_coerce => return sema.zirRetCoerce(block, inst), .ret_node => return sema.zirRetNode(block, inst), + .ret_load => return sema.zirRetLoad(block, inst), .ret_err_value => return sema.zirRetErrValue(block, inst), .@"unreachable" => return sema.zirUnreachable(block, inst), .repeat => return sema.zirRepeat(block, inst), @@ -498,6 +473,26 @@ pub fn analyzeBody( i += 1; continue; }, + .param => { + try sema.zirParam(block, inst, false); + i += 1; + continue; + }, + .param_comptime => { + try sema.zirParam(block, inst, true); + i += 1; + continue; + }, + .param_anytype => { + try sema.zirParamAnytype(block, inst, false); + i += 1; + continue; + }, + .param_anytype_comptime => { + try sema.zirParamAnytype(block, inst, true); + i += 1; + continue; + }, // Special case instructions to handle comptime control flow. .repeat_inline => { @@ -633,26 +628,55 @@ fn analyzeAsType( const wanted_type = Type.initTag(.@"type"); const coerced_inst = try sema.coerce(block, wanted_type, air_inst, src); const val = try sema.resolveConstValue(block, src, coerced_inst); - return val.toType(sema.arena); + var buffer: Value.ToTypeBuffer = undefined; + const ty = val.toType(&buffer); + return ty.copy(sema.arena); } +/// May return Value Tags: `variable`, `undef`. +/// See `resolveConstValue` for an alternative. +/// Value Tag `generic_poison` causes `error.GenericPoison` to be returned. +fn resolveValue( + sema: *Sema, + block: *Scope.Block, + src: LazySrcLoc, + air_ref: Air.Inst.Ref, +) CompileError!Value { + if (try sema.resolveMaybeUndefValAllowVariables(block, src, air_ref)) |val| { + if (val.tag() == .generic_poison) return error.GenericPoison; + return val; + } + return sema.failWithNeededComptime(block, src); +} + +/// Will not return Value Tags: `variable`, `undef`. Instead they will emit compile errors. +/// See `resolveValue` for an alternative. fn resolveConstValue( sema: *Sema, block: *Scope.Block, src: LazySrcLoc, air_ref: Air.Inst.Ref, ) CompileError!Value { - return (try sema.resolveDefinedValue(block, src, air_ref)) orelse - return sema.failWithNeededComptime(block, src); + if (try sema.resolveMaybeUndefValAllowVariables(block, src, air_ref)) |val| { + switch (val.tag()) { + .undef => return sema.failWithUseOfUndef(block, src), + .variable => return sema.failWithNeededComptime(block, src), + .generic_poison => return error.GenericPoison, + else => return val, + } + } + return sema.failWithNeededComptime(block, src); } +/// Value Tag `variable` causes this function to return `null`. +/// Value Tag `undef` causes this function to return a compile error. fn resolveDefinedValue( sema: *Sema, block: *Scope.Block, src: LazySrcLoc, air_ref: Air.Inst.Ref, ) CompileError!?Value { - if (try sema.resolvePossiblyUndefinedValue(block, src, air_ref)) |val| { + if (try sema.resolveMaybeUndefVal(block, src, air_ref)) |val| { if (val.isUndef()) { return sema.failWithUseOfUndef(block, src); } @@ -661,7 +685,25 @@ fn resolveDefinedValue( return null; } -fn resolvePossiblyUndefinedValue( +/// Value Tag `variable` causes this function to return `null`. +/// Value Tag `undef` causes this function to return the Value. +/// Value Tag `generic_poison` causes `error.GenericPoison` to be returned. +fn resolveMaybeUndefVal( + sema: *Sema, + block: *Scope.Block, + src: LazySrcLoc, + inst: Air.Inst.Ref, +) CompileError!?Value { + const val = (try sema.resolveMaybeUndefValAllowVariables(block, src, inst)) orelse return null; + switch (val.tag()) { + .variable => return null, + .generic_poison => return error.GenericPoison, + else => return val, + } +} + +/// Returns all Value tags including `variable` and `undef`. +fn resolveMaybeUndefValAllowVariables( sema: *Sema, block: *Scope.Block, src: LazySrcLoc, @@ -677,8 +719,8 @@ fn resolvePossiblyUndefinedValue( if (try sema.typeHasOnePossibleValue(block, src, sema.typeOf(inst))) |opv| { return opv; } - - switch (sema.air_instructions.items(.tag)[i]) { + const air_tags = sema.air_instructions.items(.tag); + switch (air_tags[i]) { .constant => { const ty_pl = sema.air_instructions.items(.data)[i].ty_pl; return sema.air_values.items[ty_pl.payload]; @@ -731,6 +773,8 @@ fn resolveInt( return val.toUnsignedInt(); } +// Returns a compile error if the value has tag `variable`. See `resolveInstValue` for +// a function that does not. pub fn resolveInstConst( sema: *Sema, block: *Scope.Block, @@ -745,6 +789,22 @@ pub fn resolveInstConst( }; } +// Value Tag may be `undef` or `variable`. +// See `resolveInstConst` for an alternative. +pub fn resolveInstValue( + sema: *Sema, + block: *Scope.Block, + src: LazySrcLoc, + zir_ref: Zir.Inst.Ref, +) CompileError!TypedValue { + const air_ref = sema.resolveInst(zir_ref); + const val = try sema.resolveValue(block, src, air_ref); + return TypedValue{ + .ty = sema.typeOf(air_ref), + .val = val, + }; +} + fn zirBitcastResultPtr(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { const inst_data = sema.code.instructions.items(.data)[inst].pl_node; const src = inst_data.src(); @@ -963,7 +1023,9 @@ fn zirEnumDecl( if (bag != 0) break true; } else false; if (any_values) { - try enum_obj.values.ensureCapacity(&new_decl_arena.allocator, fields_len); + try enum_obj.values.ensureTotalCapacityContext(&new_decl_arena.allocator, fields_len, .{ + .ty = tag_ty, + }); } { @@ -981,7 +1043,7 @@ fn zirEnumDecl( .namespace = &enum_obj.namespace, .owner_func = null, .func = null, - .param_inst_list = &.{}, + .fn_ret_ty = Type.initTag(.void), .branch_quota = sema.branch_quota, .branch_count = sema.branch_count, }; @@ -1041,10 +1103,10 @@ fn zirEnumDecl( // that points to this default value expression rather than the struct. // But only resolve the source location if we need to emit a compile error. const tag_val = (try sema.resolveInstConst(block, src, tag_val_ref)).val; - enum_obj.values.putAssumeCapacityNoClobber(tag_val, {}); + enum_obj.values.putAssumeCapacityNoClobberContext(tag_val, {}, .{ .ty = tag_ty }); } else if (any_values) { const tag_val = try Value.Tag.int_u64.create(&new_decl_arena.allocator, field_i); - enum_obj.values.putAssumeCapacityNoClobber(tag_val, {}); + enum_obj.values.putAssumeCapacityNoClobberContext(tag_val, {}, .{ .ty = tag_ty }); } } @@ -1187,9 +1249,12 @@ fn zirRetPtr( const src: LazySrcLoc = .{ .node_offset = @bitCast(i32, extended.operand) }; try sema.requireFunctionBlock(block, src); - const fn_ty = sema.func.?.owner_decl.ty; - const ret_type = fn_ty.fnReturnType(); - const ptr_type = try Module.simplePtrType(sema.arena, ret_type, true, .One); + + if (block.is_comptime) { + return sema.analyzeComptimeAlloc(block, sema.fn_ret_ty); + } + + const ptr_type = try Module.simplePtrType(sema.arena, sema.fn_ret_ty, true, .One); return block.addTy(.alloc, ptr_type); } @@ -1212,9 +1277,7 @@ fn zirRetType( const src: LazySrcLoc = .{ .node_offset = @bitCast(i32, extended.operand) }; try sema.requireFunctionBlock(block, src); - const fn_ty = sema.func.?.owner_decl.ty; - const ret_type = fn_ty.fnReturnType(); - return sema.addType(ret_type); + return sema.addType(sema.fn_ret_ty); } fn zirEnsureResultUsed(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!void { @@ -1261,57 +1324,44 @@ fn zirIndexablePtrLen(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) Co const inst_data = sema.code.instructions.items(.data)[inst].un_node; const src = inst_data.src(); - const array_ptr = sema.resolveInst(inst_data.operand); - const array_ptr_src = src; + const array = sema.resolveInst(inst_data.operand); + const array_ty = sema.typeOf(array); - const elem_ty = sema.typeOf(array_ptr).elemType(); - if (elem_ty.isSlice()) { - const slice_inst = try sema.analyzeLoad(block, src, array_ptr, array_ptr_src); - return sema.analyzeSliceLen(block, src, slice_inst); - } - if (!elem_ty.isIndexable()) { - const cond_src: LazySrcLoc = .{ .node_offset_for_cond = inst_data.src_node }; - const msg = msg: { - const msg = try sema.mod.errMsg( - &block.base, - cond_src, - "type '{}' does not support indexing", - .{elem_ty}, - ); - errdefer msg.destroy(sema.gpa); - try sema.mod.errNote( - &block.base, - cond_src, - msg, - "for loop operand must be an array, slice, tuple, or vector", - .{}, - ); - break :msg msg; - }; - return sema.mod.failWithOwnedErrorMsg(&block.base, msg); - } - const result_ptr = try sema.namedFieldPtr(block, src, array_ptr, "len", src); - const result_ptr_src = array_ptr_src; - return sema.analyzeLoad(block, src, result_ptr, result_ptr_src); -} - -fn zirArg(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { - const inst_data = sema.code.instructions.items(.data)[inst].str_tok; - const arg_name = inst_data.get(sema.code); - const arg_index = sema.next_arg_index; - sema.next_arg_index += 1; - - // TODO check if arg_name shadows a Decl - _ = arg_name; - - if (block.inlining) |_| { - return sema.param_inst_list[arg_index]; + if (array_ty.isSlice()) { + return sema.analyzeSliceLen(block, src, array); } - // Set the name of the Air.Arg instruction for use by codegen debug info. - const air_arg = sema.param_inst_list[arg_index]; - sema.air_instructions.items(.data)[Air.refToIndex(air_arg).?].ty_str.str = inst_data.start; - return air_arg; + if (array_ty.isSinglePointer()) { + const elem_ty = array_ty.elemType(); + if (elem_ty.isSlice()) { + const slice_inst = try sema.analyzeLoad(block, src, array, src); + return sema.analyzeSliceLen(block, src, slice_inst); + } + if (!elem_ty.isIndexable()) { + const msg = msg: { + const msg = try sema.mod.errMsg( + &block.base, + src, + "type '{}' does not support indexing", + .{elem_ty}, + ); + errdefer msg.destroy(sema.gpa); + try sema.mod.errNote( + &block.base, + src, + msg, + "for loop operand must be an array, slice, tuple, or vector", + .{}, + ); + break :msg msg; + }; + return sema.mod.failWithOwnedErrorMsg(&block.base, msg); + } + const result_ptr = try sema.fieldPtr(block, src, array, "len", src); + return sema.analyzeLoad(block, src, result_ptr, src); + } + + return sema.mod.fail(&block.base, src, "TODO implement Sema.zirIndexablePtrLen", .{}); } fn zirAllocExtended( @@ -1331,22 +1381,17 @@ fn zirAllocComptime(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) Comp const inst_data = sema.code.instructions.items(.data)[inst].un_node; const ty_src: LazySrcLoc = .{ .node_offset_var_decl_ty = inst_data.src_node }; const var_type = try sema.resolveType(block, ty_src, inst_data.operand); - const ptr_type = try Module.simplePtrType(sema.arena, var_type, true, .One); - - const val_payload = try sema.arena.create(Value.Payload.ComptimeAlloc); - val_payload.* = .{ - .data = .{ - .runtime_index = block.runtime_index, - .val = undefined, // astgen guarantees there will be a store before the first load - }, - }; - return sema.addConstant(ptr_type, Value.initPayload(&val_payload.base)); + return sema.analyzeComptimeAlloc(block, var_type); } -fn zirAllocInferredComptime(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { +fn zirAllocInferredComptime(sema: *Sema, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { const src_node = sema.code.instructions.items(.data)[inst].node; const src: LazySrcLoc = .{ .node_offset = src_node }; - return sema.mod.fail(&block.base, src, "TODO implement Sema.zirAllocInferredComptime", .{}); + sema.src = src; + return sema.addConstant( + Type.initTag(.inferred_alloc_mut), + try Value.Tag.inferred_alloc_comptime.create(sema.arena, undefined), + ); } fn zirAlloc(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { @@ -1370,6 +1415,9 @@ fn zirAllocMut(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileEr const var_decl_src = inst_data.src(); const ty_src: LazySrcLoc = .{ .node_offset_var_decl_ty = inst_data.src_node }; const var_type = try sema.resolveType(block, ty_src, inst_data.operand); + if (block.is_comptime) { + return sema.analyzeComptimeAlloc(block, var_type); + } try sema.validateVarType(block, ty_src, var_type); const ptr_type = try Module.simplePtrType(sema.arena, var_type, true, .One); try sema.requireRuntimeBlock(block, var_decl_src); @@ -1387,16 +1435,23 @@ fn zirAllocInferred( const src_node = sema.code.instructions.items(.data)[inst].node; const src: LazySrcLoc = .{ .node_offset = src_node }; + sema.src = src; - const val_payload = try sema.arena.create(Value.Payload.InferredAlloc); - val_payload.* = .{ - .data = .{}, - }; - // `Module.constInst` does not add the instruction to the block because it is + if (block.is_comptime) { + return sema.addConstant( + inferred_alloc_ty, + try Value.Tag.inferred_alloc_comptime.create(sema.arena, undefined), + ); + } + + // `Sema.addConstant` does not add the instruction to the block because it is // not needed in the case of constant values. However here, we plan to "downgrade" // to a normal instruction when we hit `resolve_inferred_alloc`. So we append // to the block even though it is currently a `.constant`. - const result = try sema.addConstant(inferred_alloc_ty, Value.initPayload(&val_payload.base)); + const result = try sema.addConstant( + inferred_alloc_ty, + try Value.Tag.inferred_alloc.create(sema.arena, .{}), + ); try sema.requireFunctionBlock(block, src); try block.instructions.append(sema.gpa, Air.refToIndex(result).?); return result; @@ -1412,25 +1467,47 @@ fn zirResolveInferredAlloc(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Inde const ptr_inst = Air.refToIndex(ptr).?; assert(sema.air_instructions.items(.tag)[ptr_inst] == .constant); const air_datas = sema.air_instructions.items(.data); - const ptr_val = sema.air_values.items[air_datas[ptr_inst].ty_pl.payload]; - const inferred_alloc = ptr_val.castTag(.inferred_alloc).?; - const peer_inst_list = inferred_alloc.data.stored_inst_list.items; - const final_elem_ty = try sema.resolvePeerTypes(block, ty_src, peer_inst_list); + const value_index = air_datas[ptr_inst].ty_pl.payload; + const ptr_val = sema.air_values.items[value_index]; const var_is_mut = switch (sema.typeOf(ptr).tag()) { .inferred_alloc_const => false, .inferred_alloc_mut => true, else => unreachable, }; - if (var_is_mut) { - try sema.validateVarType(block, ty_src, final_elem_ty); - } - const final_ptr_ty = try Module.simplePtrType(sema.arena, final_elem_ty, true, .One); - // Change it to a normal alloc. - sema.air_instructions.set(ptr_inst, .{ - .tag = .alloc, - .data = .{ .ty = final_ptr_ty }, - }); + if (ptr_val.castTag(.inferred_alloc_comptime)) |iac| { + const decl = iac.data; + try sema.mod.declareDeclDependency(sema.owner_decl, decl); + + const final_elem_ty = try decl.ty.copy(sema.arena); + const final_ptr_ty = try Module.simplePtrType(sema.arena, final_elem_ty, true, .One); + air_datas[ptr_inst].ty_pl.ty = try sema.addType(final_ptr_ty); + + if (var_is_mut) { + sema.air_values.items[value_index] = try Value.Tag.decl_ref_mut.create(sema.arena, .{ + .decl = decl, + .runtime_index = block.runtime_index, + }); + } else { + sema.air_values.items[value_index] = try Value.Tag.decl_ref.create(sema.arena, decl); + } + return; + } + + if (ptr_val.castTag(.inferred_alloc)) |inferred_alloc| { + const peer_inst_list = inferred_alloc.data.stored_inst_list.items; + const final_elem_ty = try sema.resolvePeerTypes(block, ty_src, peer_inst_list); + if (var_is_mut) { + try sema.validateVarType(block, ty_src, final_elem_ty); + } + // Change it to a normal alloc. + const final_ptr_ty = try Module.simplePtrType(sema.arena, final_elem_ty, true, .One); + sema.air_instructions.set(ptr_inst, .{ + .tag = .alloc, + .data = .{ .ty = final_ptr_ty }, + }); + return; + } } fn zirValidateStructInitPtr(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!void { @@ -1591,23 +1668,45 @@ fn zirStoreToInferredPtr(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) const tracy = trace(@src()); defer tracy.end(); - const src: LazySrcLoc = .unneeded; + const src: LazySrcLoc = sema.src; const bin_inst = sema.code.instructions.items(.data)[inst].bin; const ptr = sema.resolveInst(bin_inst.lhs); - const value = sema.resolveInst(bin_inst.rhs); + const operand = sema.resolveInst(bin_inst.rhs); + const operand_ty = sema.typeOf(operand); const ptr_inst = Air.refToIndex(ptr).?; assert(sema.air_instructions.items(.tag)[ptr_inst] == .constant); const air_datas = sema.air_instructions.items(.data); const ptr_val = sema.air_values.items[air_datas[ptr_inst].ty_pl.payload]; - const inferred_alloc = ptr_val.castTag(.inferred_alloc).?; - // Add the stored instruction to the set we will use to resolve peer types - // for the inferred allocation. - try inferred_alloc.data.stored_inst_list.append(sema.arena, value); - // Create a runtime bitcast instruction with exactly the type the pointer wants. - const ptr_ty = try Module.simplePtrType(sema.arena, sema.typeOf(value), true, .One); - try sema.requireRuntimeBlock(block, src); - const bitcasted_ptr = try block.addTyOp(.bitcast, ptr_ty, ptr); - return sema.storePtr(block, src, bitcasted_ptr, value); + + if (ptr_val.castTag(.inferred_alloc_comptime)) |iac| { + // There will be only one store_to_inferred_ptr because we are running at comptime. + // The alloc will turn into a Decl. + if (try sema.resolveMaybeUndefValAllowVariables(block, src, operand)) |operand_val| { + if (operand_val.tag() == .variable) { + return sema.failWithNeededComptime(block, src); + } + var anon_decl = try block.startAnonDecl(); + defer anon_decl.deinit(); + iac.data = try anon_decl.finish( + try operand_ty.copy(anon_decl.arena()), + try operand_val.copy(anon_decl.arena()), + ); + return; + } else { + return sema.failWithNeededComptime(block, src); + } + } + + if (ptr_val.castTag(.inferred_alloc)) |inferred_alloc| { + // Add the stored instruction to the set we will use to resolve peer types + // for the inferred allocation. + try inferred_alloc.data.stored_inst_list.append(sema.arena, operand); + // Create a runtime bitcast instruction with exactly the type the pointer wants. + const ptr_ty = try Module.simplePtrType(sema.arena, operand_ty, true, .One); + const bitcasted_ptr = try block.addTyOp(.bitcast, ptr_ty, ptr); + return sema.storePtr(block, src, bitcasted_ptr, operand); + } + unreachable; } fn zirSetEvalBranchQuota(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!void { @@ -1704,7 +1803,7 @@ fn zirStr(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!A }); errdefer sema.mod.deleteAnonDecl(&block.base, new_decl); try new_decl.finalizeNewArena(&new_decl_arena); - return sema.analyzeDeclRef(block, .unneeded, new_decl); + return sema.analyzeDeclRef(new_decl); } fn zirInt(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { @@ -1786,7 +1885,7 @@ fn zirCompileLog( const arg = sema.resolveInst(arg_ref); const arg_ty = sema.typeOf(arg); - if (try sema.resolvePossiblyUndefinedValue(block, src, arg)) |val| { + if (try sema.resolveMaybeUndefVal(block, src, arg)) |val| { try writer.print("@as({}, {})", .{ arg_ty, val }); } else { try writer.print("@as({}, [runtime value])", .{arg_ty}); @@ -2087,10 +2186,7 @@ fn zirExport(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileErro const linkage_index = struct_obj.fields.getIndex("linkage").?; const section_index = struct_obj.fields.getIndex("section").?; const export_name = try fields[name_index].toAllocatedBytes(sema.arena); - const linkage = fields[linkage_index].toEnum( - struct_obj.fields.values()[linkage_index].ty, - std.builtin.GlobalLinkage, - ); + const linkage = fields[linkage_index].toEnum(std.builtin.GlobalLinkage); if (linkage != .Strong) { return sema.mod.fail(&block.base, src, "TODO: implement exporting with non-strong linkage", .{}); @@ -2191,7 +2287,7 @@ fn zirDeclRef(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileErr const src = inst_data.src(); const decl_name = inst_data.get(sema.code); const decl = try sema.lookupIdentifier(block, src, decl_name); - return sema.analyzeDeclRef(block, src, decl); + return sema.analyzeDeclRef(decl); } fn zirDeclVal(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { @@ -2269,6 +2365,66 @@ fn zirCall( return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args); } +const GenericCallAdapter = struct { + generic_fn: *Module.Fn, + precomputed_hash: u64, + func_ty_info: Type.Payload.Function.Data, + comptime_tvs: []const TypedValue, + + pub fn eql(ctx: @This(), adapted_key: void, other_key: *Module.Fn) bool { + _ = adapted_key; + // The generic function Decl is guaranteed to be the first dependency + // of each of its instantiations. + const generic_owner_decl = other_key.owner_decl.dependencies.keys()[0]; + if (ctx.generic_fn.owner_decl != generic_owner_decl) return false; + + const other_comptime_args = other_key.comptime_args.?; + for (other_comptime_args[0..ctx.func_ty_info.param_types.len]) |other_arg, i| { + if (other_arg.ty.tag() != .generic_poison) { + // anytype parameter + if (!other_arg.ty.eql(ctx.comptime_tvs[i].ty)) { + return false; + } + } + if (other_arg.val.tag() != .generic_poison) { + // comptime parameter + if (ctx.comptime_tvs[i].val.tag() == .generic_poison) { + // No match because the instantiation has a comptime parameter + // but the callsite does not. + return false; + } + if (!other_arg.val.eql(ctx.comptime_tvs[i].val, other_arg.ty)) { + return false; + } + } + } + return true; + } + + /// The implementation of the hash is in semantic analysis of function calls, so + /// that any errors when computing the hash can be properly reported. + pub fn hash(ctx: @This(), adapted_key: void) u64 { + _ = adapted_key; + return ctx.precomputed_hash; + } +}; + +const GenericRemoveAdapter = struct { + precomputed_hash: u64, + + pub fn eql(ctx: @This(), adapted_key: *Module.Fn, other_key: *Module.Fn) bool { + _ = ctx; + return adapted_key == other_key; + } + + /// The implementation of the hash is in semantic analysis of function calls, so + /// that any errors when computing the hash can be properly reported. + pub fn hash(ctx: @This(), adapted_key: *Module.Fn) u64 { + _ = adapted_key; + return ctx.precomputed_hash; + } +}; + fn analyzeCall( sema: *Sema, block: *Scope.Block, @@ -2277,41 +2433,44 @@ fn analyzeCall( call_src: LazySrcLoc, modifier: std.builtin.CallOptions.Modifier, ensure_result_used: bool, - args: []const Air.Inst.Ref, + uncasted_args: []const Air.Inst.Ref, ) CompileError!Air.Inst.Ref { + const mod = sema.mod; + const func_ty = sema.typeOf(func); if (func_ty.zigTypeTag() != .Fn) - return sema.mod.fail(&block.base, func_src, "type '{}' not a function", .{func_ty}); + return mod.fail(&block.base, func_src, "type '{}' not a function", .{func_ty}); - const cc = func_ty.fnCallingConvention(); + const func_ty_info = func_ty.fnInfo(); + const cc = func_ty_info.cc; if (cc == .Naked) { // TODO add error note: declared here - return sema.mod.fail( + return mod.fail( &block.base, func_src, "unable to call function with naked calling convention", .{}, ); } - const fn_params_len = func_ty.fnParamLen(); - if (func_ty.fnIsVarArgs()) { + const fn_params_len = func_ty_info.param_types.len; + if (func_ty_info.is_var_args) { assert(cc == .C); - if (args.len < fn_params_len) { + if (uncasted_args.len < fn_params_len) { // TODO add error note: declared here - return sema.mod.fail( + return mod.fail( &block.base, func_src, "expected at least {d} argument(s), found {d}", - .{ fn_params_len, args.len }, + .{ fn_params_len, uncasted_args.len }, ); } - } else if (fn_params_len != args.len) { + } else if (fn_params_len != uncasted_args.len) { // TODO add error note: declared here - return sema.mod.fail( + return mod.fail( &block.base, func_src, "expected {d} argument(s), found {d}", - .{ fn_params_len, args.len }, + .{ fn_params_len, uncasted_args.len }, ); } @@ -2326,21 +2485,22 @@ fn analyzeCall( .never_inline, .no_async, .always_tail, - => return sema.mod.fail(&block.base, call_src, "TODO implement call with modifier {}", .{ + => return mod.fail(&block.base, call_src, "TODO implement call with modifier {}", .{ modifier, }), } const gpa = sema.gpa; - const is_comptime_call = block.is_comptime or modifier == .compile_time; + const is_comptime_call = block.is_comptime or modifier == .compile_time or + func_ty_info.return_type.requiresComptime(); const is_inline_call = is_comptime_call or modifier == .always_inline or - func_ty.fnCallingConvention() == .Inline; + func_ty_info.cc == .Inline; const result: Air.Inst.Ref = if (is_inline_call) res: { const func_val = try sema.resolveConstValue(block, func_src, func); const module_fn = switch (func_val.tag()) { .function => func_val.castTag(.function).?.data, - .extern_fn => return sema.mod.fail(&block.base, call_src, "{s} call of extern function", .{ + .extern_fn => return mod.fail(&block.base, call_src, "{s} call of extern function", .{ @as([]const u8, if (is_comptime_call) "comptime" else "inline"), }), else => unreachable, @@ -2386,14 +2546,6 @@ fn analyzeCall( sema.func = module_fn; defer sema.func = parent_func; - const parent_param_inst_list = sema.param_inst_list; - sema.param_inst_list = args; - defer sema.param_inst_list = parent_param_inst_list; - - const parent_next_arg_index = sema.next_arg_index; - sema.next_arg_index = 0; - defer sema.next_arg_index = parent_next_arg_index; - var child_block: Scope.Block = .{ .parent = null, .sema = sema, @@ -2413,13 +2565,326 @@ fn analyzeCall( try sema.emitBackwardBranch(&child_block, call_src); // This will have return instructions analyzed as break instructions to - // the block_inst above. - try sema.analyzeFnBody(&child_block, module_fn.zir_body_inst); + // the block_inst above. Here we are performing "comptime/inline semantic analysis" + // for a function body, which means we must map the parameter ZIR instructions to + // the AIR instructions of the callsite. The callee could be a generic function + // which means its parameter type expressions must be resolved in order and used + // to successively coerce the arguments. + const fn_info = sema.code.getFnInfo(module_fn.zir_body_inst); + const zir_tags = sema.code.instructions.items(.tag); + var arg_i: usize = 0; + for (fn_info.param_body) |inst| switch (zir_tags[inst]) { + .param, .param_comptime => { + // Evaluate the parameter type expression now that previous ones have + // been mapped, and coerce the corresponding argument to it. + const pl_tok = sema.code.instructions.items(.data)[inst].pl_tok; + const param_src = pl_tok.src(); + const extra = sema.code.extraData(Zir.Inst.Param, pl_tok.payload_index); + const param_body = sema.code.extra[extra.end..][0..extra.data.body_len]; + const param_ty_inst = try sema.resolveBody(&child_block, param_body); + const param_ty = try sema.analyzeAsType(&child_block, param_src, param_ty_inst); + const arg_src = call_src; // TODO: better source location + const casted_arg = try sema.coerce(&child_block, param_ty, uncasted_args[arg_i], arg_src); + try sema.inst_map.putNoClobber(gpa, inst, casted_arg); + arg_i += 1; + continue; + }, + .param_anytype, .param_anytype_comptime => { + // No coercion needed. + try sema.inst_map.putNoClobber(gpa, inst, uncasted_args[arg_i]); + arg_i += 1; + continue; + }, + else => continue, + }; - const result = try sema.analyzeBlockBody(block, call_src, &child_block, merges); + // In case it is a generic function with an expression for the return type that depends + // on parameters, we must now do the same for the return type as we just did with + // each of the parameters, resolving the return type and providing it to the child + // `Sema` so that it can be used for the `ret_ptr` instruction. + const ret_ty_inst = try sema.resolveBody(&child_block, fn_info.ret_ty_body); + const ret_ty_src = func_src; // TODO better source location + const bare_return_type = try sema.analyzeAsType(&child_block, ret_ty_src, ret_ty_inst); + // If the function has an inferred error set, `bare_return_type` is the payload type only. + const fn_ret_ty = blk: { + // TODO instead of reusing the function's inferred error set, this code should + // create a temporary error set which is used for the comptime/inline function + // call alone, independent from the runtime instantiation. + if (func_ty_info.return_type.castTag(.error_union)) |payload| { + const error_set_ty = payload.data.error_set; + break :blk try Type.Tag.error_union.create(sema.arena, .{ + .error_set = error_set_ty, + .payload = bare_return_type, + }); + } + break :blk bare_return_type; + }; + const parent_fn_ret_ty = sema.fn_ret_ty; + sema.fn_ret_ty = fn_ret_ty; + defer sema.fn_ret_ty = parent_fn_ret_ty; - break :res result; + _ = try sema.analyzeBody(&child_block, fn_info.body); + break :res try sema.analyzeBlockBody(block, call_src, &child_block, merges); + } else if (func_ty_info.is_generic) res: { + const func_val = try sema.resolveConstValue(block, func_src, func); + const module_fn = func_val.castTag(.function).?.data; + // Check the Module's generic function map with an adapted context, so that we + // can match against `uncasted_args` rather than doing the work below to create a + // generic Scope only to junk it if it matches an existing instantiation. + const namespace = module_fn.owner_decl.namespace; + const fn_zir = namespace.file_scope.zir; + const fn_info = fn_zir.getFnInfo(module_fn.zir_body_inst); + const zir_tags = fn_zir.instructions.items(.tag); + + // This hash must match `Module.MonomorphedFuncsContext.hash`. + // For parameters explicitly marked comptime and simple parameter type expressions, + // we know whether a parameter is elided from a monomorphed function, and can + // use it in the hash here. However, for parameter type expressions that are not + // explicitly marked comptime and rely on previous parameter comptime values, we + // don't find out until after generating a monomorphed function whether the parameter + // type ended up being a "must-be-comptime-known" type. + var hasher = std.hash.Wyhash.init(0); + std.hash.autoHash(&hasher, @ptrToInt(module_fn)); + + const comptime_tvs = try sema.arena.alloc(TypedValue, func_ty_info.param_types.len); + + for (func_ty_info.param_types) |param_ty, i| { + const is_comptime = func_ty_info.paramIsComptime(i); + if (is_comptime) { + const arg_src = call_src; // TODO better source location + const casted_arg = try sema.coerce(block, param_ty, uncasted_args[i], arg_src); + if (try sema.resolveMaybeUndefVal(block, arg_src, casted_arg)) |arg_val| { + if (param_ty.tag() != .generic_poison) { + arg_val.hash(param_ty, &hasher); + } + comptime_tvs[i] = .{ + // This will be different than `param_ty` in the case of `generic_poison`. + .ty = sema.typeOf(casted_arg), + .val = arg_val, + }; + } else { + return sema.failWithNeededComptime(block, arg_src); + } + } else { + comptime_tvs[i] = .{ + .ty = sema.typeOf(uncasted_args[i]), + .val = Value.initTag(.generic_poison), + }; + } + } + + const precomputed_hash = hasher.final(); + + const adapter: GenericCallAdapter = .{ + .generic_fn = module_fn, + .precomputed_hash = precomputed_hash, + .func_ty_info = func_ty_info, + .comptime_tvs = comptime_tvs, + }; + const gop = try mod.monomorphed_funcs.getOrPutAdapted(gpa, {}, adapter); + if (gop.found_existing) { + const callee_func = gop.key_ptr.*; + break :res try sema.finishGenericCall( + block, + call_src, + callee_func, + func_src, + uncasted_args, + fn_info, + zir_tags, + ); + } + const new_module_func = try gpa.create(Module.Fn); + gop.key_ptr.* = new_module_func; + { + errdefer gpa.destroy(new_module_func); + const remove_adapter: GenericRemoveAdapter = .{ + .precomputed_hash = precomputed_hash, + }; + errdefer assert(mod.monomorphed_funcs.removeAdapted(new_module_func, remove_adapter)); + + try namespace.anon_decls.ensureUnusedCapacity(gpa, 1); + + // Create a Decl for the new function. + const new_decl = try mod.allocateNewDecl(namespace, module_fn.owner_decl.src_node); + // TODO better names for generic function instantiations + const name_index = mod.getNextAnonNameIndex(); + new_decl.name = try std.fmt.allocPrintZ(gpa, "{s}__anon_{d}", .{ + module_fn.owner_decl.name, name_index, + }); + new_decl.src_line = module_fn.owner_decl.src_line; + new_decl.is_pub = module_fn.owner_decl.is_pub; + new_decl.is_exported = module_fn.owner_decl.is_exported; + new_decl.has_align = module_fn.owner_decl.has_align; + new_decl.has_linksection = module_fn.owner_decl.has_linksection; + new_decl.zir_decl_index = module_fn.owner_decl.zir_decl_index; + new_decl.alive = true; // This Decl is called at runtime. + new_decl.has_tv = true; + new_decl.owns_tv = true; + new_decl.analysis = .in_progress; + new_decl.generation = mod.generation; + + namespace.anon_decls.putAssumeCapacityNoClobber(new_decl, {}); + + var new_decl_arena = std.heap.ArenaAllocator.init(sema.gpa); + errdefer new_decl_arena.deinit(); + + // Re-run the block that creates the function, with the comptime parameters + // pre-populated inside `inst_map`. This causes `param_comptime` and + // `param_anytype_comptime` ZIR instructions to be ignored, resulting in a + // new, monomorphized function, with the comptime parameters elided. + var child_sema: Sema = .{ + .mod = mod, + .gpa = gpa, + .arena = sema.arena, + .code = fn_zir, + .owner_decl = new_decl, + .namespace = namespace, + .func = null, + .fn_ret_ty = Type.initTag(.void), + .owner_func = null, + .comptime_args = try new_decl_arena.allocator.alloc(TypedValue, uncasted_args.len), + .comptime_args_fn_inst = module_fn.zir_body_inst, + .preallocated_new_func = new_module_func, + }; + defer child_sema.deinit(); + + var child_block: Scope.Block = .{ + .parent = null, + .sema = &child_sema, + .src_decl = new_decl, + .instructions = .{}, + .inlining = null, + .is_comptime = true, + }; + defer { + child_block.instructions.deinit(gpa); + child_block.params.deinit(gpa); + } + + try child_sema.inst_map.ensureUnusedCapacity(gpa, @intCast(u32, uncasted_args.len)); + var arg_i: usize = 0; + for (fn_info.param_body) |inst| { + var is_comptime = false; + var is_anytype = false; + switch (zir_tags[inst]) { + .param => { + is_comptime = func_ty_info.paramIsComptime(arg_i); + }, + .param_comptime => { + is_comptime = true; + }, + .param_anytype => { + is_anytype = true; + is_comptime = func_ty_info.paramIsComptime(arg_i); + }, + .param_anytype_comptime => { + is_anytype = true; + is_comptime = true; + }, + else => continue, + } + const arg_src = call_src; // TODO: better source location + const arg = uncasted_args[arg_i]; + if (try sema.resolveMaybeUndefVal(block, arg_src, arg)) |arg_val| { + const child_arg = try child_sema.addConstant(sema.typeOf(arg), arg_val); + child_sema.inst_map.putAssumeCapacityNoClobber(inst, child_arg); + } else if (is_comptime) { + return sema.failWithNeededComptime(block, arg_src); + } else if (is_anytype) { + // We insert into the map an instruction which is runtime-known + // but has the type of the comptime argument. + const child_arg = try child_block.addArg(sema.typeOf(arg), 0); + child_sema.inst_map.putAssumeCapacityNoClobber(inst, child_arg); + } + arg_i += 1; + } + const new_func_inst = child_sema.resolveBody(&child_block, fn_info.param_body) catch |err| { + // TODO look up the compile error that happened here and attach a note to it + // pointing here, at the generic instantiation callsite. + if (sema.owner_func) |owner_func| { + owner_func.state = .dependency_failure; + } else { + sema.owner_decl.analysis = .dependency_failure; + } + return err; + }; + const new_func_val = child_sema.resolveConstValue(&child_block, .unneeded, new_func_inst) catch unreachable; + const new_func = new_func_val.castTag(.function).?.data; + assert(new_func == new_module_func); + + arg_i = 0; + for (fn_info.param_body) |inst| { + switch (zir_tags[inst]) { + .param_comptime, .param_anytype_comptime, .param, .param_anytype => {}, + else => continue, + } + const arg = child_sema.inst_map.get(inst).?; + const copied_arg_ty = try child_sema.typeOf(arg).copy(&new_decl_arena.allocator); + if (child_sema.resolveMaybeUndefValAllowVariables( + &child_block, + .unneeded, + arg, + ) catch unreachable) |arg_val| { + child_sema.comptime_args[arg_i] = .{ + .ty = copied_arg_ty, + .val = try arg_val.copy(&new_decl_arena.allocator), + }; + } else { + child_sema.comptime_args[arg_i] = .{ + .ty = copied_arg_ty, + .val = Value.initTag(.generic_poison), + }; + } + + arg_i += 1; + } + + // Populate the Decl ty/val with the function and its type. + new_decl.ty = try child_sema.typeOf(new_func_inst).copy(&new_decl_arena.allocator); + new_decl.val = try Value.Tag.function.create(&new_decl_arena.allocator, new_func); + new_decl.analysis = .complete; + + log.debug("generic function '{s}' instantiated with type {}", .{ + new_decl.name, new_decl.ty, + }); + assert(!new_decl.ty.fnInfo().is_generic); + + // The generic function Decl is guaranteed to be the first dependency + // of each of its instantiations. + assert(new_decl.dependencies.keys().len == 0); + try mod.declareDeclDependency(new_decl, module_fn.owner_decl); + + // Queue up a `codegen_func` work item for the new Fn. The `comptime_args` field + // will be populated, ensuring it will have `analyzeBody` called with the ZIR + // parameters mapped appropriately. + try mod.comp.bin_file.allocateDeclIndexes(new_decl); + try mod.comp.work_queue.writeItem(.{ .codegen_func = new_func }); + + try new_decl.finalizeNewArena(&new_decl_arena); + } + + break :res try sema.finishGenericCall( + block, + call_src, + new_module_func, + func_src, + uncasted_args, + fn_info, + zir_tags, + ); } else res: { + const args = try sema.arena.alloc(Air.Inst.Ref, uncasted_args.len); + for (uncasted_args) |uncasted_arg, i| { + if (i < fn_params_len) { + const param_ty = func_ty.fnParamType(i); + const arg_src = call_src; // TODO: better source location + args[i] = try sema.coerce(block, param_ty, uncasted_arg, arg_src); + } else { + args[i] = uncasted_arg; + } + } + try sema.requireRuntimeBlock(block, call_src); try sema.air_extra.ensureUnusedCapacity(gpa, @typeInfo(Air.Call).Struct.fields.len + args.len); @@ -2442,6 +2907,75 @@ fn analyzeCall( return result; } +fn finishGenericCall( + sema: *Sema, + block: *Scope.Block, + call_src: LazySrcLoc, + callee: *Module.Fn, + func_src: LazySrcLoc, + uncasted_args: []const Air.Inst.Ref, + fn_info: Zir.FnInfo, + zir_tags: []const Zir.Inst.Tag, +) CompileError!Air.Inst.Ref { + const callee_inst = try sema.analyzeDeclVal(block, func_src, callee.owner_decl); + + // Make a runtime call to the new function, making sure to omit the comptime args. + try sema.requireRuntimeBlock(block, call_src); + + const comptime_args = callee.comptime_args.?; + const runtime_args_len = count: { + var count: u32 = 0; + var arg_i: usize = 0; + for (fn_info.param_body) |inst| { + switch (zir_tags[inst]) { + .param_comptime, .param_anytype_comptime, .param, .param_anytype => { + if (comptime_args[arg_i].val.tag() == .generic_poison) { + count += 1; + } + arg_i += 1; + }, + else => continue, + } + } + break :count count; + }; + const runtime_args = try sema.arena.alloc(Air.Inst.Ref, runtime_args_len); + { + const new_fn_ty = callee.owner_decl.ty; + var runtime_i: u32 = 0; + var total_i: u32 = 0; + for (fn_info.param_body) |inst| { + switch (zir_tags[inst]) { + .param_comptime, .param_anytype_comptime, .param, .param_anytype => {}, + else => continue, + } + const is_runtime = comptime_args[total_i].val.tag() == .generic_poison; + if (is_runtime) { + const param_ty = new_fn_ty.fnParamType(runtime_i); + const arg_src = call_src; // TODO: better source location + const uncasted_arg = uncasted_args[total_i]; + const casted_arg = try sema.coerce(block, param_ty, uncasted_arg, arg_src); + runtime_args[runtime_i] = casted_arg; + runtime_i += 1; + } + total_i += 1; + } + } + try sema.air_extra.ensureUnusedCapacity(sema.gpa, @typeInfo(Air.Call).Struct.fields.len + + runtime_args_len); + const func_inst = try block.addInst(.{ + .tag = .call, + .data = .{ .pl_op = .{ + .operand = callee_inst, + .payload = sema.addExtraAssumeCapacity(Air.Call{ + .args_len = runtime_args_len, + }), + } }, + }); + sema.appendRefsAssumeCapacity(runtime_args); + return func_inst; +} + fn zirIntType(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { _ = block; const tracy = trace(@src()); @@ -2460,7 +2994,7 @@ fn zirOptionalType(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) Compi const inst_data = sema.code.instructions.items(.data)[inst].un_node; const src = inst_data.src(); const child_type = try sema.resolveType(block, src, inst_data.operand); - const opt_type = try sema.mod.optionalType(sema.arena, child_type); + const opt_type = try Module.optionalType(sema.arena, child_type); return sema.addType(opt_type); } @@ -2491,11 +3025,10 @@ fn zirArrayType(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileE const tracy = trace(@src()); defer tracy.end(); - // TODO these should be lazily evaluated const bin_inst = sema.code.instructions.items(.data)[inst].bin; const len = try sema.resolveInstConst(block, .unneeded, bin_inst.lhs); const elem_type = try sema.resolveType(block, .unneeded, bin_inst.rhs); - const array_ty = try sema.mod.arrayType(sema.arena, len.val.toUnsignedInt(), null, elem_type); + const array_ty = try Module.arrayType(sema.arena, len.val.toUnsignedInt(), null, elem_type); return sema.addType(array_ty); } @@ -2504,13 +3037,12 @@ fn zirArrayTypeSentinel(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) const tracy = trace(@src()); defer tracy.end(); - // TODO these should be lazily evaluated const inst_data = sema.code.instructions.items(.data)[inst].array_type_sentinel; const len = try sema.resolveInstConst(block, .unneeded, inst_data.len); const extra = sema.code.extraData(Zir.Inst.ArrayTypeSentinel, inst_data.payload_index).data; const sentinel = try sema.resolveInstConst(block, .unneeded, extra.sentinel); const elem_type = try sema.resolveType(block, .unneeded, extra.elem_type); - const array_ty = try sema.mod.arrayType(sema.arena, len.val.toUnsignedInt(), sentinel.val, elem_type); + const array_ty = try Module.arrayType(sema.arena, len.val.toUnsignedInt(), sentinel.val, elem_type); return sema.addType(array_ty); } @@ -2543,7 +3075,7 @@ fn zirErrorUnionType(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) Com error_union.elemType(), }); } - const err_union_ty = try sema.mod.errorUnionType(sema.arena, error_union, payload); + const err_union_ty = try Module.errorUnionType(sema.arena, error_union, payload); return sema.addType(err_union_ty); } @@ -2576,7 +3108,7 @@ fn zirErrorToInt(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) Compile const op_coerced = try sema.coerce(block, Type.initTag(.anyerror), op, operand_src); const result_ty = Type.initTag(.u16); - if (try sema.resolvePossiblyUndefinedValue(block, src, op_coerced)) |val| { + if (try sema.resolveMaybeUndefVal(block, src, op_coerced)) |val| { if (val.isUndef()) { return sema.addConstUndef(result_ty); } @@ -2756,7 +3288,7 @@ fn zirEnumToInt(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileE return sema.addConstant(int_tag_ty, opv); } - if (try sema.resolvePossiblyUndefinedValue(block, operand_src, enum_tag)) |enum_tag_val| { + if (try sema.resolveMaybeUndefVal(block, operand_src, enum_tag)) |enum_tag_val| { if (enum_tag_val.castTag(.enum_field_index)) |enum_field_payload| { const field_index = enum_field_payload.data; switch (enum_tag_ty.tag()) { @@ -2803,7 +3335,7 @@ fn zirIntToEnum(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileE return mod.fail(&block.base, dest_ty_src, "expected enum, found {}", .{dest_ty}); } - if (try sema.resolvePossiblyUndefinedValue(block, operand_src, operand)) |int_val| { + if (try sema.resolveMaybeUndefVal(block, operand_src, operand)) |int_val| { if (dest_ty.isNonexhaustiveEnum()) { return sema.addConstant(dest_ty, int_val); } @@ -2861,12 +3393,13 @@ fn zirOptionalPayloadPtr( const child_pointer = try Module.simplePtrType(sema.arena, child_type, !optional_ptr_ty.isConstPtr(), .One); if (try sema.resolveDefinedValue(block, src, optional_ptr)) |pointer_val| { - const val = try pointer_val.pointerDeref(sema.arena); - if (val.isNull()) { - return sema.mod.fail(&block.base, src, "unable to unwrap null", .{}); + if (try pointer_val.pointerDeref(sema.arena)) |val| { + if (val.isNull()) { + return sema.mod.fail(&block.base, src, "unable to unwrap null", .{}); + } + // The same Value represents the pointer to the optional and the payload. + return sema.addConstant(child_pointer, pointer_val); } - // The same Value represents the pointer to the optional and the payload. - return sema.addConstant(child_pointer, pointer_val); } try sema.requireRuntimeBlock(block, src); @@ -2935,7 +3468,7 @@ fn zirErrUnionPayload( if (val.getError()) |name| { return sema.mod.fail(&block.base, src, "caught unexpected error '{s}'", .{name}); } - const data = val.castTag(.error_union).?.data; + const data = val.castTag(.eu_payload).?.data; const result_ty = operand_ty.errorUnionPayload(); return sema.addConstant(result_ty, data); } @@ -2971,19 +3504,15 @@ fn zirErrUnionPayloadPtr( const operand_pointer_ty = try Module.simplePtrType(sema.arena, payload_ty, !operand_ty.isConstPtr(), .One); if (try sema.resolveDefinedValue(block, src, operand)) |pointer_val| { - const val = try pointer_val.pointerDeref(sema.arena); - if (val.getError()) |name| { - return sema.mod.fail(&block.base, src, "caught unexpected error '{s}'", .{name}); + if (try pointer_val.pointerDeref(sema.arena)) |val| { + if (val.getError()) |name| { + return sema.mod.fail(&block.base, src, "caught unexpected error '{s}'", .{name}); + } + return sema.addConstant( + operand_pointer_ty, + try Value.Tag.eu_payload_ptr.create(sema.arena, pointer_val), + ); } - const data = val.castTag(.error_union).?.data; - // The same Value represents the pointer to the error union and the payload. - return sema.addConstant( - operand_pointer_ty, - try Value.Tag.ref_val.create( - sema.arena, - data, - ), - ); } try sema.requireRuntimeBlock(block, src); @@ -3010,8 +3539,7 @@ fn zirErrUnionCode(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) Compi if (try sema.resolveDefinedValue(block, src, operand)) |val| { assert(val.getError() != null); - const data = val.castTag(.error_union).?.data; - return sema.addConstant(result_ty, data); + return sema.addConstant(result_ty, val); } try sema.requireRuntimeBlock(block, src); @@ -3035,10 +3563,10 @@ fn zirErrUnionCodePtr(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) Co const result_ty = operand_ty.elemType().errorUnionSet(); if (try sema.resolveDefinedValue(block, src, operand)) |pointer_val| { - const val = try pointer_val.pointerDeref(sema.arena); - assert(val.getError() != null); - const data = val.castTag(.error_union).?.data; - return sema.addConstant(result_ty, data); + if (try pointer_val.pointerDeref(sema.arena)) |val| { + assert(val.getError() != null); + return sema.addConstant(result_ty, val); + } } try sema.requireRuntimeBlock(block, src); @@ -3071,13 +3599,15 @@ fn zirFunc( const inst_data = sema.code.instructions.items(.data)[inst].pl_node; const extra = sema.code.extraData(Zir.Inst.Func, inst_data.payload_index); - const param_types = sema.code.refSlice(extra.end, extra.data.param_types_len); + var extra_index = extra.end; + const ret_ty_body = sema.code.extra[extra_index..][0..extra.data.ret_body_len]; + extra_index += ret_ty_body.len; var body_inst: Zir.Inst.Index = 0; var src_locs: Zir.Inst.Func.SrcLocs = undefined; if (extra.data.body_len != 0) { body_inst = inst; - const extra_index = extra.end + extra.data.param_types_len + extra.data.body_len; + extra_index += extra.data.body_len; src_locs = sema.code.extraData(Zir.Inst.Func.SrcLocs, extra_index).data; } @@ -3089,9 +3619,8 @@ fn zirFunc( return sema.funcCommon( block, inst_data.src_node, - param_types, body_inst, - extra.data.return_type, + ret_ty_body, cc, Value.initTag(.null_value), false, @@ -3106,9 +3635,8 @@ fn funcCommon( sema: *Sema, block: *Scope.Block, src_node_offset: i32, - zir_param_types: []const Zir.Inst.Ref, body_inst: Zir.Inst.Index, - zir_return_type: Zir.Inst.Ref, + ret_ty_body: []const Zir.Inst.Index, cc: std.builtin.CallingConvention, align_val: Value, var_args: bool, @@ -3119,17 +3647,56 @@ fn funcCommon( ) CompileError!Air.Inst.Ref { const src: LazySrcLoc = .{ .node_offset = src_node_offset }; const ret_ty_src: LazySrcLoc = .{ .node_offset_fn_type_ret_ty = src_node_offset }; - const bare_return_type = try sema.resolveType(block, ret_ty_src, zir_return_type); + + // The return type body might be a type expression that depends on generic parameters. + // In such case we need to use a generic_poison value for the return type and mark + // the function as generic. + var is_generic = false; + const bare_return_type: Type = ret_ty: { + if (ret_ty_body.len == 0) break :ret_ty Type.initTag(.void); + + const err = err: { + // Make sure any nested param instructions don't clobber our work. + const prev_params = block.params; + block.params = .{}; + defer { + block.params.deinit(sema.gpa); + block.params = prev_params; + } + if (sema.resolveBody(block, ret_ty_body)) |ret_ty_inst| { + if (sema.analyzeAsType(block, ret_ty_src, ret_ty_inst)) |ret_ty| { + break :ret_ty ret_ty; + } else |err| break :err err; + } else |err| break :err err; + }; + switch (err) { + error.GenericPoison => { + // The type is not available until the generic instantiation. + is_generic = true; + break :ret_ty Type.initTag(.generic_poison); + }, + else => |e| return e, + } + }; const mod = sema.mod; - const new_func = if (body_inst == 0) undefined else try sema.gpa.create(Module.Fn); + const new_func: *Module.Fn = new_func: { + if (body_inst == 0) break :new_func undefined; + if (sema.comptime_args_fn_inst == body_inst) { + const new_func = sema.preallocated_new_func.?; + sema.preallocated_new_func = null; // take ownership + break :new_func new_func; + } + break :new_func try sema.gpa.create(Module.Fn); + }; errdefer if (body_inst != 0) sema.gpa.destroy(new_func); const fn_ty: Type = fn_ty: { // Hot path for some common function types. - if (zir_param_types.len == 0 and !var_args and align_val.tag() == .null_value and - !inferred_error_set) + // TODO can we eliminate some of these Type tag values? seems unnecessarily complicated. + if (!is_generic and block.params.items.len == 0 and !var_args and + align_val.tag() == .null_value and !inferred_error_set) { if (bare_return_type.zigTypeTag() == .NoReturn and cc == .Unspecified) { break :fn_ty Type.initTag(.fn_noreturn_no_args); @@ -3148,20 +3715,24 @@ fn funcCommon( } } - const param_types = try sema.arena.alloc(Type, zir_param_types.len); - for (zir_param_types) |param_type, i| { - // TODO make a compile error from `resolveType` report the source location - // of the specific parameter. Will need to take a similar strategy as - // `resolveSwitchItemVal` to avoid resolving the source location unless - // we actually need to report an error. - param_types[i] = try sema.resolveType(block, src, param_type); + const param_types = try sema.arena.alloc(Type, block.params.items.len); + const comptime_params = try sema.arena.alloc(bool, block.params.items.len); + for (block.params.items) |param, i| { + param_types[i] = param.ty; + comptime_params[i] = param.is_comptime; + is_generic = is_generic or param.is_comptime or + param.ty.tag() == .generic_poison or param.ty.requiresComptime(); } if (align_val.tag() != .null_value) { return mod.fail(&block.base, src, "TODO implement support for function prototypes to have alignment specified", .{}); } - const return_type = if (!inferred_error_set) bare_return_type else blk: { + is_generic = is_generic or bare_return_type.requiresComptime(); + + const return_type = if (!inferred_error_set or bare_return_type.tag() == .generic_poison) + bare_return_type + else blk: { const error_set_ty = try Type.Tag.error_set_inferred.create(sema.arena, .{ .func = new_func, .map = .{}, @@ -3174,9 +3745,11 @@ fn funcCommon( break :fn_ty try Type.Tag.function.create(sema.arena, .{ .param_types = param_types, + .comptime_params = comptime_params.ptr, .return_type = return_type, .cc = cc, .is_var_args = var_args, + .is_generic = is_generic, }); }; @@ -3235,11 +3808,16 @@ fn funcCommon( const is_inline = fn_ty.fnCallingConvention() == .Inline; const anal_state: Module.Fn.Analysis = if (is_inline) .inline_only else .queued; + const comptime_args: ?[*]TypedValue = if (sema.comptime_args_fn_inst == body_inst) blk: { + break :blk if (sema.comptime_args.len == 0) null else sema.comptime_args.ptr; + } else null; + const fn_payload = try sema.arena.create(Value.Payload.Function); new_func.* = .{ .state = anal_state, .zir_body_inst = body_inst, .owner_decl = sema.owner_decl, + .comptime_args = comptime_args, .lbrace_line = src_locs.lbrace_line, .rbrace_line = src_locs.rbrace_line, .lbrace_column = @truncate(u16, src_locs.columns), @@ -3252,6 +3830,113 @@ fn funcCommon( return sema.addConstant(fn_ty, Value.initPayload(&fn_payload.base)); } +fn zirParam( + sema: *Sema, + block: *Scope.Block, + inst: Zir.Inst.Index, + is_comptime: bool, +) CompileError!void { + const inst_data = sema.code.instructions.items(.data)[inst].pl_tok; + const src = inst_data.src(); + const extra = sema.code.extraData(Zir.Inst.Param, inst_data.payload_index); + const param_name = sema.code.nullTerminatedString(extra.data.name); + const body = sema.code.extra[extra.end..][0..extra.data.body_len]; + + // TODO check if param_name shadows a Decl. This only needs to be done if + // usingnamespace is implemented. + _ = param_name; + + // We could be in a generic function instantiation, or we could be evaluating a generic + // function without any comptime args provided. + const param_ty = param_ty: { + const err = err: { + // Make sure any nested param instructions don't clobber our work. + const prev_params = block.params; + block.params = .{}; + defer { + block.params.deinit(sema.gpa); + block.params = prev_params; + } + + if (sema.resolveBody(block, body)) |param_ty_inst| { + if (sema.analyzeAsType(block, src, param_ty_inst)) |param_ty| { + break :param_ty param_ty; + } else |err| break :err err; + } else |err| break :err err; + }; + switch (err) { + error.GenericPoison => { + // The type is not available until the generic instantiation. + // We result the param instruction with a poison value and + // insert an anytype parameter. + try block.params.append(sema.gpa, .{ + .ty = Type.initTag(.generic_poison), + .is_comptime = is_comptime, + }); + try sema.inst_map.putNoClobber(sema.gpa, inst, .generic_poison); + return; + }, + else => |e| return e, + } + }; + if (sema.inst_map.get(inst)) |arg| { + if (is_comptime or param_ty.requiresComptime()) { + // We have a comptime value for this parameter so it should be elided from the + // function type of the function instruction in this block. + const coerced_arg = try sema.coerce(block, param_ty, arg, src); + sema.inst_map.putAssumeCapacity(inst, coerced_arg); + return; + } + // Even though a comptime argument is provided, the generic function wants to treat + // this as a runtime parameter. + assert(sema.inst_map.remove(inst)); + } + + try block.params.append(sema.gpa, .{ + .ty = param_ty, + .is_comptime = is_comptime or param_ty.requiresComptime(), + }); + const result = try sema.addConstant(param_ty, Value.initTag(.generic_poison)); + try sema.inst_map.putNoClobber(sema.gpa, inst, result); +} + +fn zirParamAnytype( + sema: *Sema, + block: *Scope.Block, + inst: Zir.Inst.Index, + is_comptime: bool, +) CompileError!void { + const inst_data = sema.code.instructions.items(.data)[inst].str_tok; + const param_name = inst_data.get(sema.code); + + // TODO check if param_name shadows a Decl. This only needs to be done if + // usingnamespace is implemented. + _ = param_name; + + if (sema.inst_map.get(inst)) |air_ref| { + const param_ty = sema.typeOf(air_ref); + if (is_comptime or param_ty.requiresComptime()) { + // We have a comptime value for this parameter so it should be elided from the + // function type of the function instruction in this block. + return; + } + // The map is already populated but we do need to add a runtime parameter. + try block.params.append(sema.gpa, .{ + .ty = param_ty, + .is_comptime = false, + }); + return; + } + + // We are evaluating a generic function without any comptime args provided. + + try block.params.append(sema.gpa, .{ + .ty = Type.initTag(.generic_poison), + .is_comptime = is_comptime, + }); + try sema.inst_map.put(sema.gpa, inst, .generic_poison); +} + fn zirAs(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { const tracy = trace(@src()); defer tracy.end(); @@ -3306,16 +3991,16 @@ fn zirFieldVal(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileEr const inst_data = sema.code.instructions.items(.data)[inst].pl_node; const src = inst_data.src(); const field_name_src: LazySrcLoc = .{ .node_offset_field_name = inst_data.src_node }; + const lhs_src: LazySrcLoc = src; // TODO const extra = sema.code.extraData(Zir.Inst.Field, inst_data.payload_index).data; const field_name = sema.code.nullTerminatedString(extra.field_name_start); const object = sema.resolveInst(extra.lhs); - const object_ptr = if (sema.typeOf(object).zigTypeTag() == .Pointer) - object - else - try sema.analyzeRef(block, src, object); - const result_ptr = try sema.namedFieldPtr(block, src, object_ptr, field_name, field_name_src); - const result_ptr_src = src; - return sema.analyzeLoad(block, src, result_ptr, result_ptr_src); + if (sema.typeOf(object).isSinglePointer()) { + const result_ptr = try sema.fieldPtr(block, src, object, field_name, field_name_src); + return sema.analyzeLoad(block, src, result_ptr, lhs_src); + } else { + return sema.fieldVal(block, src, object, field_name, field_name_src); + } } fn zirFieldPtr(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { @@ -3328,7 +4013,7 @@ fn zirFieldPtr(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileEr const extra = sema.code.extraData(Zir.Inst.Field, inst_data.payload_index).data; const field_name = sema.code.nullTerminatedString(extra.field_name_start); const object_ptr = sema.resolveInst(extra.lhs); - return sema.namedFieldPtr(block, src, object_ptr, field_name, field_name_src); + return sema.fieldPtr(block, src, object_ptr, field_name, field_name_src); } fn zirFieldValNamed(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { @@ -3341,9 +4026,7 @@ fn zirFieldValNamed(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) Comp const extra = sema.code.extraData(Zir.Inst.FieldNamed, inst_data.payload_index).data; const object = sema.resolveInst(extra.lhs); const field_name = try sema.resolveConstString(block, field_name_src, extra.field_name); - const object_ptr = try sema.analyzeRef(block, src, object); - const result_ptr = try sema.namedFieldPtr(block, src, object_ptr, field_name, field_name_src); - return sema.analyzeLoad(block, src, result_ptr, src); + return sema.fieldVal(block, src, object, field_name, field_name_src); } fn zirFieldPtrNamed(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { @@ -3356,7 +4039,7 @@ fn zirFieldPtrNamed(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) Comp const extra = sema.code.extraData(Zir.Inst.FieldNamed, inst_data.payload_index).data; const object_ptr = sema.resolveInst(extra.lhs); const field_name = try sema.resolveConstString(block, field_name_src, extra.field_name); - return sema.namedFieldPtr(block, src, object_ptr, field_name, field_name_src); + return sema.fieldPtr(block, src, object_ptr, field_name, field_name_src); } fn zirIntCast(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { @@ -3372,27 +4055,8 @@ fn zirIntCast(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileErr const dest_type = try sema.resolveType(block, dest_ty_src, extra.lhs); const operand = sema.resolveInst(extra.rhs); - const dest_is_comptime_int = switch (dest_type.zigTypeTag()) { - .ComptimeInt => true, - .Int => false, - else => return sema.mod.fail( - &block.base, - dest_ty_src, - "expected integer type, found '{}'", - .{dest_type}, - ), - }; - - const operand_ty = sema.typeOf(operand); - switch (operand_ty.zigTypeTag()) { - .ComptimeInt, .Int => {}, - else => return sema.mod.fail( - &block.base, - operand_src, - "expected integer type, found '{}'", - .{operand_ty}, - ), - } + const dest_is_comptime_int = try sema.requireIntegerType(block, dest_ty_src, dest_type); + _ = try sema.requireIntegerType(block, operand_src, sema.typeOf(operand)); if (try sema.isComptimeKnown(block, operand_src, operand)) { return sema.coerce(block, dest_type, operand, operand_src); @@ -3838,6 +4502,7 @@ fn analyzeSwitch( block, &range_set, item_ref, + operand_ty, src_node_offset, .{ .scalar = scalar_i }, ); @@ -3860,6 +4525,7 @@ fn analyzeSwitch( block, &range_set, item_ref, + operand_ty, src_node_offset, .{ .multi = .{ .prong = multi_i, .item = @intCast(u32, item_i) } }, ); @@ -3877,6 +4543,7 @@ fn analyzeSwitch( &range_set, item_first, item_last, + operand_ty, src_node_offset, .{ .range = .{ .prong = multi_i, .item = range_i } }, ); @@ -3893,7 +4560,7 @@ fn analyzeSwitch( const min_int = try operand_ty.minInt(&arena, mod.getTarget()); const max_int = try operand_ty.maxInt(&arena, mod.getTarget()); - if (try range_set.spans(min_int, max_int)) { + if (try range_set.spans(min_int, max_int, operand_ty)) { if (special_prong == .@"else") { return mod.fail( &block.base, @@ -3998,7 +4665,7 @@ fn analyzeSwitch( ); } - var seen_values = ValueSrcMap.init(gpa); + var seen_values = ValueSrcMap.initContext(gpa, .{ .ty = operand_ty }); defer seen_values.deinit(); var extra_index: usize = special.end; @@ -4109,7 +4776,7 @@ fn analyzeSwitch( const item = sema.resolveInst(item_ref); // Validation above ensured these will succeed. const item_val = sema.resolveConstValue(&child_block, .unneeded, item) catch unreachable; - if (operand_val.eql(item_val)) { + if (operand_val.eql(item_val, operand_ty)) { return sema.resolveBlockBody(block, src, &child_block, body, merges); } } @@ -4131,7 +4798,7 @@ fn analyzeSwitch( const item = sema.resolveInst(item_ref); // Validation above ensured these will succeed. const item_val = sema.resolveConstValue(&child_block, .unneeded, item) catch unreachable; - if (operand_val.eql(item_val)) { + if (operand_val.eql(item_val, operand_ty)) { return sema.resolveBlockBody(block, src, &child_block, body, merges); } } @@ -4146,8 +4813,8 @@ fn analyzeSwitch( // Validation above ensured these will succeed. const first_tv = sema.resolveInstConst(&child_block, .unneeded, item_first) catch unreachable; const last_tv = sema.resolveInstConst(&child_block, .unneeded, item_last) catch unreachable; - if (Value.compare(operand_val, .gte, first_tv.val) and - Value.compare(operand_val, .lte, last_tv.val)) + if (Value.compare(operand_val, .gte, first_tv.val, operand_ty) and + Value.compare(operand_val, .lte, last_tv.val, operand_ty)) { return sema.resolveBlockBody(block, src, &child_block, body, merges); } @@ -4398,12 +5065,13 @@ fn validateSwitchRange( range_set: *RangeSet, first_ref: Zir.Inst.Ref, last_ref: Zir.Inst.Ref, + operand_ty: Type, src_node_offset: i32, switch_prong_src: Module.SwitchProngSrc, ) CompileError!void { const first_val = (try sema.resolveSwitchItemVal(block, first_ref, src_node_offset, switch_prong_src, .first)).val; const last_val = (try sema.resolveSwitchItemVal(block, last_ref, src_node_offset, switch_prong_src, .last)).val; - const maybe_prev_src = try range_set.add(first_val, last_val, switch_prong_src); + const maybe_prev_src = try range_set.add(first_val, last_val, operand_ty, switch_prong_src); return sema.validateSwitchDupe(block, maybe_prev_src, switch_prong_src, src_node_offset); } @@ -4412,11 +5080,12 @@ fn validateSwitchItem( block: *Scope.Block, range_set: *RangeSet, item_ref: Zir.Inst.Ref, + operand_ty: Type, src_node_offset: i32, switch_prong_src: Module.SwitchProngSrc, ) CompileError!void { const item_val = (try sema.resolveSwitchItemVal(block, item_ref, src_node_offset, switch_prong_src, .none)).val; - const maybe_prev_src = try range_set.add(item_val, item_val, switch_prong_src); + const maybe_prev_src = try range_set.add(item_val, item_val, operand_ty, switch_prong_src); return sema.validateSwitchDupe(block, maybe_prev_src, switch_prong_src, src_node_offset); } @@ -4688,8 +5357,8 @@ fn zirBitwise( return sema.mod.fail(&block.base, src, "invalid operands to binary bitwise expression: '{s}' and '{s}'", .{ @tagName(lhs_ty.zigTypeTag()), @tagName(rhs_ty.zigTypeTag()) }); } - if (try sema.resolvePossiblyUndefinedValue(block, lhs_src, casted_lhs)) |lhs_val| { - if (try sema.resolvePossiblyUndefinedValue(block, rhs_src, casted_rhs)) |rhs_val| { + if (try sema.resolveMaybeUndefVal(block, lhs_src, casted_lhs)) |lhs_val| { + if (try sema.resolveMaybeUndefVal(block, rhs_src, casted_rhs)) |rhs_val| { if (lhs_val.isUndef() or rhs_val.isUndef()) { return sema.addConstUndef(resolved_type); } @@ -4786,20 +5455,55 @@ fn analyzeArithmetic( ) CompileError!Air.Inst.Ref { const lhs_ty = sema.typeOf(lhs); const rhs_ty = sema.typeOf(rhs); - if (lhs_ty.zigTypeTag() == .Vector and rhs_ty.zigTypeTag() == .Vector) { + const lhs_zig_ty_tag = try lhs_ty.zigTypeTagOrPoison(); + const rhs_zig_ty_tag = try rhs_ty.zigTypeTagOrPoison(); + if (lhs_zig_ty_tag == .Vector and rhs_zig_ty_tag == .Vector) { if (lhs_ty.arrayLen() != rhs_ty.arrayLen()) { return sema.mod.fail(&block.base, src, "vector length mismatch: {d} and {d}", .{ - lhs_ty.arrayLen(), - rhs_ty.arrayLen(), + lhs_ty.arrayLen(), rhs_ty.arrayLen(), }); } return sema.mod.fail(&block.base, src, "TODO implement support for vectors in zirBinOp", .{}); - } else if (lhs_ty.zigTypeTag() == .Vector or rhs_ty.zigTypeTag() == .Vector) { + } else if (lhs_zig_ty_tag == .Vector or rhs_zig_ty_tag == .Vector) { return sema.mod.fail(&block.base, src, "mixed scalar and vector operands to binary expression: '{}' and '{}'", .{ - lhs_ty, - rhs_ty, + lhs_ty, rhs_ty, }); } + if (lhs_zig_ty_tag == .Pointer) switch (lhs_ty.ptrSize()) { + .One, .Slice => {}, + .Many, .C => { + // Pointer arithmetic. + const op_src = src; // TODO better source location + const air_tag: Air.Inst.Tag = switch (zir_tag) { + .add => .ptr_add, + .sub => .ptr_sub, + else => return sema.mod.fail( + &block.base, + op_src, + "invalid pointer arithmetic operand: '{s}''", + .{@tagName(zir_tag)}, + ), + }; + // TODO if the operand is comptime-known to be negative, or is a negative int, + // coerce to isize instead of usize. + const casted_rhs = try sema.coerce(block, Type.initTag(.usize), rhs, rhs_src); + const runtime_src = runtime_src: { + if (try sema.resolveDefinedValue(block, lhs_src, lhs)) |lhs_val| { + if (try sema.resolveDefinedValue(block, rhs_src, casted_rhs)) |rhs_val| { + _ = lhs_val; + _ = rhs_val; + return sema.mod.fail(&block.base, src, "TODO implement Sema for comptime pointer arithmetic", .{}); + } else { + break :runtime_src rhs_src; + } + } else { + break :runtime_src lhs_src; + } + }; + try sema.requireRuntimeBlock(block, runtime_src); + return block.addBinOp(air_tag, lhs, casted_rhs); + }, + }; const instructions = &[_]Air.Inst.Ref{ lhs, rhs }; const resolved_type = try sema.resolvePeerTypes(block, src, instructions); @@ -4817,11 +5521,13 @@ fn analyzeArithmetic( const is_float = scalar_tag == .Float or scalar_tag == .ComptimeFloat; if (!is_int and !(is_float and floatOpAllowed(zir_tag))) { - return sema.mod.fail(&block.base, src, "invalid operands to binary expression: '{s}' and '{s}'", .{ @tagName(lhs_ty.zigTypeTag()), @tagName(rhs_ty.zigTypeTag()) }); + return sema.mod.fail(&block.base, src, "invalid operands to binary expression: '{s}' and '{s}'", .{ + @tagName(lhs_zig_ty_tag), @tagName(rhs_zig_ty_tag), + }); } - if (try sema.resolvePossiblyUndefinedValue(block, lhs_src, casted_lhs)) |lhs_val| { - if (try sema.resolvePossiblyUndefinedValue(block, rhs_src, casted_rhs)) |rhs_val| { + if (try sema.resolveMaybeUndefVal(block, lhs_src, casted_lhs)) |lhs_val| { + if (try sema.resolveMaybeUndefVal(block, rhs_src, casted_rhs)) |rhs_val| { if (lhs_val.isUndef() or rhs_val.isUndef()) { return sema.addConstUndef(resolved_type); } @@ -4839,30 +5545,30 @@ fn analyzeArithmetic( const value = switch (zir_tag) { .add => blk: { const val = if (is_int) - try Module.intAdd(sema.arena, lhs_val, rhs_val) + try lhs_val.intAdd(rhs_val, sema.arena) else - try Module.floatAdd(sema.arena, scalar_type, src, lhs_val, rhs_val); + try lhs_val.floatAdd(rhs_val, scalar_type, sema.arena); break :blk val; }, .sub => blk: { const val = if (is_int) - try Module.intSub(sema.arena, lhs_val, rhs_val) + try lhs_val.intSub(rhs_val, sema.arena) else - try Module.floatSub(sema.arena, scalar_type, src, lhs_val, rhs_val); + try lhs_val.floatSub(rhs_val, scalar_type, sema.arena); break :blk val; }, .div => blk: { const val = if (is_int) - try Module.intDiv(sema.arena, lhs_val, rhs_val) + try lhs_val.intDiv(rhs_val, sema.arena) else - try Module.floatDiv(sema.arena, scalar_type, src, lhs_val, rhs_val); + try lhs_val.floatDiv(rhs_val, scalar_type, sema.arena); break :blk val; }, .mul => blk: { const val = if (is_int) - try Module.intMul(sema.arena, lhs_val, rhs_val) + try lhs_val.intMul(rhs_val, sema.arena) else - try Module.floatMul(sema.arena, scalar_type, src, lhs_val, rhs_val); + try lhs_val.floatMul(rhs_val, scalar_type, sema.arena); break :blk val; }, else => return sema.mod.fail(&block.base, src, "TODO Implement arithmetic operand '{s}'", .{@tagName(zir_tag)}), @@ -4871,10 +5577,13 @@ fn analyzeArithmetic( log.debug("{s}({}, {}) result: {}", .{ @tagName(zir_tag), lhs_val, rhs_val, value }); return sema.addConstant(scalar_type, value); + } else { + try sema.requireRuntimeBlock(block, rhs_src); } + } else { + try sema.requireRuntimeBlock(block, lhs_src); } - try sema.requireRuntimeBlock(block, src); const air_tag: Air.Inst.Tag = switch (zir_tag) { .add => .add, .addwrap => .addwrap, @@ -4978,6 +5687,97 @@ fn zirAsm( return asm_air; } +/// Only called for equality operators. See also `zirCmp`. +fn zirCmpEq( + sema: *Sema, + block: *Scope.Block, + inst: Zir.Inst.Index, + op: std.math.CompareOperator, + air_tag: Air.Inst.Tag, +) CompileError!Air.Inst.Ref { + const tracy = trace(@src()); + defer tracy.end(); + + const mod = sema.mod; + const inst_data = sema.code.instructions.items(.data)[inst].pl_node; + const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data; + const src: LazySrcLoc = inst_data.src(); + const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node }; + const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node }; + const lhs = sema.resolveInst(extra.lhs); + const rhs = sema.resolveInst(extra.rhs); + + const lhs_ty = sema.typeOf(lhs); + const rhs_ty = sema.typeOf(rhs); + const lhs_ty_tag = lhs_ty.zigTypeTag(); + const rhs_ty_tag = rhs_ty.zigTypeTag(); + if (lhs_ty_tag == .Null and rhs_ty_tag == .Null) { + // null == null, null != null + if (op == .eq) { + return Air.Inst.Ref.bool_true; + } else { + return Air.Inst.Ref.bool_false; + } + } + if (((lhs_ty_tag == .Null and rhs_ty_tag == .Optional) or + rhs_ty_tag == .Null and lhs_ty_tag == .Optional)) + { + // comparing null with optionals + const opt_operand = if (lhs_ty_tag == .Optional) lhs else rhs; + return sema.analyzeIsNull(block, src, opt_operand, op == .neq); + } + if (((lhs_ty_tag == .Null and rhs_ty.isCPtr()) or (rhs_ty_tag == .Null and lhs_ty.isCPtr()))) { + return mod.fail(&block.base, src, "TODO implement C pointer cmp", .{}); + } + if (lhs_ty_tag == .Null or rhs_ty_tag == .Null) { + const non_null_type = if (lhs_ty_tag == .Null) rhs_ty else lhs_ty; + return mod.fail(&block.base, src, "comparison of '{}' with null", .{non_null_type}); + } + if (((lhs_ty_tag == .EnumLiteral and rhs_ty_tag == .Union) or + (rhs_ty_tag == .EnumLiteral and lhs_ty_tag == .Union))) + { + return mod.fail(&block.base, src, "TODO implement equality comparison between a union's tag value and an enum literal", .{}); + } + if (lhs_ty_tag == .ErrorSet and rhs_ty_tag == .ErrorSet) { + const runtime_src: LazySrcLoc = src: { + if (try sema.resolveMaybeUndefVal(block, lhs_src, lhs)) |lval| { + if (try sema.resolveMaybeUndefVal(block, rhs_src, rhs)) |rval| { + if (lval.isUndef() or rval.isUndef()) { + return sema.addConstUndef(Type.initTag(.bool)); + } + // TODO optimisation opportunity: evaluate if mem.eql is faster with the names, + // or calling to Module.getErrorValue to get the values and then compare them is + // faster. + const lhs_name = lval.castTag(.@"error").?.data.name; + const rhs_name = rval.castTag(.@"error").?.data.name; + if (mem.eql(u8, lhs_name, rhs_name) == (op == .eq)) { + return Air.Inst.Ref.bool_true; + } else { + return Air.Inst.Ref.bool_false; + } + } else { + break :src rhs_src; + } + } else { + break :src lhs_src; + } + }; + try sema.requireRuntimeBlock(block, runtime_src); + return block.addBinOp(air_tag, lhs, rhs); + } + if (lhs_ty_tag == .Type and rhs_ty_tag == .Type) { + const lhs_as_type = try sema.analyzeAsType(block, lhs_src, lhs); + const rhs_as_type = try sema.analyzeAsType(block, rhs_src, rhs); + if (lhs_as_type.eql(rhs_as_type) == (op == .eq)) { + return Air.Inst.Ref.bool_true; + } else { + return Air.Inst.Ref.bool_false; + } + } + return sema.analyzeCmp(block, src, lhs, rhs, op, lhs_src, rhs_src, true); +} + +/// Only called for non-equality operators. See also `zirCmpEq`. fn zirCmp( sema: *Sema, block: *Scope.Block, @@ -4987,8 +5787,6 @@ fn zirCmp( const tracy = trace(@src()); defer tracy.end(); - const mod = sema.mod; - const inst_data = sema.code.instructions.items(.data)[inst].pl_node; const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data; const src: LazySrcLoc = inst_data.src(); @@ -4996,106 +5794,71 @@ fn zirCmp( const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node }; const lhs = sema.resolveInst(extra.lhs); const rhs = sema.resolveInst(extra.rhs); + return sema.analyzeCmp(block, src, lhs, rhs, op, lhs_src, rhs_src, false); +} - const is_equality_cmp = switch (op) { - .eq, .neq => true, - else => false, - }; +fn analyzeCmp( + sema: *Sema, + block: *Scope.Block, + src: LazySrcLoc, + lhs: Air.Inst.Ref, + rhs: Air.Inst.Ref, + op: std.math.CompareOperator, + lhs_src: LazySrcLoc, + rhs_src: LazySrcLoc, + is_equality_cmp: bool, +) CompileError!Air.Inst.Ref { const lhs_ty = sema.typeOf(lhs); const rhs_ty = sema.typeOf(rhs); - const lhs_ty_tag = lhs_ty.zigTypeTag(); - const rhs_ty_tag = rhs_ty.zigTypeTag(); - if (is_equality_cmp and lhs_ty_tag == .Null and rhs_ty_tag == .Null) { - // null == null, null != null - if (op == .eq) { - return Air.Inst.Ref.bool_true; - } else { - return Air.Inst.Ref.bool_false; - } - } else if (is_equality_cmp and - ((lhs_ty_tag == .Null and rhs_ty_tag == .Optional) or - rhs_ty_tag == .Null and lhs_ty_tag == .Optional)) - { - // comparing null with optionals - const opt_operand = if (lhs_ty_tag == .Optional) lhs else rhs; - return sema.analyzeIsNull(block, src, opt_operand, op == .neq); - } else if (is_equality_cmp and - ((lhs_ty_tag == .Null and rhs_ty.isCPtr()) or (rhs_ty_tag == .Null and lhs_ty.isCPtr()))) - { - return mod.fail(&block.base, src, "TODO implement C pointer cmp", .{}); - } else if (lhs_ty_tag == .Null or rhs_ty_tag == .Null) { - const non_null_type = if (lhs_ty_tag == .Null) rhs_ty else lhs_ty; - return mod.fail(&block.base, src, "comparison of '{}' with null", .{non_null_type}); - } else if (is_equality_cmp and - ((lhs_ty_tag == .EnumLiteral and rhs_ty_tag == .Union) or - (rhs_ty_tag == .EnumLiteral and lhs_ty_tag == .Union))) - { - return mod.fail(&block.base, src, "TODO implement equality comparison between a union's tag value and an enum literal", .{}); - } else if (lhs_ty_tag == .ErrorSet and rhs_ty_tag == .ErrorSet) { - if (!is_equality_cmp) { - return mod.fail(&block.base, src, "{s} operator not allowed for errors", .{@tagName(op)}); - } - if (try sema.resolvePossiblyUndefinedValue(block, lhs_src, lhs)) |lval| { - if (try sema.resolvePossiblyUndefinedValue(block, rhs_src, rhs)) |rval| { - if (lval.isUndef() or rval.isUndef()) { - return sema.addConstUndef(Type.initTag(.bool)); - } - // TODO optimisation opportunity: evaluate if mem.eql is faster with the names, - // or calling to Module.getErrorValue to get the values and then compare them is - // faster. - const lhs_name = lval.castTag(.@"error").?.data.name; - const rhs_name = rval.castTag(.@"error").?.data.name; - if (mem.eql(u8, lhs_name, rhs_name) == (op == .eq)) { - return Air.Inst.Ref.bool_true; - } else { - return Air.Inst.Ref.bool_false; - } - } - } - try sema.requireRuntimeBlock(block, src); - const tag: Air.Inst.Tag = if (op == .eq) .cmp_eq else .cmp_neq; - return block.addBinOp(tag, lhs, rhs); - } else if (lhs_ty.isNumeric() and rhs_ty.isNumeric()) { + if (lhs_ty.isNumeric() and rhs_ty.isNumeric()) { // This operation allows any combination of integer and float types, regardless of the // signed-ness, comptime-ness, and bit-width. So peer type resolution is incorrect for // numeric types. return sema.cmpNumeric(block, src, lhs, rhs, op, lhs_src, rhs_src); - } else if (lhs_ty_tag == .Type and rhs_ty_tag == .Type) { - if (!is_equality_cmp) { - return mod.fail(&block.base, src, "{s} operator not allowed for types", .{@tagName(op)}); - } - const lhs_as_type = try sema.analyzeAsType(block, lhs_src, lhs); - const rhs_as_type = try sema.analyzeAsType(block, rhs_src, rhs); - if (lhs_as_type.eql(rhs_as_type) == (op == .eq)) { - return Air.Inst.Ref.bool_true; - } else { - return Air.Inst.Ref.bool_false; - } } - const instructions = &[_]Air.Inst.Ref{ lhs, rhs }; const resolved_type = try sema.resolvePeerTypes(block, src, instructions); if (!resolved_type.isSelfComparable(is_equality_cmp)) { - return mod.fail(&block.base, src, "operator not allowed for type '{}'", .{resolved_type}); + return sema.mod.fail(&block.base, src, "{s} operator not allowed for type '{}'", .{ + @tagName(op), resolved_type, + }); } const casted_lhs = try sema.coerce(block, resolved_type, lhs, lhs_src); const casted_rhs = try sema.coerce(block, resolved_type, rhs, rhs_src); - if (try sema.resolvePossiblyUndefinedValue(block, lhs_src, casted_lhs)) |lhs_val| { - if (try sema.resolvePossiblyUndefinedValue(block, rhs_src, casted_rhs)) |rhs_val| { - if (lhs_val.isUndef() or rhs_val.isUndef()) { - return sema.addConstUndef(resolved_type); - } - if (lhs_val.compare(op, rhs_val)) { - return Air.Inst.Ref.bool_true; - } else { - return Air.Inst.Ref.bool_false; - } - } - } + const runtime_src: LazySrcLoc = src: { + if (try sema.resolveMaybeUndefVal(block, lhs_src, casted_lhs)) |lhs_val| { + if (lhs_val.isUndef()) return sema.addConstUndef(resolved_type); + if (try sema.resolveMaybeUndefVal(block, rhs_src, casted_rhs)) |rhs_val| { + if (rhs_val.isUndef()) return sema.addConstUndef(resolved_type); + + if (lhs_val.compare(op, rhs_val, resolved_type)) { + return Air.Inst.Ref.bool_true; + } else { + return Air.Inst.Ref.bool_false; + } + } else { + if (resolved_type.zigTypeTag() == .Bool) { + // We can lower bool eq/neq more efficiently. + return sema.runtimeBoolCmp(block, op, casted_rhs, lhs_val.toBool(), rhs_src); + } + break :src rhs_src; + } + } else { + // For bools, we still check the other operand, because we can lower + // bool eq/neq more efficiently. + if (resolved_type.zigTypeTag() == .Bool) { + if (try sema.resolveMaybeUndefVal(block, rhs_src, casted_rhs)) |rhs_val| { + if (rhs_val.isUndef()) return sema.addConstUndef(resolved_type); + return sema.runtimeBoolCmp(block, op, casted_lhs, rhs_val.toBool(), lhs_src); + } + } + break :src lhs_src; + } + }; + try sema.requireRuntimeBlock(block, runtime_src); - try sema.requireRuntimeBlock(block, src); const tag: Air.Inst.Tag = switch (op) { .lt => .cmp_lt, .lte => .cmp_lte, @@ -5108,6 +5871,26 @@ fn zirCmp( return block.addBinOp(tag, casted_lhs, casted_rhs); } +/// cmp_eq (x, false) => not(x) +/// cmp_eq (x, true ) => x +/// cmp_neq(x, false) => x +/// cmp_neq(x, true ) => not(x) +fn runtimeBoolCmp( + sema: *Sema, + block: *Scope.Block, + op: std.math.CompareOperator, + lhs: Air.Inst.Ref, + rhs: bool, + runtime_src: LazySrcLoc, +) CompileError!Air.Inst.Ref { + if ((op == .neq) == rhs) { + try sema.requireRuntimeBlock(block, runtime_src); + return block.addTyOp(.not, Type.initTag(.bool), lhs); + } else { + return lhs; + } +} + fn zirSizeOf(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { const inst_data = sema.code.instructions.items(.data)[inst].un_node; const operand_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = inst_data.src_node }; @@ -5507,7 +6290,6 @@ fn zirRetCoerce( sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index, - need_coercion: bool, ) CompileError!Zir.Inst.Index { const tracy = trace(@src()); defer tracy.end(); @@ -5516,7 +6298,7 @@ fn zirRetCoerce( const operand = sema.resolveInst(inst_data.operand); const src = inst_data.src(); - return sema.analyzeRet(block, operand, src, need_coercion); + return sema.analyzeRet(block, operand, src, true); } fn zirRetNode(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Zir.Inst.Index { @@ -5530,13 +6312,33 @@ fn zirRetNode(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileErr return sema.analyzeRet(block, operand, src, false); } +fn zirRetLoad(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Zir.Inst.Index { + const tracy = trace(@src()); + defer tracy.end(); + + const inst_data = sema.code.instructions.items(.data)[inst].un_node; + const src = inst_data.src(); + // TODO: when implementing functions that accept a result location pointer, + // this logic will be updated to only do a load in case that the function's return + // type in fact does not need a result location pointer. Until then we assume + // the `ret_ptr` is the same as an `alloc` and do a load here. + const ret_ptr = sema.resolveInst(inst_data.operand); + const operand = try sema.analyzeLoad(block, src, ret_ptr, src); + return sema.analyzeRet(block, operand, src, false); +} + fn analyzeRet( sema: *Sema, block: *Scope.Block, - operand: Air.Inst.Ref, + uncasted_operand: Air.Inst.Ref, src: LazySrcLoc, need_coercion: bool, ) CompileError!Zir.Inst.Index { + const operand = if (!need_coercion) + uncasted_operand + else + try sema.coerce(block, sema.fn_ret_ty, uncasted_operand, src); + if (block.inlining) |inlining| { // We are inlining a function call; rewrite the `ret` as a `break`. try inlining.merges.results.append(sema.gpa, operand); @@ -5544,15 +6346,6 @@ fn analyzeRet( return always_noreturn; } - if (need_coercion) { - if (sema.func) |func| { - const fn_ty = func.owner_decl.ty; - const fn_ret_ty = fn_ty.fnReturnType(); - const casted_operand = try sema.coerce(block, fn_ret_ty, operand, src); - _ = try block.addUnOp(.ret, casted_operand); - return always_noreturn; - } - } _ = try block.addUnOp(.ret, operand); return always_noreturn; } @@ -5571,7 +6364,7 @@ fn zirPtrTypeSimple(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) Comp const inst_data = sema.code.instructions.items(.data)[inst].ptr_type_simple; const elem_type = try sema.resolveType(block, .unneeded, inst_data.elem_type); - const ty = try sema.mod.ptrType( + const ty = try Module.ptrType( sema.arena, elem_type, null, @@ -5625,7 +6418,7 @@ fn zirPtrType(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileErr const elem_type = try sema.resolveType(block, .unneeded, extra.data.elem_type); - const ty = try sema.mod.ptrType( + const ty = try Module.ptrType( sema.arena, elem_type, sentinel, @@ -5756,7 +6549,7 @@ fn zirStructInit(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index, is_ref: if (is_comptime) { const values = try sema.arena.alloc(Value, field_inits.len); for (field_inits) |field_init, i| { - values[i] = (sema.resolvePossiblyUndefinedValue(block, src, field_init) catch unreachable).?; + values[i] = (sema.resolveMaybeUndefVal(block, src, field_init) catch unreachable).?; } return sema.addConstant(struct_ty, try Value.Tag.@"struct".create(sema.arena, values.ptr)); } @@ -5847,8 +6640,14 @@ fn zirAlignOf(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileErr fn zirBoolToInt(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { const inst_data = sema.code.instructions.items(.data)[inst].un_node; - const src = inst_data.src(); - return sema.mod.fail(&block.base, src, "TODO: Sema.zirBoolToInt", .{}); + const operand_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = inst_data.src_node }; + const operand = sema.resolveInst(inst_data.operand); + if (try sema.resolveMaybeUndefVal(block, operand_src, operand)) |val| { + if (val.isUndef()) return sema.addConstUndef(Type.initTag(.u1)); + const bool_ints = [2]Air.Inst.Ref{ .zero, .one }; + return bool_ints[@boolToInt(val.toBool())]; + } + return block.addUnOp(.bool_to_int, operand); } fn zirEmbedFile(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { @@ -5982,7 +6781,62 @@ fn zirPtrCast(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileErr fn zirTruncate(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { const inst_data = sema.code.instructions.items(.data)[inst].pl_node; const src = inst_data.src(); - return sema.mod.fail(&block.base, src, "TODO: Sema.zirTruncate", .{}); + const dest_ty_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = inst_data.src_node }; + const operand_src: LazySrcLoc = .{ .node_offset_builtin_call_arg1 = inst_data.src_node }; + const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data; + const dest_ty = try sema.resolveType(block, dest_ty_src, extra.lhs); + const operand = sema.resolveInst(extra.rhs); + const operand_ty = sema.typeOf(operand); + const mod = sema.mod; + const dest_is_comptime_int = try sema.requireIntegerType(block, dest_ty_src, dest_ty); + const src_is_comptime_int = try sema.requireIntegerType(block, operand_src, operand_ty); + + if (dest_is_comptime_int) { + return sema.coerce(block, dest_ty, operand, operand_src); + } + + const target = mod.getTarget(); + const src_info = operand_ty.intInfo(target); + const dest_info = dest_ty.intInfo(target); + + if (src_info.bits == 0 or dest_info.bits == 0) { + return sema.addConstant(dest_ty, Value.initTag(.zero)); + } + + if (!src_is_comptime_int) { + if (src_info.signedness != dest_info.signedness) { + return mod.fail(&block.base, operand_src, "expected {s} integer type, found '{}'", .{ + @tagName(dest_info.signedness), operand_ty, + }); + } + if (src_info.bits > 0 and src_info.bits < dest_info.bits) { + const msg = msg: { + const msg = try mod.errMsg( + &block.base, + src, + "destination type '{}' has more bits than source type '{}'", + .{ dest_ty, operand_ty }, + ); + errdefer msg.destroy(mod.gpa); + try mod.errNote(&block.base, dest_ty_src, msg, "destination type has {d} bits", .{ + dest_info.bits, + }); + try mod.errNote(&block.base, operand_src, msg, "source type has {d} bits", .{ + src_info.bits, + }); + break :msg msg; + }; + return mod.failWithOwnedErrorMsg(&block.base, msg); + } + } + + if (try sema.resolveMaybeUndefVal(block, operand_src, operand)) |val| { + if (val.isUndef()) return sema.addConstUndef(dest_ty); + return sema.addConstant(dest_ty, try val.intTrunc(sema.arena, dest_info.bits)); + } + + try sema.requireRuntimeBlock(block, src); + return block.addTyOp(.trunc, dest_ty, operand); } fn zirAlignCast(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { @@ -6099,6 +6953,12 @@ fn zirShuffle(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileErr return sema.mod.fail(&block.base, src, "TODO: Sema.zirShuffle", .{}); } +fn zirSelect(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { + const inst_data = sema.code.instructions.items(.data)[inst].pl_node; + const src = inst_data.src(); + return sema.mod.fail(&block.base, src, "TODO: Sema.zirSelect", .{}); +} + fn zirAtomicLoad(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { const inst_data = sema.code.instructions.items(.data)[inst].pl_node; const src = inst_data.src(); @@ -6141,6 +7001,12 @@ fn zirFieldParentPtr(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) Com return sema.mod.fail(&block.base, src, "TODO: Sema.zirFieldParentPtr", .{}); } +fn zirMaximum(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { + const inst_data = sema.code.instructions.items(.data)[inst].pl_node; + const src = inst_data.src(); + return sema.mod.fail(&block.base, src, "TODO: Sema.zirMaximum", .{}); +} + fn zirMemcpy(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { const inst_data = sema.code.instructions.items(.data)[inst].pl_node; const src = inst_data.src(); @@ -6153,6 +7019,12 @@ fn zirMemset(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileErro return sema.mod.fail(&block.base, src, "TODO: Sema.zirMemset", .{}); } +fn zirMinimum(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { + const inst_data = sema.code.instructions.items(.data)[inst].pl_node; + const src = inst_data.src(); + return sema.mod.fail(&block.base, src, "TODO: Sema.zirMinimum", .{}); +} + fn zirBuiltinAsyncCall(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { const inst_data = sema.code.instructions.items(.data)[inst].pl_node; const src = inst_data.src(); @@ -6213,7 +7085,7 @@ fn zirVarExtended( const init_ref = @intToEnum(Zir.Inst.Ref, sema.code.extra[extra_index]); extra_index += 1; const init_air_inst = sema.resolveInst(init_ref); - break :blk (try sema.resolvePossiblyUndefinedValue(block, init_src, init_air_inst)) orelse + break :blk (try sema.resolveMaybeUndefVal(block, init_src, init_air_inst)) orelse return sema.failWithNeededComptime(block, init_src); } else Value.initTag(.unreachable_value); @@ -6271,7 +7143,7 @@ fn zirFuncExtended( const cc_ref = @intToEnum(Zir.Inst.Ref, sema.code.extra[extra_index]); extra_index += 1; const cc_tv = try sema.resolveInstConst(block, cc_src, cc_ref); - break :blk cc_tv.val.toEnum(cc_tv.ty, std.builtin.CallingConvention); + break :blk cc_tv.val.toEnum(std.builtin.CallingConvention); } else .Unspecified; const align_val: Value = if (small.has_align) blk: { @@ -6281,8 +7153,8 @@ fn zirFuncExtended( break :blk align_tv.val; } else Value.initTag(.null_value); - const param_types = sema.code.refSlice(extra_index, extra.data.param_types_len); - extra_index += param_types.len; + const ret_ty_body = sema.code.extra[extra_index..][0..extra.data.ret_body_len]; + extra_index += ret_ty_body.len; var body_inst: Zir.Inst.Index = 0; var src_locs: Zir.Inst.Func.SrcLocs = undefined; @@ -6299,9 +7171,8 @@ fn zirFuncExtended( return sema.funcCommon( block, extra.data.src_node, - param_types, body_inst, - extra.data.return_type, + ret_ty_body, cc, align_val, is_var_args, @@ -6385,6 +7256,14 @@ fn requireRuntimeBlock(sema: *Sema, block: *Scope.Block, src: LazySrcLoc) !void try sema.requireFunctionBlock(block, src); } +fn requireIntegerType(sema: *Sema, block: *Scope.Block, src: LazySrcLoc, ty: Type) !bool { + switch (ty.zigTypeTag()) { + .ComptimeInt => return true, + .Int => return false, + else => return sema.mod.fail(&block.base, src, "expected integer type, found '{}'", .{ty}), + } +} + fn validateVarType(sema: *Sema, block: *Scope.Block, src: LazySrcLoc, ty: Type) !void { if (!ty.isValidVarType(false)) { return sema.mod.fail(&block.base, src, "variable of type '{}' must be const or comptime", .{ty}); @@ -6490,7 +7369,7 @@ fn panicWithMsg( const stack_trace_ty = try sema.resolveTypeFields(block, src, unresolved_stack_trace_ty); const ptr_stack_trace_ty = try Module.simplePtrType(arena, stack_trace_ty, true, .One); const null_stack_trace = try sema.addConstant( - try mod.optionalType(arena, ptr_stack_trace_ty), + try Module.optionalType(arena, ptr_stack_trace_ty), Value.initTag(.null_value), ); const args = try arena.create([2]Air.Inst.Ref); @@ -6517,19 +7396,12 @@ fn safetyPanic( const msg_inst = msg_inst: { // TODO instead of making a new decl for every panic in the entire compilation, // introduce the concept of a reference-counted decl for these - var new_decl_arena = std.heap.ArenaAllocator.init(sema.gpa); - errdefer new_decl_arena.deinit(); - - const decl_ty = try Type.Tag.array_u8.create(&new_decl_arena.allocator, msg.len); - const decl_val = try Value.Tag.bytes.create(&new_decl_arena.allocator, msg); - - const new_decl = try sema.mod.createAnonymousDecl(&block.base, .{ - .ty = decl_ty, - .val = decl_val, - }); - errdefer sema.mod.deleteAnonDecl(&block.base, new_decl); - try new_decl.finalizeNewArena(&new_decl_arena); - break :msg_inst try sema.analyzeDeclRef(block, .unneeded, new_decl); + var anon_decl = try block.startAnonDecl(); + defer anon_decl.deinit(); + break :msg_inst try sema.analyzeDeclRef(try anon_decl.finish( + try Type.Tag.array_u8.create(anon_decl.arena(), msg.len), + try Value.Tag.bytes.create(anon_decl.arena(), msg), + )); }; const casted_msg_inst = try sema.coerce(block, Type.initTag(.const_slice_u8), msg_inst, src); @@ -6544,94 +7416,98 @@ fn emitBackwardBranch(sema: *Sema, block: *Scope.Block, src: LazySrcLoc) !void { } } -fn namedFieldPtr( +fn fieldVal( sema: *Sema, block: *Scope.Block, src: LazySrcLoc, - object_ptr: Air.Inst.Ref, + object: Air.Inst.Ref, field_name: []const u8, field_name_src: LazySrcLoc, ) CompileError!Air.Inst.Ref { + // When editing this function, note that there is corresponding logic to be edited + // in `fieldPtr`. This function takes a value and returns a value. + const mod = sema.mod; const arena = sema.arena; + const object_src = src; // TODO better source location + const object_ty = sema.typeOf(object); - const object_ptr_src = src; // TODO better source location - const object_ptr_ty = sema.typeOf(object_ptr); - const elem_ty = switch (object_ptr_ty.zigTypeTag()) { - .Pointer => object_ptr_ty.elemType(), - else => return mod.fail(&block.base, object_ptr_src, "expected pointer, found '{}'", .{object_ptr_ty}), - }; - switch (elem_ty.zigTypeTag()) { + switch (object_ty.zigTypeTag()) { .Array => { if (mem.eql(u8, field_name, "len")) { return sema.addConstant( - Type.initTag(.single_const_pointer_to_comptime_int), - try Value.Tag.ref_val.create( - arena, - try Value.Tag.int_u64.create(arena, elem_ty.arrayLen()), - ), + Type.initTag(.comptime_int), + try Value.Tag.int_u64.create(arena, object_ty.arrayLen()), ); } else { return mod.fail( &block.base, field_name_src, "no member named '{s}' in '{}'", - .{ field_name, elem_ty }, + .{ field_name, object_ty }, ); } }, - .Pointer => { - const ptr_child = elem_ty.elemType(); - if (ptr_child.isSlice()) { + .Pointer => switch (object_ty.ptrSize()) { + .Slice => { if (mem.eql(u8, field_name, "ptr")) { - return mod.fail( - &block.base, - field_name_src, - "cannot obtain reference to pointer field of slice '{}'", - .{elem_ty}, - ); + const buf = try arena.create(Type.Payload.ElemType); + const result_ty = object_ty.slicePtrFieldType(buf); + if (try sema.resolveMaybeUndefVal(block, object_src, object)) |val| { + if (val.isUndef()) return sema.addConstUndef(result_ty); + return mod.fail( + &block.base, + field_name_src, + "TODO implement comptime slice ptr", + .{}, + ); + } + try sema.requireRuntimeBlock(block, src); + return block.addTyOp(.slice_ptr, result_ty, object); } else if (mem.eql(u8, field_name, "len")) { - return mod.fail( - &block.base, - field_name_src, - "cannot obtain reference to length field of slice '{}'", - .{elem_ty}, - ); + const result_ty = Type.initTag(.usize); + if (try sema.resolveMaybeUndefVal(block, object_src, object)) |val| { + if (val.isUndef()) return sema.addConstUndef(result_ty); + return sema.addConstant( + result_ty, + try Value.Tag.int_u64.create(arena, val.sliceLen()), + ); + } + try sema.requireRuntimeBlock(block, src); + return block.addTyOp(.slice_len, result_ty, object); } else { return mod.fail( &block.base, field_name_src, "no member named '{s}' in '{}'", - .{ field_name, elem_ty }, + .{ field_name, object_ty }, ); } - } else switch (ptr_child.zigTypeTag()) { - .Array => { + }, + .One => { + const elem_ty = object_ty.elemType(); + if (elem_ty.zigTypeTag() == .Array) { if (mem.eql(u8, field_name, "len")) { return sema.addConstant( - Type.initTag(.single_const_pointer_to_comptime_int), - try Value.Tag.ref_val.create( - arena, - try Value.Tag.int_u64.create(arena, ptr_child.arrayLen()), - ), + Type.initTag(.comptime_int), + try Value.Tag.int_u64.create(arena, elem_ty.arrayLen()), ); } else { return mod.fail( &block.base, field_name_src, "no member named '{s}' in '{}'", - .{ field_name, elem_ty }, + .{ field_name, object_ty }, ); } - }, - else => {}, - } + } + }, + .Many, .C => {}, }, .Type => { - _ = try sema.resolveConstValue(block, object_ptr_src, object_ptr); - const result = try sema.analyzeLoad(block, src, object_ptr, object_ptr_src); - const val = (sema.resolveDefinedValue(block, src, result) catch unreachable).?; - const child_type = try val.toType(arena); + const val = (try sema.resolveDefinedValue(block, object_src, object)).?; + var to_type_buffer: Value.ToTypeBuffer = undefined; + const child_type = val.toType(&to_type_buffer); switch (child_type.zigTypeTag()) { .ErrorSet => { // TODO resolve inferred error sets @@ -6646,25 +7522,19 @@ fn namedFieldPtr( } } return mod.fail(&block.base, src, "no error named '{s}' in '{}'", .{ - field_name, - child_type, + field_name, child_type, }); } else (try mod.getErrorValue(field_name)).key; return sema.addConstant( - try Module.simplePtrType(arena, child_type, false, .One), - try Value.Tag.ref_val.create( - arena, - try Value.Tag.@"error".create(arena, .{ - .name = name, - }), - ), + try child_type.copy(arena), + try Value.Tag.@"error".create(arena, .{ .name = name }), ); }, .Struct, .Opaque, .Union => { if (child_type.getNamespace()) |namespace| { - if (try sema.analyzeNamespaceLookup(block, src, namespace, field_name)) |inst| { - return inst; + if (try sema.namespaceLookupRef(block, src, namespace, field_name)) |inst| { + return sema.analyzeLoad(block, src, inst, src); } } // TODO add note: declared here @@ -6680,8 +7550,8 @@ fn namedFieldPtr( }, .Enum => { if (child_type.getNamespace()) |namespace| { - if (try sema.analyzeNamespaceLookup(block, src, namespace, field_name)) |inst| { - return inst; + if (try sema.namespaceLookupRef(block, src, namespace, field_name)) |inst| { + return sema.analyzeLoad(block, src, inst, src); } } const field_index = child_type.enumFieldIndex(field_name) orelse { @@ -6705,28 +7575,205 @@ fn namedFieldPtr( }; const field_index_u32 = @intCast(u32, field_index); const enum_val = try Value.Tag.enum_field_index.create(arena, field_index_u32); - return sema.addConstant( - try Module.simplePtrType(arena, child_type, false, .One), - try Value.Tag.ref_val.create(arena, enum_val), - ); + return sema.addConstant(try child_type.copy(arena), enum_val); }, else => return mod.fail(&block.base, src, "type '{}' has no members", .{child_type}), } }, - .Struct => return sema.analyzeStructFieldPtr(block, src, object_ptr, field_name, field_name_src, elem_ty), - .Union => return sema.analyzeUnionFieldPtr(block, src, object_ptr, field_name, field_name_src, elem_ty), + .Struct => return sema.structFieldVal(block, src, object, field_name, field_name_src, object_ty), + .Union => return sema.unionFieldVal(block, src, object, field_name, field_name_src, object_ty), else => {}, } - return mod.fail(&block.base, src, "type '{}' does not support field access", .{elem_ty}); + return mod.fail(&block.base, src, "type '{}' does not support field access", .{object_ty}); } -fn analyzeNamespaceLookup( +fn fieldPtr( + sema: *Sema, + block: *Scope.Block, + src: LazySrcLoc, + object_ptr: Air.Inst.Ref, + field_name: []const u8, + field_name_src: LazySrcLoc, +) CompileError!Air.Inst.Ref { + // When editing this function, note that there is corresponding logic to be edited + // in `fieldVal`. This function takes a pointer and returns a pointer. + + const mod = sema.mod; + const object_ptr_src = src; // TODO better source location + const object_ptr_ty = sema.typeOf(object_ptr); + const object_ty = switch (object_ptr_ty.zigTypeTag()) { + .Pointer => object_ptr_ty.elemType(), + else => return mod.fail(&block.base, object_ptr_src, "expected pointer, found '{}'", .{object_ptr_ty}), + }; + switch (object_ty.zigTypeTag()) { + .Array => { + if (mem.eql(u8, field_name, "len")) { + var anon_decl = try block.startAnonDecl(); + defer anon_decl.deinit(); + return sema.analyzeDeclRef(try anon_decl.finish( + Type.initTag(.comptime_int), + try Value.Tag.int_u64.create(anon_decl.arena(), object_ty.arrayLen()), + )); + } else { + return mod.fail( + &block.base, + field_name_src, + "no member named '{s}' in '{}'", + .{ field_name, object_ty }, + ); + } + }, + .Pointer => { + const ptr_child = object_ty.elemType(); + if (ptr_child.isSlice()) { + // Here for the ptr and len fields what we need to do is the situation + // when a temporary has its address taken, e.g. `&a[c..d].len`. + // This value may be known at compile-time or runtime. In the former + // case, it should create an anonymous Decl and return a decl_ref to it. + // In the latter case, it should add an `alloc` instruction, store + // the runtime value to it, and then return the `alloc`. + // In both cases the pointer should be const. + if (mem.eql(u8, field_name, "ptr")) { + return mod.fail( + &block.base, + field_name_src, + "TODO: implement reference to 'ptr' field of slice '{}'", + .{object_ty}, + ); + } else if (mem.eql(u8, field_name, "len")) { + return mod.fail( + &block.base, + field_name_src, + "TODO: implement reference to 'len' field of slice '{}'", + .{object_ty}, + ); + } else { + return mod.fail( + &block.base, + field_name_src, + "no member named '{s}' in '{}'", + .{ field_name, object_ty }, + ); + } + } else switch (ptr_child.zigTypeTag()) { + .Array => { + if (mem.eql(u8, field_name, "len")) { + var anon_decl = try block.startAnonDecl(); + defer anon_decl.deinit(); + return sema.analyzeDeclRef(try anon_decl.finish( + Type.initTag(.comptime_int), + try Value.Tag.int_u64.create(anon_decl.arena(), ptr_child.arrayLen()), + )); + } else { + return mod.fail( + &block.base, + field_name_src, + "no member named '{s}' in '{}'", + .{ field_name, object_ty }, + ); + } + }, + else => {}, + } + }, + .Type => { + _ = try sema.resolveConstValue(block, object_ptr_src, object_ptr); + const result = try sema.analyzeLoad(block, src, object_ptr, object_ptr_src); + const val = (sema.resolveDefinedValue(block, src, result) catch unreachable).?; + var to_type_buffer: Value.ToTypeBuffer = undefined; + const child_type = val.toType(&to_type_buffer); + switch (child_type.zigTypeTag()) { + .ErrorSet => { + // TODO resolve inferred error sets + const name: []const u8 = if (child_type.castTag(.error_set)) |payload| blk: { + const error_set = payload.data; + // TODO this is O(N). I'm putting off solving this until we solve inferred + // error sets at the same time. + const names = error_set.names_ptr[0..error_set.names_len]; + for (names) |name| { + if (mem.eql(u8, field_name, name)) { + break :blk name; + } + } + return mod.fail(&block.base, src, "no error named '{s}' in '{}'", .{ + field_name, child_type, + }); + } else (try mod.getErrorValue(field_name)).key; + + var anon_decl = try block.startAnonDecl(); + defer anon_decl.deinit(); + return sema.analyzeDeclRef(try anon_decl.finish( + try child_type.copy(anon_decl.arena()), + try Value.Tag.@"error".create(anon_decl.arena(), .{ .name = name }), + )); + }, + .Struct, .Opaque, .Union => { + if (child_type.getNamespace()) |namespace| { + if (try sema.namespaceLookupRef(block, src, namespace, field_name)) |inst| { + return inst; + } + } + // TODO add note: declared here + const kw_name = switch (child_type.zigTypeTag()) { + .Struct => "struct", + .Opaque => "opaque", + .Union => "union", + else => unreachable, + }; + return mod.fail(&block.base, src, "{s} '{}' has no member named '{s}'", .{ + kw_name, child_type, field_name, + }); + }, + .Enum => { + if (child_type.getNamespace()) |namespace| { + if (try sema.namespaceLookupRef(block, src, namespace, field_name)) |inst| { + return inst; + } + } + const field_index = child_type.enumFieldIndex(field_name) orelse { + const msg = msg: { + const msg = try mod.errMsg( + &block.base, + src, + "enum '{}' has no member named '{s}'", + .{ child_type, field_name }, + ); + errdefer msg.destroy(sema.gpa); + try mod.errNoteNonLazy( + child_type.declSrcLoc(), + msg, + "enum declared here", + .{}, + ); + break :msg msg; + }; + return mod.failWithOwnedErrorMsg(&block.base, msg); + }; + const field_index_u32 = @intCast(u32, field_index); + var anon_decl = try block.startAnonDecl(); + defer anon_decl.deinit(); + return sema.analyzeDeclRef(try anon_decl.finish( + try child_type.copy(anon_decl.arena()), + try Value.Tag.enum_field_index.create(anon_decl.arena(), field_index_u32), + )); + }, + else => return mod.fail(&block.base, src, "type '{}' has no members", .{child_type}), + } + }, + .Struct => return sema.structFieldPtr(block, src, object_ptr, field_name, field_name_src, object_ty), + .Union => return sema.unionFieldPtr(block, src, object_ptr, field_name, field_name_src, object_ty), + else => {}, + } + return mod.fail(&block.base, src, "type '{}' does not support field access", .{object_ty}); +} + +fn namespaceLookup( sema: *Sema, block: *Scope.Block, src: LazySrcLoc, namespace: *Scope.Namespace, decl_name: []const u8, -) CompileError!?Air.Inst.Ref { +) CompileError!?*Decl { const mod = sema.mod; const gpa = sema.gpa; if (try sema.lookupInNamespace(namespace, decl_name)) |decl| { @@ -6741,12 +7788,23 @@ fn analyzeNamespaceLookup( }; return mod.failWithOwnedErrorMsg(&block.base, msg); } - return try sema.analyzeDeclRef(block, src, decl); + return decl; } return null; } -fn analyzeStructFieldPtr( +fn namespaceLookupRef( + sema: *Sema, + block: *Scope.Block, + src: LazySrcLoc, + namespace: *Scope.Namespace, + decl_name: []const u8, +) CompileError!?Air.Inst.Ref { + const decl = (try sema.namespaceLookup(block, src, namespace, decl_name)) orelse return null; + return try sema.analyzeDeclRef(decl); +} + +fn structFieldPtr( sema: *Sema, block: *Scope.Block, src: LazySrcLoc, @@ -6782,14 +7840,52 @@ fn analyzeStructFieldPtr( .data = .{ .ty_pl = .{ .ty = try sema.addType(ptr_field_ty), .payload = try sema.addExtra(Air.StructField{ - .struct_ptr = struct_ptr, + .struct_operand = struct_ptr, .field_index = @intCast(u32, field_index), }), } }, }); } -fn analyzeUnionFieldPtr( +fn structFieldVal( + sema: *Sema, + block: *Scope.Block, + src: LazySrcLoc, + struct_byval: Air.Inst.Ref, + field_name: []const u8, + field_name_src: LazySrcLoc, + unresolved_struct_ty: Type, +) CompileError!Air.Inst.Ref { + assert(unresolved_struct_ty.zigTypeTag() == .Struct); + + const struct_ty = try sema.resolveTypeFields(block, src, unresolved_struct_ty); + const struct_obj = struct_ty.castTag(.@"struct").?.data; + + const field_index = struct_obj.fields.getIndex(field_name) orelse + return sema.failWithBadFieldAccess(block, struct_obj, field_name_src, field_name); + const field = struct_obj.fields.values()[field_index]; + + if (try sema.resolveMaybeUndefVal(block, src, struct_byval)) |struct_val| { + if (struct_val.isUndef()) return sema.addConstUndef(field.ty); + + const field_values = struct_val.castTag(.@"struct").?.data; + return sema.addConstant(field.ty, field_values[field_index]); + } + + try sema.requireRuntimeBlock(block, src); + return block.addInst(.{ + .tag = .struct_field_val, + .data = .{ .ty_pl = .{ + .ty = try sema.addType(field.ty), + .payload = try sema.addExtra(Air.StructField{ + .struct_operand = struct_byval, + .field_index = @intCast(u32, field_index), + }), + } }, + }); +} + +fn unionFieldPtr( sema: *Sema, block: *Scope.Block, src: LazySrcLoc, @@ -6826,6 +7922,37 @@ fn analyzeUnionFieldPtr( return mod.fail(&block.base, src, "TODO implement runtime union field access", .{}); } +fn unionFieldVal( + sema: *Sema, + block: *Scope.Block, + src: LazySrcLoc, + union_byval: Air.Inst.Ref, + field_name: []const u8, + field_name_src: LazySrcLoc, + unresolved_union_ty: Type, +) CompileError!Air.Inst.Ref { + assert(unresolved_union_ty.zigTypeTag() == .Union); + + const union_ty = try sema.resolveTypeFields(block, src, unresolved_union_ty); + const union_obj = union_ty.cast(Type.Payload.Union).?.data; + + const field_index = union_obj.fields.getIndex(field_name) orelse + return sema.failWithBadUnionFieldAccess(block, union_obj, field_name_src, field_name); + + const field = union_obj.fields.values()[field_index]; + + if (try sema.resolveMaybeUndefVal(block, src, union_byval)) |union_val| { + if (union_val.isUndef()) return sema.addConstUndef(field.ty); + + // TODO detect inactive union field and emit compile error + const active_val = union_val.castTag(.@"union").?.data.val; + return sema.addConstant(field.ty, active_val); + } + + try sema.requireRuntimeBlock(block, src); + return sema.mod.fail(&block.base, src, "TODO implement runtime union field access", .{}); +} + fn elemPtr( sema: *Sema, block: *Scope.Block, @@ -6865,38 +7992,83 @@ fn elemVal( ) CompileError!Air.Inst.Ref { const array_ptr_src = src; // TODO better source location const maybe_ptr_ty = sema.typeOf(array_maybe_ptr); - if (maybe_ptr_ty.isSinglePointer()) { - const indexable_ty = maybe_ptr_ty.elemType(); - if (indexable_ty.isSlice()) { - // We have a pointer to a slice and we want an element value. - if (try sema.isComptimeKnown(block, src, array_maybe_ptr)) { - const slice = try sema.analyzeLoad(block, src, array_maybe_ptr, array_ptr_src); - if (try sema.resolveDefinedValue(block, src, slice)) |slice_val| { + switch (maybe_ptr_ty.zigTypeTag()) { + .Pointer => switch (maybe_ptr_ty.ptrSize()) { + .Slice => { + if (try sema.resolveDefinedValue(block, src, array_maybe_ptr)) |slice_val| { _ = slice_val; return sema.mod.fail(&block.base, src, "TODO implement Sema for elemVal for comptime known slice", .{}); } try sema.requireRuntimeBlock(block, src); - return block.addBinOp(.slice_elem_val, slice, elem_index); - } - try sema.requireRuntimeBlock(block, src); - return block.addBinOp(.ptr_slice_elem_val, array_maybe_ptr, elem_index); - } + return block.addBinOp(.slice_elem_val, array_maybe_ptr, elem_index); + }, + .Many, .C => { + if (try sema.resolveDefinedValue(block, src, array_maybe_ptr)) |ptr_val| { + _ = ptr_val; + return sema.mod.fail(&block.base, src, "TODO implement Sema for elemVal for comptime known pointer", .{}); + } + try sema.requireRuntimeBlock(block, src); + return block.addBinOp(.ptr_elem_val, array_maybe_ptr, elem_index); + }, + .One => { + const indexable_ty = maybe_ptr_ty.elemType(); + switch (indexable_ty.zigTypeTag()) { + .Pointer => switch (indexable_ty.ptrSize()) { + .Slice => { + // We have a pointer to a slice and we want an element value. + if (try sema.isComptimeKnown(block, src, array_maybe_ptr)) { + const slice = try sema.analyzeLoad(block, src, array_maybe_ptr, array_ptr_src); + if (try sema.resolveDefinedValue(block, src, slice)) |slice_val| { + _ = slice_val; + return sema.mod.fail(&block.base, src, "TODO implement Sema for elemVal for comptime known slice", .{}); + } + try sema.requireRuntimeBlock(block, src); + return block.addBinOp(.slice_elem_val, slice, elem_index); + } + try sema.requireRuntimeBlock(block, src); + return block.addBinOp(.ptr_slice_elem_val, array_maybe_ptr, elem_index); + }, + .Many, .C => { + // We have a pointer to a pointer and we want an element value. + if (try sema.isComptimeKnown(block, src, array_maybe_ptr)) { + const ptr = try sema.analyzeLoad(block, src, array_maybe_ptr, array_ptr_src); + if (try sema.resolveDefinedValue(block, src, ptr)) |ptr_val| { + _ = ptr_val; + return sema.mod.fail(&block.base, src, "TODO implement Sema for elemVal for comptime known pointer", .{}); + } + try sema.requireRuntimeBlock(block, src); + return block.addBinOp(.ptr_elem_val, ptr, elem_index); + } + try sema.requireRuntimeBlock(block, src); + return block.addBinOp(.ptr_ptr_elem_val, array_maybe_ptr, elem_index); + }, + .One => return sema.mod.fail( + &block.base, + array_ptr_src, + "expected pointer, found '{}'", + .{indexable_ty.elemType()}, + ), + }, + .Array => { + const ptr = try sema.elemPtr(block, src, array_maybe_ptr, elem_index, elem_index_src); + return sema.analyzeLoad(block, src, ptr, elem_index_src); + }, + else => return sema.mod.fail( + &block.base, + array_ptr_src, + "expected pointer, found '{}'", + .{indexable_ty}, + ), + } + }, + }, + else => return sema.mod.fail( + &block.base, + array_ptr_src, + "expected pointer, found '{}'", + .{maybe_ptr_ty}, + ), } - if (maybe_ptr_ty.isSlice()) { - if (try sema.resolveDefinedValue(block, src, array_maybe_ptr)) |slice_val| { - _ = slice_val; - return sema.mod.fail(&block.base, src, "TODO implement Sema for elemVal for comptime known slice", .{}); - } - try sema.requireRuntimeBlock(block, src); - return block.addBinOp(.slice_elem_val, array_maybe_ptr, elem_index); - } - - const array_ptr = if (maybe_ptr_ty.zigTypeTag() == .Pointer) - array_maybe_ptr - else - try sema.analyzeRef(block, src, array_maybe_ptr); - const ptr = try sema.elemPtr(block, src, array_ptr, elem_index, elem_index_src); - return sema.analyzeLoad(block, src, ptr, elem_index_src); } fn elemPtrArray( @@ -6930,13 +8102,17 @@ fn elemPtrArray( fn coerce( sema: *Sema, block: *Scope.Block, - dest_type: Type, + dest_type_unresolved: Type, inst: Air.Inst.Ref, inst_src: LazySrcLoc, ) CompileError!Air.Inst.Ref { - if (dest_type.tag() == .var_args_param) { - return sema.coerceVarArgParam(block, inst, inst_src); + switch (dest_type_unresolved.tag()) { + .var_args_param => return sema.coerceVarArgParam(block, inst, inst_src), + .generic_poison => return inst, + else => {}, } + const dest_type_src = inst_src; // TODO better source location + const dest_type = try sema.resolveTypeFields(block, dest_type_src, dest_type_unresolved); const inst_ty = sema.typeOf(inst); // If the types are the same, we can return the operand. @@ -6952,7 +8128,7 @@ fn coerce( const arena = sema.arena; // undefined to anything - if (try sema.resolvePossiblyUndefinedValue(block, inst_src, inst)) |val| { + if (try sema.resolveMaybeUndefVal(block, inst_src, inst)) |val| { if (val.isUndef() or inst_ty.zigTypeTag() == .Undefined) { return sema.addConstant(dest_type, val); } @@ -7009,17 +8185,15 @@ fn coerce( .Many => { // *[N]T to [*]T // *[N:s]T to [*:s]T - const src_sentinel = array_type.sentinel(); - const dst_sentinel = dest_type.sentinel(); - if (src_sentinel == null and dst_sentinel == null) - return sema.coerceArrayPtrToMany(block, dest_type, inst, inst_src); - - if (src_sentinel) |src_s| { - if (dst_sentinel) |dst_s| { - if (src_s.eql(dst_s)) { + // *[N:s]T to [*]T + if (dest_type.sentinel()) |dst_sentinel| { + if (array_type.sentinel()) |src_sentinel| { + if (src_sentinel.eql(dst_sentinel, dst_elem_type)) { return sema.coerceArrayPtrToMany(block, dest_type, inst, inst_src); } } + } else { + return sema.coerceArrayPtrToMany(block, dest_type, inst, inst_src); } }, .One => {}, @@ -7138,7 +8312,7 @@ fn coerceNum( } } else if (dst_zig_tag == .ComptimeFloat or dst_zig_tag == .Float) { if (src_zig_tag == .Float or src_zig_tag == .ComptimeFloat) { - const res = val.floatCast(sema.arena, dest_type, target) catch |err| switch (err) { + const res = val.floatCast(sema.arena, dest_type) catch |err| switch (err) { error.Overflow => return sema.mod.fail( &block.base, inst_src, @@ -7186,37 +8360,45 @@ fn storePtr( if ((try sema.typeHasOnePossibleValue(block, src, elem_ty)) != null) return; - if (try sema.resolvePossiblyUndefinedValue(block, src, ptr)) |ptr_val| blk: { - const const_val = (try sema.resolvePossiblyUndefinedValue(block, src, value)) orelse - return sema.mod.fail(&block.base, src, "cannot store runtime value in compile time variable", .{}); + if (try sema.resolveDefinedValue(block, src, ptr)) |ptr_val| { + if (ptr_val.castTag(.decl_ref_mut)) |decl_ref_mut| { + const const_val = (try sema.resolveMaybeUndefVal(block, src, value)) orelse + return sema.mod.fail(&block.base, src, "cannot store runtime value in compile time variable", .{}); - if (ptr_val.tag() == .int_u64) - break :blk; // propogate it down to runtime - - const comptime_alloc = ptr_val.castTag(.comptime_alloc).?; - if (comptime_alloc.data.runtime_index < block.runtime_index) { - if (block.runtime_cond) |cond_src| { - const msg = msg: { - const msg = try sema.mod.errMsg(&block.base, src, "store to comptime variable depends on runtime condition", .{}); - errdefer msg.destroy(sema.gpa); - try sema.mod.errNote(&block.base, cond_src, msg, "runtime condition here", .{}); - break :msg msg; - }; - return sema.mod.failWithOwnedErrorMsg(&block.base, msg); + if (decl_ref_mut.data.runtime_index < block.runtime_index) { + if (block.runtime_cond) |cond_src| { + const msg = msg: { + const msg = try sema.mod.errMsg(&block.base, src, "store to comptime variable depends on runtime condition", .{}); + errdefer msg.destroy(sema.gpa); + try sema.mod.errNote(&block.base, cond_src, msg, "runtime condition here", .{}); + break :msg msg; + }; + return sema.mod.failWithOwnedErrorMsg(&block.base, msg); + } + if (block.runtime_loop) |loop_src| { + const msg = msg: { + const msg = try sema.mod.errMsg(&block.base, src, "cannot store to comptime variable in non-inline loop", .{}); + errdefer msg.destroy(sema.gpa); + try sema.mod.errNote(&block.base, loop_src, msg, "non-inline loop here", .{}); + break :msg msg; + }; + return sema.mod.failWithOwnedErrorMsg(&block.base, msg); + } + unreachable; } - if (block.runtime_loop) |loop_src| { - const msg = msg: { - const msg = try sema.mod.errMsg(&block.base, src, "cannot store to comptime variable in non-inline loop", .{}); - errdefer msg.destroy(sema.gpa); - try sema.mod.errNote(&block.base, loop_src, msg, "non-inline loop here", .{}); - break :msg msg; - }; - return sema.mod.failWithOwnedErrorMsg(&block.base, msg); - } - unreachable; + var new_arena = std.heap.ArenaAllocator.init(sema.gpa); + errdefer new_arena.deinit(); + const new_ty = try elem_ty.copy(&new_arena.allocator); + const new_val = try const_val.copy(&new_arena.allocator); + const decl = decl_ref_mut.data.decl; + var old_arena = decl.value_arena.?.promote(sema.gpa); + decl.value_arena = null; + try decl.finalizeNewArena(&new_arena); + decl.ty = new_ty; + decl.val = new_val; + old_arena.deinit(); + return; } - comptime_alloc.data.val = const_val; - return; } // TODO handle if the element type requires comptime @@ -7231,7 +8413,7 @@ fn bitcast( inst: Air.Inst.Ref, inst_src: LazySrcLoc, ) CompileError!Air.Inst.Ref { - if (try sema.resolvePossiblyUndefinedValue(block, inst_src, inst)) |val| { + if (try sema.resolveMaybeUndefVal(block, inst_src, inst)) |val| { // Keep the comptime Value representation; take the new type. return sema.addConstant(dest_type, val); } @@ -7277,21 +8459,21 @@ fn analyzeDeclVal( if (sema.decl_val_table.get(decl)) |result| { return result; } - const decl_ref = try sema.analyzeDeclRef(block, src, decl); + const decl_ref = try sema.analyzeDeclRef(decl); const result = try sema.analyzeLoad(block, src, decl_ref, src); if (Air.refToIndex(result)) |index| { if (sema.air_instructions.items(.tag)[index] == .constant) { - sema.decl_val_table.put(sema.gpa, decl, result) catch {}; + try sema.decl_val_table.put(sema.gpa, decl, result); } } return result; } -fn analyzeDeclRef(sema: *Sema, block: *Scope.Block, src: LazySrcLoc, decl: *Decl) CompileError!Air.Inst.Ref { +fn analyzeDeclRef(sema: *Sema, decl: *Decl) CompileError!Air.Inst.Ref { try sema.mod.declareDeclDependency(sema.owner_decl, decl); sema.mod.ensureDeclAnalyzed(decl) catch |err| { - if (sema.func) |func| { - func.state = .dependency_failure; + if (sema.owner_func) |owner_func| { + owner_func.state = .dependency_failure; } else { sema.owner_decl.analysis = .dependency_failure; } @@ -7299,8 +8481,10 @@ fn analyzeDeclRef(sema: *Sema, block: *Scope.Block, src: LazySrcLoc, decl: *Decl }; const decl_tv = try decl.typedValue(); - if (decl_tv.val.tag() == .variable) { - return sema.analyzeVarRef(block, src, decl_tv); + if (decl_tv.val.castTag(.variable)) |payload| { + const variable = payload.data; + const ty = try Module.simplePtrType(sema.arena, decl_tv.ty, variable.is_mutable, .One); + return sema.addConstant(ty, try Value.Tag.decl_ref.create(sema.arena, decl)); } return sema.addConstant( try Module.simplePtrType(sema.arena, decl_tv.ty, false, .One), @@ -7308,26 +8492,6 @@ fn analyzeDeclRef(sema: *Sema, block: *Scope.Block, src: LazySrcLoc, decl: *Decl ); } -fn analyzeVarRef(sema: *Sema, block: *Scope.Block, src: LazySrcLoc, tv: TypedValue) CompileError!Air.Inst.Ref { - const variable = tv.val.castTag(.variable).?.data; - - const ty = try Module.simplePtrType(sema.arena, tv.ty, variable.is_mutable, .One); - if (!variable.is_mutable and !variable.is_extern) { - return sema.addConstant(ty, try Value.Tag.ref_val.create(sema.arena, variable.init)); - } - - const gpa = sema.gpa; - try sema.requireRuntimeBlock(block, src); - try sema.air_variables.append(gpa, variable); - return block.addInst(.{ - .tag = .varptr, - .data = .{ .ty_pl = .{ - .ty = try sema.addType(ty), - .payload = @intCast(u32, sema.air_variables.items.len - 1), - } }, - }); -} - fn analyzeRef( sema: *Sema, block: *Scope.Block, @@ -7335,14 +8499,21 @@ fn analyzeRef( operand: Air.Inst.Ref, ) CompileError!Air.Inst.Ref { const operand_ty = sema.typeOf(operand); - const ptr_type = try Module.simplePtrType(sema.arena, operand_ty, false, .One); - if (try sema.resolvePossiblyUndefinedValue(block, src, operand)) |val| { - return sema.addConstant(ptr_type, try Value.Tag.ref_val.create(sema.arena, val)); + if (try sema.resolveMaybeUndefVal(block, src, operand)) |val| { + var anon_decl = try block.startAnonDecl(); + defer anon_decl.deinit(); + return sema.analyzeDeclRef(try anon_decl.finish( + operand_ty, + try val.copy(anon_decl.arena()), + )); } try sema.requireRuntimeBlock(block, src); - return block.addTyOp(.ref, ptr_type, operand); + const ptr_type = try Module.simplePtrType(sema.arena, operand_ty, false, .One); + const alloc = try block.addTy(.alloc, ptr_type); + try sema.storePtr(block, src, alloc, operand); + return alloc; } fn analyzeLoad( @@ -7357,11 +8528,10 @@ fn analyzeLoad( .Pointer => ptr_ty.elemType(), else => return sema.mod.fail(&block.base, ptr_src, "expected pointer, found '{}'", .{ptr_ty}), }; - if (try sema.resolveDefinedValue(block, ptr_src, ptr)) |ptr_val| blk: { - if (ptr_val.tag() == .int_u64) - break :blk; // do it at runtime - - return sema.addConstant(elem_ty, try ptr_val.pointerDeref(sema.arena)); + if (try sema.resolveDefinedValue(block, ptr_src, ptr)) |ptr_val| { + if (try ptr_val.pointerDeref(sema.arena)) |elem_val| { + return sema.addConstant(elem_ty, elem_val); + } } try sema.requireRuntimeBlock(block, src); @@ -7374,7 +8544,7 @@ fn analyzeSliceLen( src: LazySrcLoc, slice_inst: Air.Inst.Ref, ) CompileError!Air.Inst.Ref { - if (try sema.resolvePossiblyUndefinedValue(block, src, slice_inst)) |slice_val| { + if (try sema.resolveMaybeUndefVal(block, src, slice_inst)) |slice_val| { if (slice_val.isUndef()) { return sema.addConstUndef(Type.initTag(.usize)); } @@ -7392,7 +8562,7 @@ fn analyzeIsNull( invert_logic: bool, ) CompileError!Air.Inst.Ref { const result_ty = Type.initTag(.bool); - if (try sema.resolvePossiblyUndefinedValue(block, src, operand)) |opt_val| { + if (try sema.resolveMaybeUndefVal(block, src, operand)) |opt_val| { if (opt_val.isUndef()) { return sema.addConstUndef(result_ty); } @@ -7421,7 +8591,7 @@ fn analyzeIsNonErr( if (ot == .ErrorSet) return Air.Inst.Ref.bool_false; assert(ot == .ErrorUnion); const result_ty = Type.initTag(.bool); - if (try sema.resolvePossiblyUndefinedValue(block, src, operand)) |err_union| { + if (try sema.resolveMaybeUndefVal(block, src, operand)) |err_union| { if (err_union.isUndef()) { return sema.addConstUndef(result_ty); } @@ -7489,12 +8659,12 @@ fn analyzeSlice( array_type.sentinel() else slice_sentinel; - return_elem_type = try sema.mod.arrayType(sema.arena, len, array_sentinel, elem_type); + return_elem_type = try Module.arrayType(sema.arena, len, array_sentinel, elem_type); return_ptr_size = .One; } } } - const return_type = try sema.mod.ptrType( + const return_type = try Module.ptrType( sema.arena, return_elem_type, if (end_opt == .none) slice_sentinel else null, @@ -7534,39 +8704,42 @@ fn cmpNumeric( if (lhs_ty_tag == .Vector and rhs_ty_tag == .Vector) { if (lhs_ty.arrayLen() != rhs_ty.arrayLen()) { return sema.mod.fail(&block.base, src, "vector length mismatch: {d} and {d}", .{ - lhs_ty.arrayLen(), - rhs_ty.arrayLen(), + lhs_ty.arrayLen(), rhs_ty.arrayLen(), }); } return sema.mod.fail(&block.base, src, "TODO implement support for vectors in cmpNumeric", .{}); } else if (lhs_ty_tag == .Vector or rhs_ty_tag == .Vector) { return sema.mod.fail(&block.base, src, "mixed scalar and vector operands to comparison operator: '{}' and '{}'", .{ - lhs_ty, - rhs_ty, + lhs_ty, rhs_ty, }); } - if (try sema.resolvePossiblyUndefinedValue(block, lhs_src, lhs)) |lhs_val| { - if (try sema.resolvePossiblyUndefinedValue(block, rhs_src, rhs)) |rhs_val| { - if (lhs_val.isUndef() or rhs_val.isUndef()) { - return sema.addConstUndef(Type.initTag(.bool)); - } - if (Value.compare(lhs_val, op, rhs_val)) { - return Air.Inst.Ref.bool_true; + const runtime_src: LazySrcLoc = src: { + if (try sema.resolveMaybeUndefVal(block, lhs_src, lhs)) |lhs_val| { + if (try sema.resolveMaybeUndefVal(block, rhs_src, rhs)) |rhs_val| { + if (lhs_val.isUndef() or rhs_val.isUndef()) { + return sema.addConstUndef(Type.initTag(.bool)); + } + if (Value.compareHetero(lhs_val, op, rhs_val)) { + return Air.Inst.Ref.bool_true; + } else { + return Air.Inst.Ref.bool_false; + } } else { - return Air.Inst.Ref.bool_false; + break :src rhs_src; } + } else { + break :src lhs_src; } - } + }; // TODO handle comparisons against lazy zero values // Some values can be compared against zero without being runtime known or without forcing // a full resolution of their value, for example `@sizeOf(@Frame(function))` is known to // always be nonzero, and we benefit from not forcing the full evaluation and stack frame layout // of this function if we don't need to. + try sema.requireRuntimeBlock(block, runtime_src); - // It must be a runtime comparison. - try sema.requireRuntimeBlock(block, src); // For floats, emit a float comparison instruction. const lhs_is_float = switch (lhs_ty_tag) { .Float, .ComptimeFloat => true, @@ -7614,7 +8787,7 @@ fn cmpNumeric( var dest_float_type: ?Type = null; var lhs_bits: usize = undefined; - if (try sema.resolvePossiblyUndefinedValue(block, lhs_src, lhs)) |lhs_val| { + if (try sema.resolveMaybeUndefVal(block, lhs_src, lhs)) |lhs_val| { if (lhs_val.isUndef()) return sema.addConstUndef(Type.initTag(.bool)); const is_unsigned = if (lhs_is_float) x: { @@ -7649,7 +8822,7 @@ fn cmpNumeric( } var rhs_bits: usize = undefined; - if (try sema.resolvePossiblyUndefinedValue(block, rhs_src, rhs)) |rhs_val| { + if (try sema.resolveMaybeUndefVal(block, rhs_src, rhs)) |rhs_val| { if (rhs_val.isUndef()) return sema.addConstUndef(Type.initTag(.bool)); const is_unsigned = if (rhs_is_float) x: { @@ -7704,7 +8877,7 @@ fn wrapOptional( inst: Air.Inst.Ref, inst_src: LazySrcLoc, ) !Air.Inst.Ref { - if (try sema.resolvePossiblyUndefinedValue(block, inst_src, inst)) |val| { + if (try sema.resolveMaybeUndefVal(block, inst_src, inst)) |val| { return sema.addConstant(dest_type, val); } @@ -7722,10 +8895,12 @@ fn wrapErrorUnion( const inst_ty = sema.typeOf(inst); const dest_err_set_ty = dest_type.errorUnionSet(); const dest_payload_ty = dest_type.errorUnionPayload(); - if (try sema.resolvePossiblyUndefinedValue(block, inst_src, inst)) |val| { + if (try sema.resolveMaybeUndefVal(block, inst_src, inst)) |val| { if (inst_ty.zigTypeTag() != .ErrorSet) { _ = try sema.coerce(block, dest_payload_ty, inst, inst_src); - } else switch (dest_err_set_ty.tag()) { + return sema.addConstant(dest_type, try Value.Tag.eu_payload.create(sema.arena, val)); + } + switch (dest_err_set_ty.tag()) { .anyerror => {}, .error_set_single => { const expected_name = val.castTag(.@"error").?.data.name; @@ -7771,9 +8946,7 @@ fn wrapErrorUnion( }, else => unreachable, } - - // Create a SubValue for the error_union payload. - return sema.addConstant(dest_type, try Value.Tag.error_union.create(sema.arena, val)); + return sema.addConstant(dest_type, val); } try sema.requireRuntimeBlock(block, inst_src); @@ -7869,6 +9042,36 @@ fn resolvePeerTypes( return sema.typeOf(chosen); } +pub fn resolveTypeLayout( + sema: *Sema, + block: *Scope.Block, + src: LazySrcLoc, + ty: Type, +) CompileError!void { + switch (ty.zigTypeTag()) { + .Pointer => { + return sema.resolveTypeLayout(block, src, ty.elemType()); + }, + .Struct => { + const resolved_ty = try sema.resolveTypeFields(block, src, ty); + const struct_obj = resolved_ty.castTag(.@"struct").?.data; + switch (struct_obj.status) { + .none, .have_field_types => {}, + .field_types_wip, .layout_wip => { + return sema.mod.fail(&block.base, src, "struct {} depends on itself", .{ty}); + }, + .have_layout => return, + } + struct_obj.status = .layout_wip; + for (struct_obj.fields.values()) |field| { + try sema.resolveTypeLayout(block, src, field.ty); + } + struct_obj.status = .have_layout; + }, + else => {}, + } +} + fn resolveTypeFields(sema: *Sema, block: *Scope.Block, src: LazySrcLoc, ty: Type) CompileError!Type { switch (ty.tag()) { .@"struct" => { @@ -7876,9 +9079,7 @@ fn resolveTypeFields(sema: *Sema, block: *Scope.Block, src: LazySrcLoc, ty: Type switch (struct_obj.status) { .none => {}, .field_types_wip => { - return sema.mod.fail(&block.base, src, "struct {} depends on itself", .{ - ty, - }); + return sema.mod.fail(&block.base, src, "struct {} depends on itself", .{ty}); }, .have_field_types, .have_layout, .layout_wip => return ty, } @@ -7935,7 +9136,7 @@ fn getBuiltin( const mod = sema.mod; const std_pkg = mod.main_pkg.table.get("std").?; const std_file = (mod.importPkg(std_pkg) catch unreachable).file; - const opt_builtin_inst = try sema.analyzeNamespaceLookup( + const opt_builtin_inst = try sema.namespaceLookupRef( block, src, std_file.root_decl.?.namespace, @@ -7943,7 +9144,7 @@ fn getBuiltin( ); const builtin_inst = try sema.analyzeLoad(block, src, opt_builtin_inst.?, src); const builtin_ty = try sema.analyzeAsType(block, src, builtin_inst); - const opt_ty_inst = try sema.analyzeNamespaceLookup( + const opt_ty_inst = try sema.namespaceLookupRef( block, src, builtin_ty.getNamespace().?, @@ -7981,6 +9182,7 @@ fn typeHasOnePossibleValue( .c_longdouble, .comptime_int, .comptime_float, + .u1, .u8, .i8, .u16, @@ -8106,6 +9308,7 @@ fn typeHasOnePossibleValue( .inferred_alloc_const => unreachable, .inferred_alloc_mut => unreachable, + .generic_poison => return error.GenericPoison, }; } @@ -8169,12 +9372,12 @@ fn getTmpAir(sema: Sema) Air { .instructions = sema.air_instructions.slice(), .extra = sema.air_extra.items, .values = sema.air_values.items, - .variables = sema.air_variables.items, }; } pub fn addType(sema: *Sema, ty: Type) !Air.Inst.Ref { switch (ty.tag()) { + .u1 => return .u1_type, .u8 => return .u8_type, .i8 => return .i8_type, .u16 => return .u16_type, @@ -8228,6 +9431,8 @@ pub fn addType(sema: *Sema, ty: Type) !Air.Inst.Ref { .fn_ccc_void_no_args => return .fn_ccc_void_no_args_type, .single_const_pointer_to_comptime_int => return .single_const_pointer_to_comptime_int_type, .const_slice_u8 => return .const_slice_u8_type, + .anyerror_void_error_union => return .anyerror_void_error_union_type, + .generic_poison => return .generic_poison_type, else => {}, } try sema.air_instructions.append(sema.gpa, .{ @@ -8245,7 +9450,7 @@ fn addConstUndef(sema: *Sema, ty: Type) CompileError!Air.Inst.Ref { return sema.addConstant(ty, Value.initTag(.undef)); } -fn addConstant(sema: *Sema, ty: Type, val: Value) CompileError!Air.Inst.Ref { +pub fn addConstant(sema: *Sema, ty: Type, val: Value) SemaError!Air.Inst.Ref { const gpa = sema.gpa; const ty_inst = try sema.addType(ty); try sema.air_values.append(gpa, val); @@ -8299,5 +9504,27 @@ fn isComptimeKnown( src: LazySrcLoc, inst: Air.Inst.Ref, ) !bool { - return (try sema.resolvePossiblyUndefinedValue(block, src, inst)) != null; + return (try sema.resolveMaybeUndefVal(block, src, inst)) != null; +} + +fn analyzeComptimeAlloc( + sema: *Sema, + block: *Scope.Block, + var_type: Type, +) CompileError!Air.Inst.Ref { + const ptr_type = try Module.simplePtrType(sema.arena, var_type, true, .One); + + var anon_decl = try block.startAnonDecl(); + defer anon_decl.deinit(); + const decl = try anon_decl.finish( + try var_type.copy(anon_decl.arena()), + // AstGen guarantees there will be a store before the first load, so we put a value + // here indicating there is no valid value. + Value.initTag(.unreachable_value), + ); + try sema.mod.declareDeclDependency(sema.owner_decl, decl); + return sema.addConstant(ptr_type, try Value.Tag.decl_ref_mut.create(sema.arena, .{ + .runtime_index = block.runtime_index, + .decl = decl, + })); } diff --git a/src/Zir.zig b/src/Zir.zig index 00f66ef507..1aed609de9 100644 --- a/src/Zir.zig +++ b/src/Zir.zig @@ -61,7 +61,7 @@ pub const ExtraIndex = enum(u32) { _, }; -pub fn getMainStruct(zir: Zir) Zir.Inst.Index { +pub fn getMainStruct(zir: Zir) Inst.Index { return zir.extra[@enumToInt(ExtraIndex.main_struct)] - @intCast(u32, Inst.Ref.typed_value_map.len); } @@ -173,11 +173,22 @@ pub const Inst = struct { /// Twos complement wrapping integer addition. /// Uses the `pl_node` union field. Payload is `Bin`. addwrap, - /// Declares a parameter of the current function. Used for debug info and - /// for checking shadowing against declarations in the current namespace. - /// Uses the `str_tok` field. Token is the parameter name, string is the - /// parameter name. - arg, + /// Declares a parameter of the current function. Used for: + /// * debug info + /// * checking shadowing against declarations in the current namespace + /// * parameter type expressions referencing other parameters + /// These occur in the block outside a function body (the same block as + /// contains the func instruction). + /// Uses the `pl_tok` field. Token is the parameter name, payload is a `Param`. + param, + /// Same as `param` except the parameter is marked comptime. + param_comptime, + /// Same as `param` except the parameter is marked anytype. + /// Uses the `str_tok` field. Token is the parameter name. String is the parameter name. + param_anytype, + /// Same as `param` except the parameter is marked both comptime and anytype. + /// Uses the `str_tok` field. Token is the parameter name. String is the parameter name. + param_anytype_comptime, /// Array concatenation. `a ++ b` /// Uses the `pl_node` union field. Payload is `Bin`. array_cat, @@ -454,6 +465,11 @@ pub const Inst = struct { /// Uses the `un_node` union field. ret_node, /// Sends control flow back to the function's callee. + /// The operand is a `ret_ptr` instruction, where the return value can be found. + /// Includes an AST node source location. + /// Uses the `un_node` union field. + ret_load, + /// Sends control flow back to the function's callee. /// Includes an operand as the return value. /// Includes a token source location. /// Uses the `un_tok` union field. @@ -890,6 +906,9 @@ pub const Inst = struct { /// Implements the `@shuffle` builtin. /// Uses the `pl_node` union field with payload `Shuffle`. shuffle, + /// Implements the `@select` builtin. + /// Uses the `pl_node` union field with payload `Select`. + select, /// Implements the `@atomicLoad` builtin. /// Uses the `pl_node` union field with payload `Bin`. atomic_load, @@ -912,12 +931,18 @@ pub const Inst = struct { /// Implements the `@fieldParentPtr` builtin. /// Uses the `pl_node` union field with payload `FieldParentPtr`. field_parent_ptr, + /// Implements the `@maximum` builtin. + /// Uses the `pl_node` union field with payload `Bin` + maximum, /// Implements the `@memcpy` builtin. /// Uses the `pl_node` union field with payload `Memcpy`. memcpy, /// Implements the `@memset` builtin. /// Uses the `pl_node` union field with payload `Memset`. memset, + /// Implements the `@minimum` builtin. + /// Uses the `pl_node` union field with payload `Bin` + minimum, /// Implements the `@asyncCall` builtin. /// Uses the `pl_node` union field with payload `AsyncCall`. builtin_async_call, @@ -962,7 +987,10 @@ pub const Inst = struct { /// Function calls do not count. pub fn isNoReturn(tag: Tag) bool { return switch (tag) { - .arg, + .param, + .param_comptime, + .param_anytype, + .param_anytype_comptime, .add, .addwrap, .alloc, @@ -1181,6 +1209,7 @@ pub const Inst = struct { .splat, .reduce, .shuffle, + .select, .atomic_load, .atomic_rmw, .atomic_store, @@ -1188,8 +1217,10 @@ pub const Inst = struct { .builtin_call, .field_ptr_type, .field_parent_ptr, + .maximum, .memcpy, .memset, + .minimum, .builtin_async_call, .c_import, .@"resume", @@ -1205,6 +1236,7 @@ pub const Inst = struct { .condbr_inline, .compile_error, .ret_node, + .ret_load, .ret_coerce, .ret_err_value, .@"unreachable", @@ -1221,7 +1253,10 @@ pub const Inst = struct { break :list std.enums.directEnumArray(Tag, Data.FieldEnum, 0, .{ .add = .pl_node, .addwrap = .pl_node, - .arg = .str_tok, + .param = .pl_tok, + .param_comptime = .pl_tok, + .param_anytype = .str_tok, + .param_anytype_comptime = .str_tok, .array_cat = .pl_node, .array_mul = .pl_node, .array_type = .bin, @@ -1306,6 +1341,7 @@ pub const Inst = struct { .param_type = .param_type, .ref = .un_tok, .ret_node = .un_node, + .ret_load = .un_node, .ret_coerce = .un_tok, .ret_err_value = .str_tok, .ret_err_value_code = .str_tok, @@ -1451,6 +1487,7 @@ pub const Inst = struct { .splat = .pl_node, .reduce = .pl_node, .shuffle = .pl_node, + .select = .pl_node, .atomic_load = .pl_node, .atomic_rmw = .pl_node, .atomic_store = .pl_node, @@ -1458,8 +1495,10 @@ pub const Inst = struct { .builtin_call = .pl_node, .field_ptr_type = .bin, .field_parent_ptr = .pl_node, + .maximum = .pl_node, .memcpy = .pl_node, .memset = .pl_node, + .minimum = .pl_node, .builtin_async_call = .pl_node, .c_import = .pl_node, @@ -1618,6 +1657,7 @@ pub const Inst = struct { /// value and may instead be used as a sentinel to indicate null. none, + u1_type, u8_type, i8_type, u16_type, @@ -1671,6 +1711,8 @@ pub const Inst = struct { fn_ccc_void_no_args_type, single_const_pointer_to_comptime_int_type, const_slice_u8_type, + anyerror_void_error_union_type, + generic_poison_type, /// `undefined` (untyped) undef, @@ -1698,12 +1740,19 @@ pub const Inst = struct { calling_convention_c, /// `std.builtin.CallingConvention.Inline` calling_convention_inline, + /// Used for generic parameters where the type and value + /// is not known until generic function instantiation. + generic_poison, _, pub const typed_value_map = std.enums.directEnumArray(Ref, TypedValue, 0, .{ .none = undefined, + .u1_type = .{ + .ty = Type.initTag(.type), + .val = Value.initTag(.u1_type), + }, .u8_type = .{ .ty = Type.initTag(.type), .val = Value.initTag(.u8_type), @@ -1872,6 +1921,14 @@ pub const Inst = struct { .ty = Type.initTag(.type), .val = Value.initTag(.const_slice_u8_type), }, + .anyerror_void_error_union_type = .{ + .ty = Type.initTag(.type), + .val = Value.initTag(.anyerror_void_error_union_type), + }, + .generic_poison_type = .{ + .ty = Type.initTag(.type), + .val = Value.initTag(.generic_poison_type), + }, .enum_literal_type = .{ .ty = Type.initTag(.type), .val = Value.initTag(.enum_literal_type), @@ -1969,6 +2026,10 @@ pub const Inst = struct { .ty = Type.initTag(.calling_convention), .val = .{ .ptr_otherwise = &calling_convention_inline_payload.base }, }, + .generic_poison = .{ + .ty = Type.initTag(.generic_poison), + .val = Value.initTag(.generic_poison), + }, }); }; @@ -2027,6 +2088,17 @@ pub const Inst = struct { return .{ .node_offset = self.src_node }; } }, + pl_tok: struct { + /// Offset from Decl AST token index. + src_tok: ast.TokenIndex, + /// index into extra. + /// `Tag` determines what lives there. + payload_index: u32, + + pub fn src(self: @This()) LazySrcLoc { + return .{ .token_offset = self.src_tok }; + } + }, bin: Bin, /// For strings which may contain null bytes. str: struct { @@ -2150,6 +2222,7 @@ pub const Inst = struct { un_node, un_tok, pl_node, + pl_tok, bin, str, str_tok, @@ -2206,13 +2279,15 @@ pub const Inst = struct { /// 0. lib_name: u32, // null terminated string index, if has_lib_name is set /// 1. cc: Ref, // if has_cc is set /// 2. align: Ref, // if has_align is set - /// 3. param_type: Ref // for each param_types_len + /// 3. return_type: Index // for each ret_body_len /// 4. body: Index // for each body_len /// 5. src_locs: Func.SrcLocs // if body_len != 0 pub const ExtendedFunc = struct { src_node: i32, - return_type: Ref, - param_types_len: u32, + /// If this is 0 it means a void return type. + ret_body_len: u32, + /// Points to the block that contains the param instructions for this function. + param_block: Index, body_len: u32, pub const Small = packed struct { @@ -2246,13 +2321,14 @@ pub const Inst = struct { }; /// Trailing: - /// 0. param_type: Ref // for each param_types_len - /// - `none` indicates that the param type is `anytype`. + /// 0. return_type: Index // for each ret_body_len /// 1. body: Index // for each body_len /// 2. src_locs: SrcLocs // if body_len != 0 pub const Func = struct { - return_type: Ref, - param_types_len: u32, + /// If this is 0 it means a void return type. + ret_body_len: u32, + /// Points to the block that contains the param instructions for this function. + param_block: Index, body_len: u32, pub const SrcLocs = struct { @@ -2725,6 +2801,13 @@ pub const Inst = struct { mask: Ref, }; + pub const Select = struct { + elem_type: Ref, + pred: Ref, + a: Ref, + b: Ref, + }; + pub const AsyncCall = struct { frame_buffer: Ref, result_ptr: Ref, @@ -2732,6 +2815,14 @@ pub const Inst = struct { args: Ref, }; + /// Trailing: inst: Index // for every body_len + pub const Param = struct { + /// Null-terminated string index. + name: u32, + /// The body contains the type of the parameter. + body_len: u32, + }; + /// Trailing: /// 0. type_inst: Ref, // if small 0b000X is set /// 1. align_inst: Ref, // if small 0b00X0 is set @@ -2828,6 +2919,7 @@ const Writer = struct { .ensure_result_used, .ensure_result_non_error, .ret_node, + .ret_load, .resolve_inferred_alloc, .optional_type, .optional_payload_safe, @@ -2935,6 +3027,7 @@ const Writer = struct { .cmpxchg_strong, .cmpxchg_weak, .shuffle, + .select, .atomic_rmw, .atomic_store, .mul_add, @@ -3007,6 +3100,8 @@ const Writer = struct { .bitcast, .bitcast_result_ptr, .vector_type, + .maximum, + .minimum, => try self.writePlNodeBin(stream, inst), .@"export" => try self.writePlNodeExport(stream, inst), @@ -3073,11 +3168,14 @@ const Writer = struct { .decl_ref, .decl_val, .import, - .arg, .ret_err_value, .ret_err_value_code, + .param_anytype, + .param_anytype_comptime, => try self.writeStrTok(stream, inst), + .param, .param_comptime => try self.writeParam(stream, inst), + .func => try self.writeFunc(stream, inst, false), .func_inferred => try self.writeFunc(stream, inst, true), @@ -3279,6 +3377,22 @@ const Writer = struct { try self.writeSrc(stream, inst_data.src()); } + fn writeParam(self: *Writer, stream: anytype, inst: Inst.Index) !void { + const inst_data = self.code.instructions.items(.data)[inst].pl_tok; + const extra = self.code.extraData(Inst.Param, inst_data.payload_index); + const body = self.code.extra[extra.end..][0..extra.data.body_len]; + try stream.print("\"{}\", ", .{ + std.zig.fmtEscapes(self.code.nullTerminatedString(extra.data.name)), + }); + try stream.writeAll("{\n"); + self.indent += 2; + try self.writeBody(stream, body); + self.indent -= 2; + try stream.writeByteNTimes(' ', self.indent); + try stream.writeAll(") "); + try self.writeSrc(stream, inst_data.src()); + } + fn writePlNodeBin(self: *Writer, stream: anytype, inst: Inst.Index) !void { const inst_data = self.code.instructions.items(.data)[inst].pl_node; const extra = self.code.extraData(Inst.Bin, inst_data.payload_index).data; @@ -4242,17 +4356,21 @@ const Writer = struct { const inst_data = self.code.instructions.items(.data)[inst].pl_node; const src = inst_data.src(); const extra = self.code.extraData(Inst.Func, inst_data.payload_index); - const param_types = self.code.refSlice(extra.end, extra.data.param_types_len); - const body = self.code.extra[extra.end + param_types.len ..][0..extra.data.body_len]; + var extra_index = extra.end; + + const ret_ty_body = self.code.extra[extra_index..][0..extra.data.ret_body_len]; + extra_index += ret_ty_body.len; + + const body = self.code.extra[extra_index..][0..extra.data.body_len]; + extra_index += body.len; + var src_locs: Zir.Inst.Func.SrcLocs = undefined; if (body.len != 0) { - const extra_index = extra.end + param_types.len + body.len; src_locs = self.code.extraData(Zir.Inst.Func.SrcLocs, extra_index).data; } return self.writeFuncCommon( stream, - param_types, - extra.data.return_type, + ret_ty_body, inferred_error_set, false, false, @@ -4287,8 +4405,8 @@ const Writer = struct { break :blk align_inst; }; - const param_types = self.code.refSlice(extra_index, extra.data.param_types_len); - extra_index += param_types.len; + const ret_ty_body = self.code.extra[extra_index..][0..extra.data.ret_body_len]; + extra_index += ret_ty_body.len; const body = self.code.extra[extra_index..][0..extra.data.body_len]; extra_index += body.len; @@ -4299,8 +4417,7 @@ const Writer = struct { } return self.writeFuncCommon( stream, - param_types, - extra.data.return_type, + ret_ty_body, small.is_inferred_error, small.is_var_args, small.is_extern, @@ -4382,8 +4499,7 @@ const Writer = struct { fn writeFuncCommon( self: *Writer, stream: anytype, - param_types: []const Inst.Ref, - ret_ty: Inst.Ref, + ret_ty_body: []const Inst.Index, inferred_error_set: bool, var_args: bool, is_extern: bool, @@ -4393,13 +4509,17 @@ const Writer = struct { src: LazySrcLoc, src_locs: Zir.Inst.Func.SrcLocs, ) !void { - try stream.writeAll("["); - for (param_types) |param_type, i| { - if (i != 0) try stream.writeAll(", "); - try self.writeInstRef(stream, param_type); + if (ret_ty_body.len == 0) { + try stream.writeAll("ret_ty=void"); + } else { + try stream.writeAll("ret_ty={\n"); + self.indent += 2; + try self.writeBody(stream, ret_ty_body); + self.indent -= 2; + try stream.writeByteNTimes(' ', self.indent); + try stream.writeAll("}"); } - try stream.writeAll("], "); - try self.writeInstRef(stream, ret_ty); + try self.writeOptionalInstRef(stream, ", cc=", cc); try self.writeOptionalInstRef(stream, ", align=", align_inst); try self.writeFlag(stream, ", vargs", var_args); @@ -4407,9 +4527,9 @@ const Writer = struct { try self.writeFlag(stream, ", inferror", inferred_error_set); if (body.len == 0) { - try stream.writeAll(", {}) "); + try stream.writeAll(", body={}) "); } else { - try stream.writeAll(", {\n"); + try stream.writeAll(", body={\n"); self.indent += 2; try self.writeBody(stream, body); self.indent -= 2; @@ -4664,8 +4784,7 @@ fn findDeclsInner( const inst_data = datas[inst].pl_node; const extra = zir.extraData(Inst.Func, inst_data.payload_index); - const param_types_len = extra.data.param_types_len; - const body = zir.extra[extra.end + param_types_len ..][0..extra.data.body_len]; + const body = zir.extra[extra.end..][0..extra.data.body_len]; return zir.findDeclsBody(list, body); }, .extended => { @@ -4680,7 +4799,6 @@ fn findDeclsInner( extra_index += @boolToInt(small.has_lib_name); extra_index += @boolToInt(small.has_cc); extra_index += @boolToInt(small.has_align); - extra_index += extra.data.param_types_len; const body = zir.extra[extra_index..][0..extra.data.body_len]; return zir.findDeclsBody(list, body); }, @@ -4835,10 +4953,83 @@ fn findDeclsSwitchMulti( fn findDeclsBody( zir: Zir, - list: *std.ArrayList(Zir.Inst.Index), - body: []const Zir.Inst.Index, + list: *std.ArrayList(Inst.Index), + body: []const Inst.Index, ) Allocator.Error!void { for (body) |member| { try zir.findDeclsInner(list, member); } } + +pub const FnInfo = struct { + param_body: []const Inst.Index, + ret_ty_body: []const Inst.Index, + body: []const Inst.Index, + total_params_len: u32, +}; + +pub fn getFnInfo(zir: Zir, fn_inst: Inst.Index) FnInfo { + const tags = zir.instructions.items(.tag); + const datas = zir.instructions.items(.data); + const info: struct { + param_block: Inst.Index, + body: []const Inst.Index, + ret_ty_body: []const Inst.Index, + } = switch (tags[fn_inst]) { + .func, .func_inferred => blk: { + const inst_data = datas[fn_inst].pl_node; + const extra = zir.extraData(Inst.Func, inst_data.payload_index); + var extra_index: usize = extra.end; + + const ret_ty_body = zir.extra[extra_index..][0..extra.data.ret_body_len]; + extra_index += ret_ty_body.len; + + const body = zir.extra[extra_index..][0..extra.data.body_len]; + extra_index += body.len; + + break :blk .{ + .param_block = extra.data.param_block, + .ret_ty_body = ret_ty_body, + .body = body, + }; + }, + .extended => blk: { + const extended = datas[fn_inst].extended; + assert(extended.opcode == .func); + const extra = zir.extraData(Inst.ExtendedFunc, extended.operand); + const small = @bitCast(Inst.ExtendedFunc.Small, extended.small); + var extra_index: usize = extra.end; + extra_index += @boolToInt(small.has_lib_name); + extra_index += @boolToInt(small.has_cc); + extra_index += @boolToInt(small.has_align); + const ret_ty_body = zir.extra[extra_index..][0..extra.data.ret_body_len]; + extra_index += ret_ty_body.len; + const body = zir.extra[extra_index..][0..extra.data.body_len]; + extra_index += body.len; + break :blk .{ + .param_block = extra.data.param_block, + .ret_ty_body = ret_ty_body, + .body = body, + }; + }, + else => unreachable, + }; + assert(tags[info.param_block] == .block or tags[info.param_block] == .block_inline); + const param_block = zir.extraData(Inst.Block, datas[info.param_block].pl_node.payload_index); + const param_body = zir.extra[param_block.end..][0..param_block.data.body_len]; + var total_params_len: u32 = 0; + for (param_body) |inst| { + switch (tags[inst]) { + .param, .param_comptime, .param_anytype, .param_anytype_comptime => { + total_params_len += 1; + }, + else => continue, + } + } + return .{ + .param_body = param_body, + .ret_ty_body = info.ret_ty_body, + .body = info.body, + .total_params_len = total_params_len, + }; +} diff --git a/src/clang.zig b/src/clang.zig index 023d1aba4b..1254a505f4 100644 --- a/src/clang.zig +++ b/src/clang.zig @@ -269,6 +269,11 @@ pub const CharacterLiteral = opaque { extern fn ZigClangCharacterLiteral_getValue(*const CharacterLiteral) c_uint; }; +pub const ChooseExpr = opaque { + pub const getChosenSubExpr = ZigClangChooseExpr_getChosenSubExpr; + extern fn ZigClangChooseExpr_getChosenSubExpr(*const ChooseExpr) *const Expr; +}; + pub const CompoundAssignOperator = opaque { pub const getType = ZigClangCompoundAssignOperator_getType; extern fn ZigClangCompoundAssignOperator_getType(*const CompoundAssignOperator) QualType; @@ -611,8 +616,8 @@ pub const IntegerLiteral = opaque { pub const getBeginLoc = ZigClangIntegerLiteral_getBeginLoc; extern fn ZigClangIntegerLiteral_getBeginLoc(*const IntegerLiteral) SourceLocation; - pub const isZero = ZigClangIntegerLiteral_isZero; - extern fn ZigClangIntegerLiteral_isZero(*const IntegerLiteral, *bool, *const ASTContext) bool; + pub const getSignum = ZigClangIntegerLiteral_getSignum; + extern fn ZigClangIntegerLiteral_getSignum(*const IntegerLiteral, *c_int, *const ASTContext) bool; }; /// This is just used as a namespace for a static method on clang's Lexer class; we don't directly diff --git a/src/codegen.zig b/src/codegen.zig index c2504f26a8..38cc27d5bc 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -19,7 +19,6 @@ const DW = std.dwarf; const leb128 = std.leb; const log = std.log.scoped(.codegen); const build_options = @import("build_options"); -const LazySrcLoc = Module.LazySrcLoc; const RegisterManager = @import("register_manager.zig").RegisterManager; const X8664Encoder = @import("codegen/x86_64.zig").Encoder; @@ -184,6 +183,7 @@ pub fn generateSymbol( if (typed_value.val.castTag(.decl_ref)) |payload| { const decl = payload.data; if (decl.analysis != .complete) return error.AnalysisFail; + decl.alive = true; // TODO handle the dependency of this symbol on the decl's vaddr. // If the decl changes vaddr, then this symbol needs to get regenerated. const vaddr = bin_file.getDeclVAddr(decl); @@ -802,13 +802,13 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { switch (air_tags[inst]) { // zig fmt: off - .add => try self.airAdd(inst), - .addwrap => try self.airAddWrap(inst), - .sub => try self.airSub(inst), - .subwrap => try self.airSubWrap(inst), - .mul => try self.airMul(inst), - .mulwrap => try self.airMulWrap(inst), - .div => try self.airDiv(inst), + .add, .ptr_add => try self.airAdd(inst), + .addwrap => try self.airAddWrap(inst), + .sub, .ptr_sub => try self.airSub(inst), + .subwrap => try self.airSubWrap(inst), + .mul => try self.airMul(inst), + .mulwrap => try self.airMulWrap(inst), + .div => try self.airDiv(inst), .cmp_lt => try self.airCmp(inst, .lt), .cmp_lte => try self.airCmp(inst, .lte), @@ -835,6 +835,8 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { .dbg_stmt => try self.airDbgStmt(inst), .floatcast => try self.airFloatCast(inst), .intcast => try self.airIntCast(inst), + .trunc => try self.airTrunc(inst), + .bool_to_int => try self.airBoolToInt(inst), .is_non_null => try self.airIsNonNull(inst), .is_non_null_ptr => try self.airIsNonNullPtr(inst), .is_null => try self.airIsNull(inst), @@ -847,17 +849,18 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { .loop => try self.airLoop(inst), .not => try self.airNot(inst), .ptrtoint => try self.airPtrToInt(inst), - .ref => try self.airRef(inst), .ret => try self.airRet(inst), .store => try self.airStore(inst), .struct_field_ptr=> try self.airStructFieldPtr(inst), + .struct_field_val=> try self.airStructFieldVal(inst), .switch_br => try self.airSwitch(inst), - .varptr => try self.airVarPtr(inst), .slice_ptr => try self.airSlicePtr(inst), .slice_len => try self.airSliceLen(inst), .slice_elem_val => try self.airSliceElemVal(inst), .ptr_slice_elem_val => try self.airPtrSliceElemVal(inst), + .ptr_elem_val => try self.airPtrElemVal(inst), + .ptr_ptr_elem_val => try self.airPtrPtrElemVal(inst), .constant => unreachable, // excluded from function bodies .const_ty => unreachable, // excluded from function bodies @@ -1109,6 +1112,26 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { return self.finishAir(inst, result, .{ ty_op.operand, .none, .none }); } + fn airTrunc(self: *Self, inst: Air.Inst.Index) !void { + const ty_op = self.air.instructions.items(.data)[inst].ty_op; + if (self.liveness.isUnused(inst)) + return self.finishAir(inst, .dead, .{ ty_op.operand, .none, .none }); + + const operand = try self.resolveInst(ty_op.operand); + _ = operand; + const result: MCValue = switch (arch) { + else => return self.fail("TODO implement trunc for {}", .{self.target.cpu.arch}), + }; + return self.finishAir(inst, result, .{ ty_op.operand, .none, .none }); + } + + fn airBoolToInt(self: *Self, inst: Air.Inst.Index) !void { + const un_op = self.air.instructions.items(.data)[inst].un_op; + const operand = try self.resolveInst(un_op); + const result: MCValue = if (self.liveness.isUnused(inst)) .dead else operand; + return self.finishAir(inst, result, .{ un_op, .none, .none }); + } + fn airNot(self: *Self, inst: Air.Inst.Index) !void { const ty_op = self.air.instructions.items(.data)[inst].ty_op; const result: MCValue = if (self.liveness.isUnused(inst)) .dead else result: { @@ -1331,13 +1354,6 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { return self.finishAir(inst, result, .{ ty_op.operand, .none, .none }); } - fn airVarPtr(self: *Self, inst: Air.Inst.Index) !void { - const result: MCValue = if (self.liveness.isUnused(inst)) .dead else switch (arch) { - else => return self.fail("TODO implement varptr for {}", .{self.target.cpu.arch}), - }; - return self.finishAir(inst, result, .{ .none, .none, .none }); - } - fn airSlicePtr(self: *Self, inst: Air.Inst.Index) !void { const ty_op = self.air.instructions.items(.data)[inst].ty_op; const result: MCValue = if (self.liveness.isUnused(inst)) .dead else switch (arch) { @@ -1355,21 +1371,41 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { } fn airSliceElemVal(self: *Self, inst: Air.Inst.Index) !void { + const is_volatile = false; // TODO const bin_op = self.air.instructions.items(.data)[inst].bin_op; - const result: MCValue = if (self.liveness.isUnused(inst)) .dead else switch (arch) { + const result: MCValue = if (!is_volatile and self.liveness.isUnused(inst)) .dead else switch (arch) { else => return self.fail("TODO implement slice_elem_val for {}", .{self.target.cpu.arch}), }; return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none }); } fn airPtrSliceElemVal(self: *Self, inst: Air.Inst.Index) !void { + const is_volatile = false; // TODO const bin_op = self.air.instructions.items(.data)[inst].bin_op; - const result: MCValue = if (self.liveness.isUnused(inst)) .dead else switch (arch) { + const result: MCValue = if (!is_volatile and self.liveness.isUnused(inst)) .dead else switch (arch) { else => return self.fail("TODO implement ptr_slice_elem_val for {}", .{self.target.cpu.arch}), }; return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none }); } + fn airPtrElemVal(self: *Self, inst: Air.Inst.Index) !void { + const is_volatile = false; // TODO + const bin_op = self.air.instructions.items(.data)[inst].bin_op; + const result: MCValue = if (!is_volatile and self.liveness.isUnused(inst)) .dead else switch (arch) { + else => return self.fail("TODO implement ptr_elem_val for {}", .{self.target.cpu.arch}), + }; + return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none }); + } + + fn airPtrPtrElemVal(self: *Self, inst: Air.Inst.Index) !void { + const is_volatile = false; // TODO + const bin_op = self.air.instructions.items(.data)[inst].bin_op; + const result: MCValue = if (!is_volatile and self.liveness.isUnused(inst)) .dead else switch (arch) { + else => return self.fail("TODO implement ptr_ptr_elem_val for {}", .{self.target.cpu.arch}), + }; + return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none }); + } + fn reuseOperand(self: *Self, inst: Air.Inst.Index, operand: Air.Inst.Ref, op_index: Liveness.OperandInt, mcv: MCValue) bool { if (!self.liveness.operandDies(inst, op_index)) return false; @@ -1501,6 +1537,14 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { //return self.finishAir(inst, result, .{ extra.struct_ptr, .none, .none }); } + fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void { + const ty_pl = self.air.instructions.items(.data)[inst].ty_pl; + const extra = self.air.extraData(Air.StructField, ty_pl.payload).data; + _ = extra; + return self.fail("TODO implement codegen struct_field_val", .{}); + //return self.finishAir(inst, result, .{ extra.struct_ptr, .none, .none }); + } + fn armOperandShouldBeRegister(self: *Self, mcv: MCValue) !bool { return switch (mcv) { .none => unreachable, @@ -2816,38 +2860,6 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { return bt.finishAir(result); } - fn airRef(self: *Self, inst: Air.Inst.Index) !void { - const ty_op = self.air.instructions.items(.data)[inst].ty_op; - const result: MCValue = if (self.liveness.isUnused(inst)) .dead else result: { - const operand_ty = self.air.typeOf(ty_op.operand); - const operand = try self.resolveInst(ty_op.operand); - switch (operand) { - .unreach => unreachable, - .dead => unreachable, - .none => break :result MCValue{ .none = {} }, - - .immediate, - .register, - .ptr_stack_offset, - .ptr_embedded_in_code, - .compare_flags_unsigned, - .compare_flags_signed, - => { - const stack_offset = try self.allocMemPtr(inst); - try self.genSetStack(operand_ty, stack_offset, operand); - break :result MCValue{ .ptr_stack_offset = stack_offset }; - }, - - .stack_offset => |offset| break :result MCValue{ .ptr_stack_offset = offset }, - .embedded_in_code => |offset| break :result MCValue{ .ptr_embedded_in_code = offset }, - .memory => |vaddr| break :result MCValue{ .immediate = vaddr }, - - .undef => return self.fail("TODO implement ref on an undefined value", .{}), - } - }; - return self.finishAir(inst, result, .{ ty_op.operand, .none, .none }); - } - fn ret(self: *Self, mcv: MCValue) !void { const ret_ty = self.fn_type.fnReturnType(); try self.setRegOrMem(ret_ty, self.ret_mcv, mcv); @@ -2913,10 +2925,9 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { const src_mcv = try self.limitImmediateType(bin_op.rhs, i32); try self.genX8664BinMathCode(Type.initTag(.bool), dst_mcv, src_mcv, 7, 0x38); - const info = ty.intInfo(self.target.*); - break :result switch (info.signedness) { - .signed => MCValue{ .compare_flags_signed = op }, - .unsigned => MCValue{ .compare_flags_unsigned = op }, + break :result switch (ty.isSignedInt()) { + true => MCValue{ .compare_flags_signed = op }, + false => MCValue{ .compare_flags_unsigned = op }, }; }, .arm, .armeb => result: { @@ -2958,10 +2969,9 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { // The destination register is not present in the cmp instruction try self.genArmBinOpCode(undefined, lhs_mcv, rhs_mcv, false, .cmp_eq); - const info = ty.intInfo(self.target.*); - break :result switch (info.signedness) { - .signed => MCValue{ .compare_flags_signed = op }, - .unsigned => MCValue{ .compare_flags_unsigned = op }, + break :result switch (ty.isSignedInt()) { + true => MCValue{ .compare_flags_signed = op }, + false => MCValue{ .compare_flags_unsigned = op }, }; }, else => return self.fail("TODO implement cmp for {}", .{self.target.cpu.arch}), @@ -3668,7 +3678,7 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { } { - var iter = std.mem.tokenize(asm_source, "\n\r"); + var iter = std.mem.tokenize(u8, asm_source, "\n\r"); while (iter.next()) |ins| { if (mem.eql(u8, ins, "syscall")) { try self.code.appendSlice(&[_]u8{ 0x0f, 0x05 }); @@ -4704,13 +4714,13 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { }, else => { if (typed_value.val.castTag(.decl_ref)) |payload| { + const decl = payload.data; + decl.alive = true; if (self.bin_file.cast(link.File.Elf)) |elf_file| { - const decl = payload.data; const got = &elf_file.program_headers.items[elf_file.phdr_got_index.?]; const got_addr = got.p_vaddr + decl.link.elf.offset_table_index * ptr_bytes; return MCValue{ .memory = got_addr }; } else if (self.bin_file.cast(link.File.MachO)) |macho_file| { - const decl = payload.data; const got_addr = blk: { const seg = macho_file.load_commands.items[macho_file.data_const_segment_cmd_index.?].Segment; const got = seg.sections.items[macho_file.got_section_index.?]; @@ -4722,11 +4732,9 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { }; return MCValue{ .memory = got_addr }; } else if (self.bin_file.cast(link.File.Coff)) |coff_file| { - const decl = payload.data; const got_addr = coff_file.offset_table_virtual_address + decl.link.coff.offset_table_index * ptr_bytes; return MCValue{ .memory = got_addr }; } else if (self.bin_file.cast(link.File.Plan9)) |p9| { - const decl = payload.data; const got_addr = p9.bases.data + decl.link.plan9.got_index.? * ptr_bytes; return MCValue{ .memory = got_addr }; } else { @@ -4766,6 +4774,56 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { } return self.fail("TODO non pointer optionals", .{}); }, + .Enum => { + if (typed_value.val.castTag(.enum_field_index)) |field_index| { + switch (typed_value.ty.tag()) { + .enum_simple => { + return MCValue{ .immediate = field_index.data }; + }, + .enum_full, .enum_nonexhaustive => { + const enum_full = typed_value.ty.cast(Type.Payload.EnumFull).?.data; + if (enum_full.values.count() != 0) { + const tag_val = enum_full.values.keys()[field_index.data]; + return self.genTypedValue(.{ .ty = enum_full.tag_ty, .val = tag_val }); + } else { + return MCValue{ .immediate = field_index.data }; + } + }, + else => unreachable, + } + } else { + var int_tag_buffer: Type.Payload.Bits = undefined; + const int_tag_ty = typed_value.ty.intTagType(&int_tag_buffer); + return self.genTypedValue(.{ .ty = int_tag_ty, .val = typed_value.val }); + } + }, + .ErrorSet => { + switch (typed_value.val.tag()) { + .@"error" => { + const err_name = typed_value.val.castTag(.@"error").?.data.name; + const module = self.bin_file.options.module.?; + const global_error_set = module.global_error_set; + const error_index = global_error_set.get(err_name).?; + return MCValue{ .immediate = error_index }; + }, + else => { + // In this case we are rendering an error union which has a 0 bits payload. + return MCValue{ .immediate = 0 }; + }, + } + }, + .ErrorUnion => { + const error_type = typed_value.ty.errorUnionSet(); + const payload_type = typed_value.ty.errorUnionPayload(); + const sub_val = typed_value.val.castTag(.eu_payload).?.data; + + if (!payload_type.hasCodeGenBits()) { + // We use the error type directly as the type. + return self.genTypedValue(.{ .ty = error_type, .val = sub_val }); + } + + return self.fail("TODO implement error union const of type '{}'", .{typed_value.ty}); + }, else => return self.fail("TODO implement const of type '{}'", .{typed_value.ty}), } } @@ -4894,7 +4952,7 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { } result.stack_byte_count = nsaa; - result.stack_align = 4; + result.stack_align = 8; }, else => return self.fail("TODO implement function parameters for {} on arm", .{cc}), } diff --git a/src/codegen/c.zig b/src/codegen/c.zig index 705c5c2ad1..a67e2438c2 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -262,6 +262,7 @@ pub const DeclGen = struct { .one => try writer.writeAll("1"), .decl_ref => { const decl = val.castTag(.decl_ref).?.data; + decl.alive = true; // Determine if we must pointer cast. assert(decl.has_tv); @@ -281,36 +282,7 @@ pub const DeclGen = struct { const decl = val.castTag(.extern_fn).?.data; try writer.print("{s}", .{decl.name}); }, - else => switch (t.ptrSize()) { - .Slice => unreachable, - .Many => { - if (val.castTag(.ref_val)) |ref_val_payload| { - const sub_val = ref_val_payload.data; - if (sub_val.castTag(.bytes)) |bytes_payload| { - const bytes = bytes_payload.data; - try writer.writeByte('('); - try dg.renderType(writer, t); - // TODO: make our own C string escape instead of using std.zig.fmtEscapes - try writer.print(")\"{}\"", .{std.zig.fmtEscapes(bytes)}); - } else { - unreachable; - } - } else { - unreachable; - } - }, - .One => { - var arena = std.heap.ArenaAllocator.init(dg.module.gpa); - defer arena.deinit(); - - const elem_ty = t.elemType(); - const elem_val = try val.pointerDeref(&arena.allocator); - - try writer.writeAll("&"); - try dg.renderValue(writer, elem_ty, elem_val); - }, - .C => unreachable, - }, + else => unreachable, }, }, .Array => { @@ -378,32 +350,25 @@ pub const DeclGen = struct { .ErrorUnion => { const error_type = t.errorUnionSet(); const payload_type = t.errorUnionPayload(); - const sub_val = val.castTag(.error_union).?.data; if (!payload_type.hasCodeGenBits()) { // We use the error type directly as the type. - return dg.renderValue(writer, error_type, sub_val); + const err_val = if (val.errorUnionIsPayload()) Value.initTag(.zero) else val; + return dg.renderValue(writer, error_type, err_val); } try writer.writeByte('('); try dg.renderType(writer, t); try writer.writeAll("){"); - if (val.getError()) |_| { - try writer.writeAll(" .error = "); - try dg.renderValue( - writer, - error_type, - sub_val, - ); - try writer.writeAll(" }"); - } else { + if (val.castTag(.eu_payload)) |pl| { + const payload_val = pl.data; try writer.writeAll(" .payload = "); - try dg.renderValue( - writer, - payload_type, - sub_val, - ); + try dg.renderValue(writer, payload_type, payload_val); try writer.writeAll(", .error = 0 }"); + } else { + try writer.writeAll(" .error = "); + try dg.renderValue(writer, error_type, val); + try writer.writeAll(" }"); } }, .Enum => { @@ -436,6 +401,7 @@ pub const DeclGen = struct { .one => try writer.writeAll("1"), .decl_ref => { const decl = val.castTag(.decl_ref).?.data; + decl.alive = true; // Determine if we must pointer cast. assert(decl.has_tv); @@ -448,11 +414,13 @@ pub const DeclGen = struct { } }, .function => { - const func = val.castTag(.function).?.data; - try writer.print("{s}", .{func.owner_decl.name}); + const decl = val.castTag(.function).?.data.owner_decl; + decl.alive = true; + try writer.print("{s}", .{decl.name}); }, .extern_fn => { const decl = val.castTag(.extern_fn).?.data; + decl.alive = true; try writer.print("{s}", .{decl.name}); }, else => unreachable, @@ -875,19 +843,19 @@ fn genBody(o: *Object, body: []const Air.Inst.Index) error{ AnalysisFail, OutOfM // TODO use a different strategy for add that communicates to the optimizer // that wrapping is UB. - .add => try airBinOp( o, inst, " + "), - .addwrap => try airWrapOp(o, inst, " + ", "addw_"), + .add, .ptr_add => try airBinOp( o, inst, " + "), + .addwrap => try airWrapOp(o, inst, " + ", "addw_"), // TODO use a different strategy for sub that communicates to the optimizer // that wrapping is UB. - .sub => try airBinOp( o, inst, " - "), - .subwrap => try airWrapOp(o, inst, " - ", "subw_"), + .sub, .ptr_sub => try airBinOp( o, inst, " - "), + .subwrap => try airWrapOp(o, inst, " - ", "subw_"), // TODO use a different strategy for mul that communicates to the optimizer // that wrapping is UB. - .mul => try airBinOp( o, inst, " * "), - .mulwrap => try airWrapOp(o, inst, " * ", "mulw_"), + .mul => try airBinOp( o, inst, " * "), + .mulwrap => try airWrapOp(o, inst, " * ", "mulw_"), // TODO use a different strategy for div that communicates to the optimizer // that wrapping is UB. - .div => try airBinOp( o, inst, " / "), + .div => try airBinOp( o, inst, " / "), .cmp_eq => try airBinOp(o, inst, " == "), .cmp_gt => try airBinOp(o, inst, " > "), @@ -925,6 +893,8 @@ fn genBody(o: *Object, body: []const Air.Inst.Index) error{ AnalysisFail, OutOfM .call => try airCall(o, inst), .dbg_stmt => try airDbgStmt(o, inst), .intcast => try airIntCast(o, inst), + .trunc => try airTrunc(o, inst), + .bool_to_int => try airBoolToInt(o, inst), .load => try airLoad(o, inst), .ret => try airRet(o, inst), .store => try airStore(o, inst), @@ -933,12 +903,13 @@ fn genBody(o: *Object, body: []const Air.Inst.Index) error{ AnalysisFail, OutOfM .br => try airBr(o, inst), .switch_br => try airSwitchBr(o, inst), .wrap_optional => try airWrapOptional(o, inst), - .ref => try airRef(o, inst), .struct_field_ptr => try airStructFieldPtr(o, inst), - .varptr => try airVarPtr(o, inst), + .struct_field_val => try airStructFieldVal(o, inst), .slice_ptr => try airSliceField(o, inst, ".ptr;\n"), .slice_len => try airSliceField(o, inst, ".len;\n"), + .ptr_elem_val => try airPtrElemVal(o, inst, "["), + .ptr_ptr_elem_val => try airPtrElemVal(o, inst, "[0]["), .slice_elem_val => try airSliceElemVal(o, inst, "["), .ptr_slice_elem_val => try airSliceElemVal(o, inst, "[0]["), @@ -977,8 +948,18 @@ fn airSliceField(o: *Object, inst: Air.Inst.Index, suffix: []const u8) !CValue { return local; } +fn airPtrElemVal(o: *Object, inst: Air.Inst.Index, prefix: []const u8) !CValue { + const is_volatile = false; // TODO + if (!is_volatile and o.liveness.isUnused(inst)) + return CValue.none; + + _ = prefix; + return o.dg.fail("TODO: C backend: airPtrElemVal", .{}); +} + fn airSliceElemVal(o: *Object, inst: Air.Inst.Index, prefix: []const u8) !CValue { - if (o.liveness.isUnused(inst)) + const is_volatile = false; // TODO + if (!is_volatile and o.liveness.isUnused(inst)) return CValue.none; const bin_op = o.air.instructions.items(.data)[inst].bin_op; @@ -994,12 +975,6 @@ fn airSliceElemVal(o: *Object, inst: Air.Inst.Index, prefix: []const u8) !CValue return local; } -fn airVarPtr(o: *Object, inst: Air.Inst.Index) !CValue { - const ty_pl = o.air.instructions.items(.data)[inst].ty_pl; - const variable = o.air.variables[ty_pl.payload]; - return CValue{ .decl_ref = variable.owner_decl }; -} - fn airAlloc(o: *Object, inst: Air.Inst.Index) !CValue { const writer = o.writer(); const inst_ty = o.air.typeOfIndex(inst); @@ -1069,7 +1044,7 @@ fn airIntCast(o: *Object, inst: Air.Inst.Index) !CValue { return CValue.none; const ty_op = o.air.instructions.items(.data)[inst].ty_op; - const from = try o.resolveInst(ty_op.operand); + const operand = try o.resolveInst(ty_op.operand); const writer = o.writer(); const inst_ty = o.air.typeOfIndex(inst); @@ -1077,7 +1052,31 @@ fn airIntCast(o: *Object, inst: Air.Inst.Index) !CValue { try writer.writeAll(" = ("); try o.dg.renderType(writer, inst_ty); try writer.writeAll(")"); - try o.writeCValue(writer, from); + try o.writeCValue(writer, operand); + try writer.writeAll(";\n"); + return local; +} + +fn airTrunc(o: *Object, inst: Air.Inst.Index) !CValue { + if (o.liveness.isUnused(inst)) + return CValue.none; + + const ty_op = o.air.instructions.items(.data)[inst].ty_op; + const operand = try o.resolveInst(ty_op.operand); + _ = operand; + return o.dg.fail("TODO: C backend: airTrunc", .{}); +} + +fn airBoolToInt(o: *Object, inst: Air.Inst.Index) !CValue { + if (o.liveness.isUnused(inst)) + return CValue.none; + const un_op = o.air.instructions.items(.data)[inst].un_op; + const writer = o.writer(); + const inst_ty = o.air.typeOfIndex(inst); + const operand = try o.resolveInst(un_op); + const local = try o.allocLocal(inst_ty, .Const); + try writer.writeAll(" = "); + try o.writeCValue(writer, operand); try writer.writeAll(";\n"); return local; } @@ -1637,22 +1636,6 @@ fn airOptionalPayload(o: *Object, inst: Air.Inst.Index) !CValue { return local; } -fn airRef(o: *Object, inst: Air.Inst.Index) !CValue { - if (o.liveness.isUnused(inst)) - return CValue.none; - - const ty_op = o.air.instructions.items(.data)[inst].ty_op; - const writer = o.writer(); - const operand = try o.resolveInst(ty_op.operand); - - const inst_ty = o.air.typeOfIndex(inst); - const local = try o.allocLocal(inst_ty, .Const); - try writer.writeAll(" = "); - try o.writeCValue(writer, operand); - try writer.writeAll(";\n"); - return local; -} - fn airStructFieldPtr(o: *Object, inst: Air.Inst.Index) !CValue { if (o.liveness.isUnused(inst)) return CValue.none; @@ -1660,8 +1643,8 @@ fn airStructFieldPtr(o: *Object, inst: Air.Inst.Index) !CValue { const ty_pl = o.air.instructions.items(.data)[inst].ty_pl; const extra = o.air.extraData(Air.StructField, ty_pl.payload).data; const writer = o.writer(); - const struct_ptr = try o.resolveInst(extra.struct_ptr); - const struct_ptr_ty = o.air.typeOf(extra.struct_ptr); + const struct_ptr = try o.resolveInst(extra.struct_operand); + const struct_ptr_ty = o.air.typeOf(extra.struct_operand); const struct_obj = struct_ptr_ty.elemType().castTag(.@"struct").?.data; const field_name = struct_obj.fields.keys()[extra.field_index]; @@ -1680,6 +1663,26 @@ fn airStructFieldPtr(o: *Object, inst: Air.Inst.Index) !CValue { return local; } +fn airStructFieldVal(o: *Object, inst: Air.Inst.Index) !CValue { + if (o.liveness.isUnused(inst)) + return CValue.none; + + const ty_pl = o.air.instructions.items(.data)[inst].ty_pl; + const extra = o.air.extraData(Air.StructField, ty_pl.payload).data; + const writer = o.writer(); + const struct_byval = try o.resolveInst(extra.struct_operand); + const struct_ty = o.air.typeOf(extra.struct_operand); + const struct_obj = struct_ty.castTag(.@"struct").?.data; + const field_name = struct_obj.fields.keys()[extra.field_index]; + + const inst_ty = o.air.typeOfIndex(inst); + const local = try o.allocLocal(inst_ty, .Const); + try writer.writeAll(" = "); + try o.writeCValue(writer, struct_byval); + try writer.print(".{};\n", .{fmtIdent(field_name)}); + return local; +} + // *(E!T) -> E NOT *E fn airUnwrapErrUnionErr(o: *Object, inst: Air.Inst.Index) !CValue { if (o.liveness.isUnused(inst)) diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 4224591b0b..7cfbc8da5e 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -350,19 +350,21 @@ pub const Object = struct { air: Air, liveness: Liveness, ) !void { + const decl = func.owner_decl; + var dg: DeclGen = .{ .context = self.context, .object = self, .module = module, - .decl = func.owner_decl, + .decl = decl, .err_msg = null, .gpa = module.gpa, }; - const llvm_func = try dg.resolveLLVMFunction(func.owner_decl); + const llvm_func = try dg.resolveLlvmFunction(decl); // This gets the LLVM values from the function and stores them in `dg.args`. - const fn_param_len = func.owner_decl.ty.fnParamLen(); + const fn_param_len = decl.ty.fnParamLen(); var args = try dg.gpa.alloc(*const llvm.Value, fn_param_len); for (args) |*arg, i| { @@ -400,13 +402,16 @@ pub const Object = struct { fg.genBody(air.getMainBody()) catch |err| switch (err) { error.CodegenFail => { - func.owner_decl.analysis = .codegen_failure; - try module.failed_decls.put(module.gpa, func.owner_decl, dg.err_msg.?); + decl.analysis = .codegen_failure; + try module.failed_decls.put(module.gpa, decl, dg.err_msg.?); dg.err_msg = null; return; }, else => |e| return e, }; + + const decl_exports = module.decl_exports.get(decl) orelse &[0]*Module.Export{}; + try self.updateDeclExports(module, decl, decl_exports); } pub fn updateDecl(self: *Object, module: *Module, decl: *Module.Decl) !void { @@ -428,6 +433,38 @@ pub const Object = struct { else => |e| return e, }; } + + pub fn updateDeclExports( + self: *Object, + module: *const Module, + decl: *const Module.Decl, + exports: []const *Module.Export, + ) !void { + const llvm_fn = self.llvm_module.getNamedFunction(decl.name).?; + const is_extern = decl.val.tag() == .extern_fn; + if (is_extern or exports.len != 0) { + llvm_fn.setLinkage(.External); + llvm_fn.setUnnamedAddr(.False); + } else { + llvm_fn.setLinkage(.Internal); + llvm_fn.setUnnamedAddr(.True); + } + // TODO LLVM C API does not support deleting aliases. We need to + // patch it to support this or figure out how to wrap the C++ API ourselves. + // Until then we iterate over existing aliases and make them point + // to the correct decl, or otherwise add a new alias. Old aliases are leaked. + for (exports) |exp| { + const exp_name_z = try module.gpa.dupeZ(u8, exp.options.name); + defer module.gpa.free(exp_name_z); + + if (self.llvm_module.getNamedGlobalAlias(exp_name_z.ptr, exp_name_z.len)) |alias| { + alias.setAliasee(llvm_fn); + } else { + const alias = self.llvm_module.addAlias(llvm_fn.typeOf(), llvm_fn, exp_name_z); + _ = alias; + } + } + } }; pub const DeclGen = struct { @@ -461,21 +498,30 @@ pub const DeclGen = struct { _ = func_payload; @panic("TODO llvm backend genDecl function pointer"); } else if (decl.val.castTag(.extern_fn)) |extern_fn| { - _ = try self.resolveLLVMFunction(extern_fn.data); + _ = try self.resolveLlvmFunction(extern_fn.data); } else { - _ = try self.resolveGlobalDecl(decl); + const global = try self.resolveGlobalDecl(decl); + assert(decl.has_tv); + const init_val = if (decl.val.castTag(.variable)) |payload| init_val: { + const variable = payload.data; + break :init_val variable.init; + } else init_val: { + global.setGlobalConstant(.True); + break :init_val decl.val; + }; + + const llvm_init = try self.genTypedValue(.{ .ty = decl.ty, .val = init_val }); + llvm.setInitializer(global, llvm_init); } } /// If the llvm function does not exist, create it - fn resolveLLVMFunction(self: *DeclGen, func: *Module.Decl) !*const llvm.Value { - // TODO: do we want to store this in our own datastructure? - if (self.llvmModule().getNamedFunction(func.name)) |llvm_fn| return llvm_fn; + fn resolveLlvmFunction(self: *DeclGen, decl: *Module.Decl) !*const llvm.Value { + if (self.llvmModule().getNamedFunction(decl.name)) |llvm_fn| return llvm_fn; - assert(func.has_tv); - const zig_fn_type = func.ty; + assert(decl.has_tv); + const zig_fn_type = decl.ty; const return_type = zig_fn_type.fnReturnType(); - const fn_param_len = zig_fn_type.fnParamLen(); const fn_param_types = try self.gpa.alloc(Type, fn_param_len); @@ -495,9 +541,17 @@ pub const DeclGen = struct { @intCast(c_uint, fn_param_len), .False, ); - const llvm_fn = self.llvmModule().addFunction(func.name, fn_type); + const llvm_fn = self.llvmModule().addFunction(decl.name, fn_type); - if (return_type.tag() == .noreturn) { + const is_extern = decl.val.tag() == .extern_fn; + if (!is_extern) { + llvm_fn.setLinkage(.Internal); + llvm_fn.setUnnamedAddr(.True); + } + + // TODO: calling convention, linkage, tsan, etc. see codegen.cpp `make_fn_llvm_value`. + + if (return_type.isNoReturn()) { self.addFnAttr(llvm_fn, "noreturn"); } @@ -505,24 +559,11 @@ pub const DeclGen = struct { } fn resolveGlobalDecl(self: *DeclGen, decl: *Module.Decl) error{ OutOfMemory, CodegenFail }!*const llvm.Value { - // TODO: do we want to store this in our own datastructure? - if (self.llvmModule().getNamedGlobal(decl.name)) |val| return val; - - assert(decl.has_tv); - + const llvm_module = self.object.llvm_module; + if (llvm_module.getNamedGlobal(decl.name)) |val| return val; // TODO: remove this redundant `llvmType`, it is also called in `genTypedValue`. const llvm_type = try self.llvmType(decl.ty); - const global = self.llvmModule().addGlobal(llvm_type, decl.name); - const init_val = if (decl.val.castTag(.variable)) |payload| init_val: { - const variable = payload.data; - global.setGlobalConstant(.False); - break :init_val variable.init; - } else decl.val; - - const llvm_init = try self.genTypedValue(.{ .ty = decl.ty, .val = init_val }, null); - llvm.setInitializer(global, llvm_init); - - return global; + return llvm_module.addGlobal(llvm_type, decl.name); } fn llvmType(self: *DeclGen, t: Type) error{ OutOfMemory, CodegenFail }!*const llvm.Type { @@ -534,6 +575,14 @@ pub const DeclGen = struct { const info = t.intInfo(self.module.getTarget()); return self.context.intType(info.bits); }, + .Float => switch (t.floatBits(self.module.getTarget())) { + 16 => return self.context.halfType(), + 32 => return self.context.floatType(), + 64 => return self.context.doubleType(), + 80 => return self.context.x86FP80Type(), + 128 => return self.context.fp128Type(), + else => unreachable, + }, .Bool => return self.context.intType(1), .Pointer => { if (t.isSlice()) { @@ -544,7 +593,7 @@ pub const DeclGen = struct { try self.llvmType(ptr_type), try self.llvmType(Type.initTag(.usize)), }; - return self.context.structType(&fields, 2, .False); + return self.context.structType(&fields, fields.len, .False); } else { const elem_type = try self.llvmType(t.elemType()); return elem_type.pointerType(0); @@ -552,7 +601,8 @@ pub const DeclGen = struct { }, .Array => { const elem_type = try self.llvmType(t.elemType()); - return elem_type.arrayType(@intCast(c_uint, t.abiSize(self.module.getTarget()))); + const total_len = t.arrayLen() + @boolToInt(t.sentinel() != null); + return elem_type.arrayType(@intCast(c_uint, total_len)); }, .Optional => { if (!t.isPtrLikeOptional()) { @@ -571,10 +621,14 @@ pub const DeclGen = struct { .ErrorUnion => { const error_type = t.errorUnionSet(); const payload_type = t.errorUnionPayload(); + const llvm_error_type = try self.llvmType(error_type); if (!payload_type.hasCodeGenBits()) { - return self.llvmType(error_type); + return llvm_error_type; } - return self.todo("implement llvmType for error unions", .{}); + const llvm_payload_type = try self.llvmType(payload_type); + + const fields: [2]*const llvm.Type = .{ llvm_error_type, llvm_payload_type }; + return self.context.structType(&fields, fields.len, .False); }, .ErrorSet => { return self.context.intType(16); @@ -602,12 +656,13 @@ pub const DeclGen = struct { llvm_param.* = try self.llvmType(t.fnParamType(i)); } const is_var_args = t.fnIsVarArgs(); - return llvm.functionType( + const llvm_fn_ty = llvm.functionType( ret_ty, llvm_params.ptr, @intCast(c_uint, llvm_params.len), llvm.Bool.fromBool(is_var_args), ); + return llvm_fn_ty.pointerType(0); }, .ComptimeInt => unreachable, .ComptimeFloat => unreachable, @@ -618,7 +673,6 @@ pub const DeclGen = struct { .BoundFn => @panic("TODO remove BoundFn from the language"), - .Float, .Enum, .Union, .Opaque, @@ -629,19 +683,22 @@ pub const DeclGen = struct { } } - // TODO: figure out a way to remove the FuncGen argument - fn genTypedValue(self: *DeclGen, tv: TypedValue, fg: ?*FuncGen) error{ OutOfMemory, CodegenFail }!*const llvm.Value { - const llvm_type = try self.llvmType(tv.ty); - - if (tv.val.isUndef()) + fn genTypedValue(self: *DeclGen, tv: TypedValue) error{ OutOfMemory, CodegenFail }!*const llvm.Value { + if (tv.val.isUndef()) { + const llvm_type = try self.llvmType(tv.ty); return llvm_type.getUndef(); + } switch (tv.ty.zigTypeTag()) { - .Bool => return if (tv.val.toBool()) llvm_type.constAllOnes() else llvm_type.constNull(), + .Bool => { + const llvm_type = try self.llvmType(tv.ty); + return if (tv.val.toBool()) llvm_type.constAllOnes() else llvm_type.constNull(); + }, .Int => { var bigint_space: Value.BigIntSpace = undefined; const bigint = tv.val.toBigInt(&bigint_space); + const llvm_type = try self.llvmType(tv.ty); if (bigint.eqZero()) return llvm_type.constNull(); if (bigint.limbs.len != 1) { @@ -653,32 +710,63 @@ pub const DeclGen = struct { } return llvm_int; }, + .Float => { + if (tv.ty.floatBits(self.module.getTarget()) <= 64) { + const llvm_ty = try self.llvmType(tv.ty); + return llvm_ty.constReal(tv.val.toFloat(f64)); + } + return self.todo("bitcast to f128 from an integer", .{}); + }, .Pointer => switch (tv.val.tag()) { .decl_ref => { - const decl = tv.val.castTag(.decl_ref).?.data; - const val = try self.resolveGlobalDecl(decl); - - const usize_type = try self.llvmType(Type.initTag(.usize)); - - // TODO: second index should be the index into the memory! - var indices: [2]*const llvm.Value = .{ - usize_type.constNull(), - usize_type.constNull(), - }; - - // TODO: consider using buildInBoundsGEP2 for opaque pointers - return fg.?.builder.buildInBoundsGEP(val, &indices, 2, ""); - }, - .ref_val => { - const elem_value = tv.val.castTag(.ref_val).?.data; - const elem_type = tv.ty.castPointer().?.data; - const alloca = fg.?.buildAlloca(try self.llvmType(elem_type)); - _ = fg.?.builder.buildStore(try self.genTypedValue(.{ .ty = elem_type, .val = elem_value }, fg), alloca); - return alloca; + if (tv.ty.isSlice()) { + var buf: Type.Payload.ElemType = undefined; + const ptr_ty = tv.ty.slicePtrFieldType(&buf); + var slice_len: Value.Payload.U64 = .{ + .base = .{ .tag = .int_u64 }, + .data = tv.val.sliceLen(), + }; + const fields: [2]*const llvm.Value = .{ + try self.genTypedValue(.{ + .ty = ptr_ty, + .val = tv.val, + }), + try self.genTypedValue(.{ + .ty = Type.initTag(.usize), + .val = Value.initPayload(&slice_len.base), + }), + }; + return self.context.constStruct(&fields, fields.len, .False); + } else { + const decl = tv.val.castTag(.decl_ref).?.data; + decl.alive = true; + const val = try self.resolveGlobalDecl(decl); + const llvm_type = try self.llvmType(tv.ty); + return val.constBitCast(llvm_type); + } }, .variable => { - const variable = tv.val.castTag(.variable).?.data; - return self.resolveGlobalDecl(variable.owner_decl); + const decl = tv.val.castTag(.variable).?.data.owner_decl; + decl.alive = true; + const val = try self.resolveGlobalDecl(decl); + const llvm_var_type = try self.llvmType(tv.ty); + const llvm_type = llvm_var_type.pointerType(0); + return val.constBitCast(llvm_type); + }, + .slice => { + const slice = tv.val.castTag(.slice).?.data; + var buf: Type.Payload.ElemType = undefined; + const fields: [2]*const llvm.Value = .{ + try self.genTypedValue(.{ + .ty = tv.ty.slicePtrFieldType(&buf), + .val = slice.ptr, + }), + try self.genTypedValue(.{ + .ty = Type.initTag(.usize), + .val = slice.len, + }), + }; + return self.context.constStruct(&fields, fields.len, .False); }, else => |tag| return self.todo("implement const of pointer type '{}' ({})", .{ tv.ty, tag }), }, @@ -689,10 +777,28 @@ pub const DeclGen = struct { return self.todo("handle other sentinel values", .{}); } else false; - return self.context.constString(payload.data.ptr, @intCast(c_uint, payload.data.len), llvm.Bool.fromBool(!zero_sentinel)); - } else { - return self.todo("handle more array values", .{}); + return self.context.constString( + payload.data.ptr, + @intCast(c_uint, payload.data.len), + llvm.Bool.fromBool(!zero_sentinel), + ); } + if (tv.val.castTag(.array)) |payload| { + const gpa = self.gpa; + const elem_ty = tv.ty.elemType(); + const elem_vals = payload.data; + const llvm_elems = try gpa.alloc(*const llvm.Value, elem_vals.len); + defer gpa.free(llvm_elems); + for (elem_vals) |elem_val, i| { + llvm_elems[i] = try self.genTypedValue(.{ .ty = elem_ty, .val = elem_val }); + } + const llvm_elem_ty = try self.llvmType(elem_ty); + return llvm_elem_ty.constArray( + llvm_elems.ptr, + @intCast(c_uint, llvm_elems.len), + ); + } + return self.todo("handle more array values", .{}); }, .Optional => { if (!tv.ty.isPtrLikeOptional()) { @@ -705,18 +811,87 @@ pub const DeclGen = struct { llvm_child_type.constNull(), self.context.intType(1).constNull(), }; - return self.context.constStruct(&optional_values, 2, .False); + return self.context.constStruct(&optional_values, optional_values.len, .False); } else { var optional_values: [2]*const llvm.Value = .{ - try self.genTypedValue(.{ .ty = child_type, .val = tv.val }, fg), + try self.genTypedValue(.{ .ty = child_type, .val = tv.val }), self.context.intType(1).constAllOnes(), }; - return self.context.constStruct(&optional_values, 2, .False); + return self.context.constStruct(&optional_values, optional_values.len, .False); } } else { return self.todo("implement const of optional pointer", .{}); } }, + .Fn => { + const fn_decl = switch (tv.val.tag()) { + .extern_fn => tv.val.castTag(.extern_fn).?.data, + .function => tv.val.castTag(.function).?.data.owner_decl, + .decl_ref => tv.val.castTag(.decl_ref).?.data, + else => unreachable, + }; + fn_decl.alive = true; + return self.resolveLlvmFunction(fn_decl); + }, + .ErrorSet => { + const llvm_ty = try self.llvmType(tv.ty); + switch (tv.val.tag()) { + .@"error" => { + const err_name = tv.val.castTag(.@"error").?.data.name; + const kv = try self.module.getErrorValue(err_name); + return llvm_ty.constInt(kv.value, .False); + }, + else => { + // In this case we are rendering an error union which has a 0 bits payload. + return llvm_ty.constNull(); + }, + } + }, + .ErrorUnion => { + const error_type = tv.ty.errorUnionSet(); + const payload_type = tv.ty.errorUnionPayload(); + const is_pl = tv.val.errorUnionIsPayload(); + + if (!payload_type.hasCodeGenBits()) { + // We use the error type directly as the type. + const err_val = if (!is_pl) tv.val else Value.initTag(.zero); + return self.genTypedValue(.{ .ty = error_type, .val = err_val }); + } + + const fields: [2]*const llvm.Value = .{ + try self.genTypedValue(.{ + .ty = error_type, + .val = if (is_pl) Value.initTag(.zero) else tv.val, + }), + try self.genTypedValue(.{ + .ty = payload_type, + .val = if (tv.val.castTag(.eu_payload)) |pl| pl.data else Value.initTag(.undef), + }), + }; + return self.context.constStruct(&fields, fields.len, .False); + }, + .Struct => { + const fields_len = tv.ty.structFieldCount(); + const field_vals = tv.val.castTag(.@"struct").?.data; + const gpa = self.gpa; + const llvm_fields = try gpa.alloc(*const llvm.Value, fields_len); + defer gpa.free(llvm_fields); + for (llvm_fields) |*llvm_field, i| { + llvm_field.* = try self.genTypedValue(.{ + .ty = tv.ty.structFieldType(i), + .val = field_vals[i], + }); + } + return self.context.constStruct( + llvm_fields.ptr, + @intCast(c_uint, llvm_fields.len), + .False, + ); + }, + .ComptimeInt => unreachable, + .ComptimeFloat => unreachable, + .Type => unreachable, + .EnumLiteral => unreachable, else => return self.todo("implement const of type '{}'", .{tv.ty}), } } @@ -788,12 +963,10 @@ pub const FuncGen = struct { fn resolveInst(self: *FuncGen, inst: Air.Inst.Ref) !*const llvm.Value { if (self.air.value(inst)) |val| { - return self.dg.genTypedValue(.{ .ty = self.air.typeOf(inst), .val = val }, self); + return self.dg.genTypedValue(.{ .ty = self.air.typeOf(inst), .val = val }); } const inst_index = Air.refToIndex(inst).?; - if (self.func_inst_table.get(inst_index)) |value| return value; - - return self.todo("implement global llvm values (or the value is not in the func_inst_table table)", .{}); + return self.func_inst_table.get(inst_index).?; } fn genBody(self: *FuncGen, body: []const Air.Inst.Index) error{ OutOfMemory, CodegenFail }!void { @@ -801,8 +974,19 @@ pub const FuncGen = struct { for (body) |inst| { const opt_value: ?*const llvm.Value = switch (air_tags[inst]) { // zig fmt: off - .add => try self.airAdd(inst), - .sub => try self.airSub(inst), + .add => try self.airAdd(inst, false), + .addwrap => try self.airAdd(inst, true), + .sub => try self.airSub(inst, false), + .subwrap => try self.airSub(inst, true), + .mul => try self.airMul(inst, false), + .mulwrap => try self.airMul(inst, true), + .div => try self.airDiv(inst), + .ptr_add => try self.airPtrAdd(inst), + .ptr_sub => try self.airPtrSub(inst), + + .bit_and, .bool_and => try self.airAnd(inst), + .bit_or, .bool_or => try self.airOr(inst), + .xor => try self.airXor(inst), .cmp_eq => try self.airCmp(inst, .eq), .cmp_gt => try self.airCmp(inst, .gt), @@ -815,20 +999,24 @@ pub const FuncGen = struct { .is_non_null_ptr => try self.airIsNonNull(inst, true), .is_null => try self.airIsNull(inst, false), .is_null_ptr => try self.airIsNull(inst, true), - .is_non_err => try self.airIsErr(inst, true, false), - .is_non_err_ptr => try self.airIsErr(inst, true, true), - .is_err => try self.airIsErr(inst, false, false), - .is_err_ptr => try self.airIsErr(inst, false, true), + .is_non_err => try self.airIsErr(inst, .EQ, false), + .is_non_err_ptr => try self.airIsErr(inst, .EQ, true), + .is_err => try self.airIsErr(inst, .NE, false), + .is_err_ptr => try self.airIsErr(inst, .NE, true), .alloc => try self.airAlloc(inst), .arg => try self.airArg(inst), .bitcast => try self.airBitCast(inst), + .bool_to_int=> try self.airBoolToInt(inst), .block => try self.airBlock(inst), .br => try self.airBr(inst), + .switch_br => try self.airSwitchBr(inst), .breakpoint => try self.airBreakpoint(inst), .call => try self.airCall(inst), .cond_br => try self.airCondBr(inst), .intcast => try self.airIntCast(inst), + .trunc => try self.airTrunc(inst), + .floatcast => try self.airFloatCast(inst), .ptrtoint => try self.airPtrToInt(inst), .load => try self.airLoad(inst), .loop => try self.airLoop(inst), @@ -836,12 +1024,16 @@ pub const FuncGen = struct { .ret => try self.airRet(inst), .store => try self.airStore(inst), .assembly => try self.airAssembly(inst), - .varptr => try self.airVarPtr(inst), .slice_ptr => try self.airSliceField(inst, 0), .slice_len => try self.airSliceField(inst, 1), - .slice_elem_val => try self.airSliceElemVal(inst, false), - .ptr_slice_elem_val => try self.airSliceElemVal(inst, true), + .struct_field_ptr => try self.airStructFieldPtr(inst), + .struct_field_val => try self.airStructFieldVal(inst), + + .slice_elem_val => try self.airSliceElemVal(inst), + .ptr_slice_elem_val => try self.airPtrSliceElemVal(inst), + .ptr_elem_val => try self.airPtrElemVal(inst), + .ptr_ptr_elem_val => try self.airPtrPtrElemVal(inst), .optional_payload => try self.airOptionalPayload(inst, false), .optional_payload_ptr => try self.airOptionalPayload(inst, true), @@ -851,12 +1043,17 @@ pub const FuncGen = struct { .unwrap_errunion_err => try self.airErrUnionErr(inst, false), .unwrap_errunion_err_ptr => try self.airErrUnionErr(inst, true), + .wrap_optional => try self.airWrapOptional(inst), + .wrap_errunion_payload => try self.airWrapErrUnionPayload(inst), + .wrap_errunion_err => try self.airWrapErrUnionErr(inst), + + .constant => unreachable, + .const_ty => unreachable, .unreach => self.airUnreach(inst), .dbg_stmt => blk: { // TODO: implement debug info break :blk null; }, - else => |tag| return self.todo("implement AIR instruction: {}", .{tag}), // zig fmt: on }; if (opt_value) |val| try self.func_inst_table.putNoClobber(self.gpa, inst, val); @@ -867,47 +1064,32 @@ pub const FuncGen = struct { const pl_op = self.air.instructions.items(.data)[inst].pl_op; const extra = self.air.extraData(Air.Call, pl_op.payload); const args = @bitCast([]const Air.Inst.Ref, self.air.extra[extra.end..][0..extra.data.args_len]); + const zig_fn_type = self.air.typeOf(pl_op.operand); + const return_type = zig_fn_type.fnReturnType(); + const llvm_fn = try self.resolveInst(pl_op.operand); - if (self.air.value(pl_op.operand)) |func_value| { - const fn_decl = if (func_value.castTag(.extern_fn)) |extern_fn| - extern_fn.data - else if (func_value.castTag(.function)) |func_payload| - func_payload.data.owner_decl - else - unreachable; + const llvm_param_vals = try self.gpa.alloc(*const llvm.Value, args.len); + defer self.gpa.free(llvm_param_vals); - assert(fn_decl.has_tv); - const zig_fn_type = fn_decl.ty; - const llvm_fn = try self.dg.resolveLLVMFunction(fn_decl); - - const llvm_param_vals = try self.gpa.alloc(*const llvm.Value, args.len); - defer self.gpa.free(llvm_param_vals); - - for (args) |arg, i| { - llvm_param_vals[i] = try self.resolveInst(arg); - } - - // TODO: LLVMBuildCall2 handles opaque function pointers, according to llvm docs - // Do we need that? - const call = self.builder.buildCall( - llvm_fn, - llvm_param_vals.ptr, - @intCast(c_uint, args.len), - "", - ); - - const return_type = zig_fn_type.fnReturnType(); - if (return_type.tag() == .noreturn) { - _ = self.builder.buildUnreachable(); - } - - // No need to store the LLVM value if the return type is void or noreturn - if (!return_type.hasCodeGenBits()) return null; - - return call; - } else { - return self.todo("implement calling runtime known function pointer", .{}); + for (args) |arg, i| { + llvm_param_vals[i] = try self.resolveInst(arg); } + + const call = self.builder.buildCall( + llvm_fn, + llvm_param_vals.ptr, + @intCast(c_uint, args.len), + "", + ); + + if (return_type.isNoReturn()) { + _ = self.builder.buildUnreachable(); + } + + // No need to store the LLVM value if the return type is void or noreturn + if (!return_type.hasCodeGenBits()) return null; + + return call; } fn airRet(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { @@ -930,21 +1112,32 @@ pub const FuncGen = struct { const rhs = try self.resolveInst(bin_op.rhs); const inst_ty = self.air.typeOfIndex(inst); - if (!inst_ty.isInt()) - if (inst_ty.tag() != .bool) - return self.todo("implement 'airCmp' for type {}", .{inst_ty}); - - const is_signed = inst_ty.isSignedInt(); - const operation = switch (op) { - .eq => .EQ, - .neq => .NE, - .lt => @as(llvm.IntPredicate, if (is_signed) .SLT else .ULT), - .lte => @as(llvm.IntPredicate, if (is_signed) .SLE else .ULE), - .gt => @as(llvm.IntPredicate, if (is_signed) .SGT else .UGT), - .gte => @as(llvm.IntPredicate, if (is_signed) .SGE else .UGE), - }; - - return self.builder.buildICmp(operation, lhs, rhs, ""); + switch (self.air.typeOf(bin_op.lhs).zigTypeTag()) { + .Int, .Bool, .Pointer, .ErrorSet => { + const is_signed = inst_ty.isSignedInt(); + const operation = switch (op) { + .eq => .EQ, + .neq => .NE, + .lt => @as(llvm.IntPredicate, if (is_signed) .SLT else .ULT), + .lte => @as(llvm.IntPredicate, if (is_signed) .SLE else .ULE), + .gt => @as(llvm.IntPredicate, if (is_signed) .SGT else .UGT), + .gte => @as(llvm.IntPredicate, if (is_signed) .SGE else .UGE), + }; + return self.builder.buildICmp(operation, lhs, rhs, ""); + }, + .Float => { + const operation: llvm.RealPredicate = switch (op) { + .eq => .OEQ, + .neq => .UNE, + .lt => .OLT, + .lte => .OLE, + .gt => .OGT, + .gte => .OGE, + }; + return self.builder.buildFCmp(operation, lhs, rhs, ""); + }, + else => unreachable, + } } fn airBlock(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { @@ -1026,6 +1219,11 @@ pub const FuncGen = struct { return null; } + fn airSwitchBr(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { + _ = inst; + return self.todo("implement llvm codegen for switch_br", .{}); + } + fn airLoop(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { const ty_pl = self.air.instructions.items(.data)[inst].ty_pl; const loop = self.air.extraData(Air.Block, ty_pl.payload); @@ -1040,16 +1238,6 @@ pub const FuncGen = struct { return null; } - fn airVarPtr(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { - if (self.liveness.isUnused(inst)) - return null; - - const ty_pl = self.air.instructions.items(.data)[inst].ty_pl; - const variable = self.air.variables[ty_pl.payload]; - const decl_llvm_value = self.dg.resolveGlobalDecl(variable.owner_decl); - return decl_llvm_value; - } - fn airSliceField(self: *FuncGen, inst: Air.Inst.Index, index: c_uint) !?*const llvm.Value { if (self.liveness.isUnused(inst)) return null; @@ -1059,33 +1247,88 @@ pub const FuncGen = struct { return self.builder.buildExtractValue(operand, index, ""); } - fn airSliceElemVal( - self: *FuncGen, - inst: Air.Inst.Index, - operand_is_ptr: bool, - ) !?*const llvm.Value { - if (self.liveness.isUnused(inst)) + fn airSliceElemVal(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { + const is_volatile = false; // TODO + if (!is_volatile and self.liveness.isUnused(inst)) + return null; + + const bin_op = self.air.instructions.items(.data)[inst].bin_op; + const lhs = try self.resolveInst(bin_op.lhs); + const rhs = try self.resolveInst(bin_op.rhs); + const base_ptr = self.builder.buildExtractValue(lhs, 0, ""); + const indices: [1]*const llvm.Value = .{rhs}; + const ptr = self.builder.buildInBoundsGEP(base_ptr, &indices, indices.len, ""); + return self.builder.buildLoad(ptr, ""); + } + + fn airPtrSliceElemVal(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { + const is_volatile = false; // TODO + if (!is_volatile and self.liveness.isUnused(inst)) return null; const bin_op = self.air.instructions.items(.data)[inst].bin_op; const lhs = try self.resolveInst(bin_op.lhs); const rhs = try self.resolveInst(bin_op.rhs); - const base_ptr = if (!operand_is_ptr) lhs else ptr: { - const index_type = self.context.intType(32); - const indices: [2]*const llvm.Value = .{ - index_type.constNull(), - index_type.constInt(0, .False), - }; - const ptr_field_ptr = self.builder.buildInBoundsGEP(lhs, &indices, 2, ""); + const base_ptr = ptr: { + const ptr_field_ptr = self.builder.buildStructGEP(lhs, 0, ""); break :ptr self.builder.buildLoad(ptr_field_ptr, ""); }; const indices: [1]*const llvm.Value = .{rhs}; - const ptr = self.builder.buildInBoundsGEP(base_ptr, &indices, 1, ""); + const ptr = self.builder.buildInBoundsGEP(base_ptr, &indices, indices.len, ""); return self.builder.buildLoad(ptr, ""); } + fn airPtrElemVal(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { + const is_volatile = false; // TODO + if (!is_volatile and self.liveness.isUnused(inst)) + return null; + + const bin_op = self.air.instructions.items(.data)[inst].bin_op; + const base_ptr = try self.resolveInst(bin_op.lhs); + const rhs = try self.resolveInst(bin_op.rhs); + const indices: [1]*const llvm.Value = .{rhs}; + const ptr = self.builder.buildInBoundsGEP(base_ptr, &indices, indices.len, ""); + return self.builder.buildLoad(ptr, ""); + } + + fn airPtrPtrElemVal(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { + const is_volatile = false; // TODO + if (!is_volatile and self.liveness.isUnused(inst)) + return null; + + const bin_op = self.air.instructions.items(.data)[inst].bin_op; + const lhs = try self.resolveInst(bin_op.lhs); + const rhs = try self.resolveInst(bin_op.rhs); + const base_ptr = self.builder.buildLoad(lhs, ""); + const indices: [1]*const llvm.Value = .{rhs}; + const ptr = self.builder.buildInBoundsGEP(base_ptr, &indices, indices.len, ""); + return self.builder.buildLoad(ptr, ""); + } + + fn airStructFieldPtr(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { + if (self.liveness.isUnused(inst)) + return null; + + const ty_pl = self.air.instructions.items(.data)[inst].ty_pl; + const struct_field = self.air.extraData(Air.StructField, ty_pl.payload).data; + const struct_ptr = try self.resolveInst(struct_field.struct_operand); + const field_index = @intCast(c_uint, struct_field.field_index); + return self.builder.buildStructGEP(struct_ptr, field_index, ""); + } + + fn airStructFieldVal(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { + if (self.liveness.isUnused(inst)) + return null; + + const ty_pl = self.air.instructions.items(.data)[inst].ty_pl; + const struct_field = self.air.extraData(Air.StructField, ty_pl.payload).data; + const struct_byval = try self.resolveInst(struct_field.struct_operand); + const field_index = @intCast(c_uint, struct_field.field_index); + return self.builder.buildExtractValue(struct_byval, field_index, ""); + } + fn airNot(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { if (self.liveness.isUnused(inst)) return null; @@ -1239,7 +1482,7 @@ pub const FuncGen = struct { index_type.constInt(1, .False), }; - return self.builder.buildLoad(self.builder.buildInBoundsGEP(operand, &indices, 2, ""), ""); + return self.builder.buildLoad(self.builder.buildInBoundsGEP(operand, &indices, indices.len, ""), ""); } else { return self.builder.buildExtractValue(operand, 1, ""); } @@ -1255,7 +1498,7 @@ pub const FuncGen = struct { fn airIsErr( self: *FuncGen, inst: Air.Inst.Index, - invert_logic: bool, + op: llvm.IntPredicate, operand_is_ptr: bool, ) !?*const llvm.Value { if (self.liveness.isUnused(inst)) @@ -1265,16 +1508,22 @@ pub const FuncGen = struct { const operand = try self.resolveInst(un_op); const err_union_ty = self.air.typeOf(un_op); const payload_ty = err_union_ty.errorUnionPayload(); + const err_set_ty = try self.dg.llvmType(Type.initTag(.anyerror)); + const zero = err_set_ty.constNull(); if (!payload_ty.hasCodeGenBits()) { const loaded = if (operand_is_ptr) self.builder.buildLoad(operand, "") else operand; - const op: llvm.IntPredicate = if (invert_logic) .EQ else .NE; - const err_set_ty = try self.dg.llvmType(Type.initTag(.anyerror)); - const zero = err_set_ty.constNull(); return self.builder.buildICmp(op, loaded, zero, ""); } - return self.todo("implement 'airIsErr' for error unions with nonzero payload", .{}); + if (operand_is_ptr) { + const err_field_ptr = self.builder.buildStructGEP(operand, 0, ""); + const loaded = self.builder.buildLoad(err_field_ptr, ""); + return self.builder.buildICmp(op, loaded, zero, ""); + } + + const loaded = self.builder.buildExtractValue(operand, 0, ""); + return self.builder.buildICmp(op, loaded, zero, ""); } fn airOptionalPayload( @@ -1319,9 +1568,11 @@ pub const FuncGen = struct { return null; } - _ = operand; - _ = operand_is_ptr; - return self.todo("implement 'airErrUnionPayload' for type {}", .{self.air.typeOf(ty_op.operand)}); + if (operand_is_ptr) { + return self.builder.buildStructGEP(operand, 1, ""); + } + + return self.builder.buildExtractValue(operand, 1, ""); } fn airErrUnionErr( @@ -1332,42 +1583,152 @@ pub const FuncGen = struct { if (self.liveness.isUnused(inst)) return null; - _ = operand_is_ptr; - return self.todo("implement 'airErrUnionErr'", .{}); + const ty_op = self.air.instructions.items(.data)[inst].ty_op; + const operand = try self.resolveInst(ty_op.operand); + const operand_ty = self.air.typeOf(ty_op.operand); + + const payload_ty = operand_ty.errorUnionPayload(); + if (!payload_ty.hasCodeGenBits()) { + if (!operand_is_ptr) return operand; + return self.builder.buildLoad(operand, ""); + } + + if (operand_is_ptr) { + const err_field_ptr = self.builder.buildStructGEP(operand, 0, ""); + return self.builder.buildLoad(err_field_ptr, ""); + } + + return self.builder.buildExtractValue(operand, 0, ""); } - fn airAdd(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { + fn airWrapOptional(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { if (self.liveness.isUnused(inst)) return null; + + return self.todo("implement llvm codegen for 'airWrapOptional'", .{}); + } + + fn airWrapErrUnionPayload(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { + if (self.liveness.isUnused(inst)) + return null; + + return self.todo("implement llvm codegen for 'airWrapErrUnionPayload'", .{}); + } + + fn airWrapErrUnionErr(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { + if (self.liveness.isUnused(inst)) + return null; + + return self.todo("implement llvm codegen for 'airWrapErrUnionErr'", .{}); + } + + fn airAdd(self: *FuncGen, inst: Air.Inst.Index, wrap: bool) !?*const llvm.Value { + if (self.liveness.isUnused(inst)) + return null; + const bin_op = self.air.instructions.items(.data)[inst].bin_op; const lhs = try self.resolveInst(bin_op.lhs); const rhs = try self.resolveInst(bin_op.rhs); const inst_ty = self.air.typeOfIndex(inst); - if (!inst_ty.isInt()) - return self.todo("implement 'airAdd' for type {}", .{inst_ty}); - - return if (inst_ty.isSignedInt()) - self.builder.buildNSWAdd(lhs, rhs, "") - else - self.builder.buildNUWAdd(lhs, rhs, ""); + if (inst_ty.isFloat()) return self.builder.buildFAdd(lhs, rhs, ""); + if (wrap) return self.builder.buildAdd(lhs, rhs, ""); + if (inst_ty.isSignedInt()) return self.builder.buildNSWAdd(lhs, rhs, ""); + return self.builder.buildNUWAdd(lhs, rhs, ""); } - fn airSub(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { + fn airSub(self: *FuncGen, inst: Air.Inst.Index, wrap: bool) !?*const llvm.Value { if (self.liveness.isUnused(inst)) return null; + const bin_op = self.air.instructions.items(.data)[inst].bin_op; const lhs = try self.resolveInst(bin_op.lhs); const rhs = try self.resolveInst(bin_op.rhs); const inst_ty = self.air.typeOfIndex(inst); - if (!inst_ty.isInt()) - return self.todo("implement 'airSub' for type {}", .{inst_ty}); + if (inst_ty.isFloat()) return self.builder.buildFSub(lhs, rhs, ""); + if (wrap) return self.builder.buildSub(lhs, rhs, ""); + if (inst_ty.isSignedInt()) return self.builder.buildNSWSub(lhs, rhs, ""); + return self.builder.buildNUWSub(lhs, rhs, ""); + } - return if (inst_ty.isSignedInt()) - self.builder.buildNSWSub(lhs, rhs, "") - else - self.builder.buildNUWSub(lhs, rhs, ""); + fn airMul(self: *FuncGen, inst: Air.Inst.Index, wrap: bool) !?*const llvm.Value { + if (self.liveness.isUnused(inst)) + return null; + + const bin_op = self.air.instructions.items(.data)[inst].bin_op; + const lhs = try self.resolveInst(bin_op.lhs); + const rhs = try self.resolveInst(bin_op.rhs); + const inst_ty = self.air.typeOfIndex(inst); + + if (inst_ty.isFloat()) return self.builder.buildFMul(lhs, rhs, ""); + if (wrap) return self.builder.buildMul(lhs, rhs, ""); + if (inst_ty.isSignedInt()) return self.builder.buildNSWMul(lhs, rhs, ""); + return self.builder.buildNUWMul(lhs, rhs, ""); + } + + fn airDiv(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { + if (self.liveness.isUnused(inst)) + return null; + + const bin_op = self.air.instructions.items(.data)[inst].bin_op; + const lhs = try self.resolveInst(bin_op.lhs); + const rhs = try self.resolveInst(bin_op.rhs); + const inst_ty = self.air.typeOfIndex(inst); + + if (inst_ty.isFloat()) return self.builder.buildFDiv(lhs, rhs, ""); + if (inst_ty.isSignedInt()) return self.builder.buildSDiv(lhs, rhs, ""); + return self.builder.buildUDiv(lhs, rhs, ""); + } + + fn airPtrAdd(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { + if (self.liveness.isUnused(inst)) + return null; + + const bin_op = self.air.instructions.items(.data)[inst].bin_op; + const base_ptr = try self.resolveInst(bin_op.lhs); + const offset = try self.resolveInst(bin_op.rhs); + const indices: [1]*const llvm.Value = .{offset}; + return self.builder.buildInBoundsGEP(base_ptr, &indices, indices.len, ""); + } + + fn airPtrSub(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { + if (self.liveness.isUnused(inst)) + return null; + + const bin_op = self.air.instructions.items(.data)[inst].bin_op; + const base_ptr = try self.resolveInst(bin_op.lhs); + const offset = try self.resolveInst(bin_op.rhs); + const negative_offset = self.builder.buildNeg(offset, ""); + const indices: [1]*const llvm.Value = .{negative_offset}; + return self.builder.buildInBoundsGEP(base_ptr, &indices, indices.len, ""); + } + + fn airAnd(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { + if (self.liveness.isUnused(inst)) + return null; + const bin_op = self.air.instructions.items(.data)[inst].bin_op; + const lhs = try self.resolveInst(bin_op.lhs); + const rhs = try self.resolveInst(bin_op.rhs); + return self.builder.buildAnd(lhs, rhs, ""); + } + + fn airOr(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { + if (self.liveness.isUnused(inst)) + return null; + const bin_op = self.air.instructions.items(.data)[inst].bin_op; + const lhs = try self.resolveInst(bin_op.lhs); + const rhs = try self.resolveInst(bin_op.rhs); + return self.builder.buildOr(lhs, rhs, ""); + } + + fn airXor(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { + if (self.liveness.isUnused(inst)) + return null; + const bin_op = self.air.instructions.items(.data)[inst].bin_op; + const lhs = try self.resolveInst(bin_op.lhs); + const rhs = try self.resolveInst(bin_op.rhs); + return self.builder.buildXor(lhs, rhs, ""); } fn airIntCast(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { @@ -1384,6 +1745,24 @@ pub const FuncGen = struct { return self.builder.buildIntCast2(operand, try self.dg.llvmType(inst_ty), llvm.Bool.fromBool(signed), ""); } + fn airTrunc(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { + if (self.liveness.isUnused(inst)) + return null; + + const ty_op = self.air.instructions.items(.data)[inst].ty_op; + const operand = try self.resolveInst(ty_op.operand); + const dest_llvm_ty = try self.dg.llvmType(self.air.typeOfIndex(inst)); + return self.builder.buildTrunc(operand, dest_llvm_ty, ""); + } + + fn airFloatCast(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { + if (self.liveness.isUnused(inst)) + return null; + + // TODO split floatcast AIR into float_widen and float_shorten + return self.todo("implement 'airFloatCast'", .{}); + } + fn airPtrToInt(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { if (self.liveness.isUnused(inst)) return null; @@ -1406,6 +1785,15 @@ pub const FuncGen = struct { return self.builder.buildBitCast(operand, dest_type, ""); } + fn airBoolToInt(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { + if (self.liveness.isUnused(inst)) + return null; + + const un_op = self.air.instructions.items(.data)[inst].un_op; + const operand = try self.resolveInst(un_op); + return operand; + } + fn airArg(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { const arg_val = self.args[self.arg_index]; self.arg_index += 1; @@ -1474,8 +1862,8 @@ pub const FuncGen = struct { fn airBreakpoint(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { _ = inst; - const llvn_fn = self.getIntrinsic("llvm.debugtrap"); - _ = self.builder.buildCall(llvn_fn, undefined, 0, ""); + const llvm_fn = self.getIntrinsic("llvm.debugtrap"); + _ = self.builder.buildCall(llvm_fn, undefined, 0, ""); return null; } diff --git a/src/codegen/llvm/bindings.zig b/src/codegen/llvm/bindings.zig index 3b76361030..4bb8a4a18b 100644 --- a/src/codegen/llvm/bindings.zig +++ b/src/codegen/llvm/bindings.zig @@ -31,6 +31,21 @@ pub const Context = opaque { pub const intType = LLVMIntTypeInContext; extern fn LLVMIntTypeInContext(C: *const Context, NumBits: c_uint) *const Type; + pub const halfType = LLVMHalfTypeInContext; + extern fn LLVMHalfTypeInContext(C: *const Context) *const Type; + + pub const floatType = LLVMFloatTypeInContext; + extern fn LLVMFloatTypeInContext(C: *const Context) *const Type; + + pub const doubleType = LLVMDoubleTypeInContext; + extern fn LLVMDoubleTypeInContext(C: *const Context) *const Type; + + pub const x86FP80Type = LLVMX86FP80TypeInContext; + extern fn LLVMX86FP80TypeInContext(C: *const Context) *const Type; + + pub const fp128Type = LLVMFP128TypeInContext; + extern fn LLVMFP128TypeInContext(C: *const Context) *const Type; + pub const voidType = LLVMVoidTypeInContext; extern fn LLVMVoidTypeInContext(C: *const Context) *const Type; @@ -49,7 +64,12 @@ pub const Context = opaque { extern fn LLVMConstStringInContext(C: *const Context, Str: [*]const u8, Length: c_uint, DontNullTerminate: Bool) *const Value; pub const constStruct = LLVMConstStructInContext; - extern fn LLVMConstStructInContext(C: *const Context, ConstantVals: [*]*const Value, Count: c_uint, Packed: Bool) *const Value; + extern fn LLVMConstStructInContext( + C: *const Context, + ConstantVals: [*]const *const Value, + Count: c_uint, + Packed: Bool, + ) *const Value; pub const createBasicBlock = LLVMCreateBasicBlockInContext; extern fn LLVMCreateBasicBlockInContext(C: *const Context, Name: [*:0]const u8) *const BasicBlock; @@ -82,6 +102,34 @@ pub const Value = opaque { pub const setGlobalConstant = LLVMSetGlobalConstant; extern fn LLVMSetGlobalConstant(GlobalVar: *const Value, IsConstant: Bool) void; + + pub const setLinkage = LLVMSetLinkage; + extern fn LLVMSetLinkage(Global: *const Value, Linkage: Linkage) void; + + pub const setUnnamedAddr = LLVMSetUnnamedAddr; + extern fn LLVMSetUnnamedAddr(Global: *const Value, HasUnnamedAddr: Bool) void; + + pub const deleteGlobal = LLVMDeleteGlobal; + extern fn LLVMDeleteGlobal(GlobalVar: *const Value) void; + + pub const getNextGlobalAlias = LLVMGetNextGlobalAlias; + extern fn LLVMGetNextGlobalAlias(GA: *const Value) *const Value; + + pub const getAliasee = LLVMAliasGetAliasee; + extern fn LLVMAliasGetAliasee(Alias: *const Value) *const Value; + + pub const setAliasee = LLVMAliasSetAliasee; + extern fn LLVMAliasSetAliasee(Alias: *const Value, Aliasee: *const Value) void; + + pub const constInBoundsGEP = LLVMConstInBoundsGEP; + extern fn LLVMConstInBoundsGEP( + ConstantVal: *const Value, + ConstantIndices: [*]const *const Value, + NumIndices: c_uint, + ) *const Value; + + pub const constBitCast = LLVMConstBitCast; + extern fn LLVMConstBitCast(ConstantVal: *const Value, ToType: *const Type) *const Value; }; pub const Type = opaque { @@ -94,8 +142,11 @@ pub const Type = opaque { pub const constInt = LLVMConstInt; extern fn LLVMConstInt(IntTy: *const Type, N: c_ulonglong, SignExtend: Bool) *const Value; + pub const constReal = LLVMConstReal; + extern fn LLVMConstReal(RealTy: *const Type, N: f64) *const Value; + pub const constArray = LLVMConstArray; - extern fn LLVMConstArray(ElementTy: *const Type, ConstantVals: ?[*]*const Value, Length: c_uint) *const Value; + extern fn LLVMConstArray(ElementTy: *const Type, ConstantVals: [*]*const Value, Length: c_uint) *const Value; pub const getUndef = LLVMGetUndef; extern fn LLVMGetUndef(Ty: *const Type) *const Value; @@ -145,6 +196,30 @@ pub const Module = opaque { pub const dump = LLVMDumpModule; extern fn LLVMDumpModule(M: *const Module) void; + + pub const getFirstGlobalAlias = LLVMGetFirstGlobalAlias; + extern fn LLVMGetFirstGlobalAlias(M: *const Module) *const Value; + + pub const getLastGlobalAlias = LLVMGetLastGlobalAlias; + extern fn LLVMGetLastGlobalAlias(M: *const Module) *const Value; + + pub const addAlias = LLVMAddAlias; + extern fn LLVMAddAlias( + M: *const Module, + Ty: *const Type, + Aliasee: *const Value, + Name: [*:0]const u8, + ) *const Value; + + pub const getNamedGlobalAlias = LLVMGetNamedGlobalAlias; + extern fn LLVMGetNamedGlobalAlias( + M: *const Module, + /// Empirically, LLVM will call strlen() on `Name` and so it + /// must be both null terminated and also have `NameLen` set + /// to the size. + Name: [*:0]const u8, + NameLen: usize, + ) ?*const Value; }; pub const lookupIntrinsicID = LLVMLookupIntrinsicID; @@ -249,21 +324,66 @@ pub const Builder = opaque { pub const buildLoad = LLVMBuildLoad; extern fn LLVMBuildLoad(*const Builder, PointerVal: *const Value, Name: [*:0]const u8) *const Value; + pub const buildNeg = LLVMBuildNeg; + extern fn LLVMBuildNeg(*const Builder, V: *const Value, Name: [*:0]const u8) *const Value; + pub const buildNot = LLVMBuildNot; extern fn LLVMBuildNot(*const Builder, V: *const Value, Name: [*:0]const u8) *const Value; + pub const buildFAdd = LLVMBuildFAdd; + extern fn LLVMBuildFAdd(*const Builder, LHS: *const Value, RHS: *const Value, Name: [*:0]const u8) *const Value; + + pub const buildAdd = LLVMBuildAdd; + extern fn LLVMBuildAdd(*const Builder, LHS: *const Value, RHS: *const Value, Name: [*:0]const u8) *const Value; + pub const buildNSWAdd = LLVMBuildNSWAdd; extern fn LLVMBuildNSWAdd(*const Builder, LHS: *const Value, RHS: *const Value, Name: [*:0]const u8) *const Value; pub const buildNUWAdd = LLVMBuildNUWAdd; extern fn LLVMBuildNUWAdd(*const Builder, LHS: *const Value, RHS: *const Value, Name: [*:0]const u8) *const Value; + pub const buildFSub = LLVMBuildFSub; + extern fn LLVMBuildFSub(*const Builder, LHS: *const Value, RHS: *const Value, Name: [*:0]const u8) *const Value; + + pub const buildSub = LLVMBuildSub; + extern fn LLVMBuildSub(*const Builder, LHS: *const Value, RHS: *const Value, Name: [*:0]const u8) *const Value; + pub const buildNSWSub = LLVMBuildNSWSub; extern fn LLVMBuildNSWSub(*const Builder, LHS: *const Value, RHS: *const Value, Name: [*:0]const u8) *const Value; pub const buildNUWSub = LLVMBuildNUWSub; extern fn LLVMBuildNUWSub(*const Builder, LHS: *const Value, RHS: *const Value, Name: [*:0]const u8) *const Value; + pub const buildFMul = LLVMBuildFMul; + extern fn LLVMBuildFMul(*const Builder, LHS: *const Value, RHS: *const Value, Name: [*:0]const u8) *const Value; + + pub const buildMul = LLVMBuildMul; + extern fn LLVMBuildMul(*const Builder, LHS: *const Value, RHS: *const Value, Name: [*:0]const u8) *const Value; + + pub const buildNSWMul = LLVMBuildNSWMul; + extern fn LLVMBuildNSWMul(*const Builder, LHS: *const Value, RHS: *const Value, Name: [*:0]const u8) *const Value; + + pub const buildNUWMul = LLVMBuildNUWMul; + extern fn LLVMBuildNUWMul(*const Builder, LHS: *const Value, RHS: *const Value, Name: [*:0]const u8) *const Value; + + pub const buildUDiv = LLVMBuildUDiv; + extern fn LLVMBuildUDiv(*const Builder, LHS: *const Value, RHS: *const Value, Name: [*:0]const u8) *const Value; + + pub const buildSDiv = LLVMBuildSDiv; + extern fn LLVMBuildSDiv(*const Builder, LHS: *const Value, RHS: *const Value, Name: [*:0]const u8) *const Value; + + pub const buildFDiv = LLVMBuildFDiv; + extern fn LLVMBuildFDiv(*const Builder, LHS: *const Value, RHS: *const Value, Name: [*:0]const u8) *const Value; + + pub const buildAnd = LLVMBuildAnd; + extern fn LLVMBuildAnd(*const Builder, LHS: *const Value, RHS: *const Value, Name: [*:0]const u8) *const Value; + + pub const buildOr = LLVMBuildOr; + extern fn LLVMBuildOr(*const Builder, LHS: *const Value, RHS: *const Value, Name: [*:0]const u8) *const Value; + + pub const buildXor = LLVMBuildXor; + extern fn LLVMBuildXor(*const Builder, LHS: *const Value, RHS: *const Value, Name: [*:0]const u8) *const Value; + pub const buildIntCast2 = LLVMBuildIntCast2; extern fn LLVMBuildIntCast2(*const Builder, Val: *const Value, DestTy: *const Type, IsSigned: Bool, Name: [*:0]const u8) *const Value; @@ -279,9 +399,22 @@ pub const Builder = opaque { Name: [*:0]const u8, ) *const Value; + pub const buildInBoundsGEP2 = LLVMBuildInBoundsGEP2; + extern fn LLVMBuildInBoundsGEP2( + B: *const Builder, + Ty: *const Type, + Pointer: *const Value, + Indices: [*]const *const Value, + NumIndices: c_uint, + Name: [*:0]const u8, + ) *const Value; + pub const buildICmp = LLVMBuildICmp; extern fn LLVMBuildICmp(*const Builder, Op: IntPredicate, LHS: *const Value, RHS: *const Value, Name: [*:0]const u8) *const Value; + pub const buildFCmp = LLVMBuildFCmp; + extern fn LLVMBuildFCmp(*const Builder, Op: RealPredicate, LHS: *const Value, RHS: *const Value, Name: [*:0]const u8) *const Value; + pub const buildBr = LLVMBuildBr; extern fn LLVMBuildBr(*const Builder, Dest: *const BasicBlock) *const Value; @@ -292,13 +425,39 @@ pub const Builder = opaque { extern fn LLVMBuildPhi(*const Builder, Ty: *const Type, Name: [*:0]const u8) *const Value; pub const buildExtractValue = LLVMBuildExtractValue; - extern fn LLVMBuildExtractValue(*const Builder, AggVal: *const Value, Index: c_uint, Name: [*:0]const u8) *const Value; + extern fn LLVMBuildExtractValue( + *const Builder, + AggVal: *const Value, + Index: c_uint, + Name: [*:0]const u8, + ) *const Value; pub const buildPtrToInt = LLVMBuildPtrToInt; - extern fn LLVMBuildPtrToInt(*const Builder, Val: *const Value, DestTy: *const Type, Name: [*:0]const u8) *const Value; + extern fn LLVMBuildPtrToInt( + *const Builder, + Val: *const Value, + DestTy: *const Type, + Name: [*:0]const u8, + ) *const Value; + + pub const buildStructGEP = LLVMBuildStructGEP; + extern fn LLVMBuildStructGEP( + B: *const Builder, + Pointer: *const Value, + Idx: c_uint, + Name: [*:0]const u8, + ) *const Value; + + pub const buildTrunc = LLVMBuildTrunc; + extern fn LLVMBuildTrunc( + *const Builder, + Val: *const Value, + DestTy: *const Type, + Name: [*:0]const u8, + ) *const Value; }; -pub const IntPredicate = enum(c_int) { +pub const IntPredicate = enum(c_uint) { EQ = 32, NE = 33, UGT = 34, @@ -311,6 +470,23 @@ pub const IntPredicate = enum(c_int) { SLE = 41, }; +pub const RealPredicate = enum(c_uint) { + OEQ = 1, + OGT = 2, + OGE = 3, + OLT = 4, + OLE = 5, + ONE = 6, + ORD = 7, + UNO = 8, + UEQ = 9, + UGT = 10, + UGE = 11, + ULT = 12, + ULE = 13, + UNE = 14, +}; + pub const BasicBlock = opaque { pub const deleteBasicBlock = LLVMDeleteBasicBlock; extern fn LLVMDeleteBasicBlock(BB: *const BasicBlock) void; @@ -715,3 +891,23 @@ extern fn ZigLLVMWriteImportLibrary( output_lib_path: [*c]const u8, kill_at: bool, ) bool; + +pub const Linkage = enum(c_uint) { + External, + AvailableExternally, + LinkOnceAny, + LinkOnceODR, + LinkOnceODRAutoHide, + WeakAny, + WeakODR, + Appending, + Internal, + Private, + DLLImport, + DLLExport, + ExternalWeak, + Ghost, + Common, + LinkerPrivate, + LinkerPrivateWeak, +}; diff --git a/src/codegen/wasm.zig b/src/codegen/wasm.zig index ca0d53988d..4814ba0b55 100644 --- a/src/codegen/wasm.zig +++ b/src/codegen/wasm.zig @@ -590,8 +590,8 @@ pub const Context = struct { .Pointer, .ErrorSet, => wasm.Valtype.i32, - .Struct, .ErrorUnion => unreachable, // Multi typed, must be handled individually. - else => self.fail("TODO - Wasm valtype for type '{s}'", .{ty.zigTypeTag()}), + .Struct, .ErrorUnion, .Optional => unreachable, // Multi typed, must be handled individually. + else => |tag| self.fail("TODO - Wasm valtype for type '{s}'", .{tag}), }; } @@ -634,7 +634,7 @@ pub const Context = struct { // for each struct field, generate a local const struct_data: *Module.Struct = ty.castTag(.@"struct").?.data; const fields_len = @intCast(u32, struct_data.fields.count()); - try self.locals.ensureCapacity(self.gpa, self.locals.items.len + fields_len); + try self.locals.ensureUnusedCapacity(self.gpa, fields_len); for (struct_data.fields.values()) |*value| { const val_type = try self.genValtype(value.ty); self.locals.appendAssumeCapacity(val_type); @@ -653,7 +653,7 @@ pub const Context = struct { // The first local is also used to find the index of the error and payload. // // TODO: Add support where the payload is a type that contains multiple locals such as a struct. - try self.locals.ensureCapacity(self.gpa, self.locals.items.len + 2); + try self.locals.ensureUnusedCapacity(self.gpa, 2); self.locals.appendAssumeCapacity(wasm.valtype(.i32)); // error values are always i32 self.locals.appendAssumeCapacity(val_type); self.local_index += 2; @@ -663,6 +663,23 @@ pub const Context = struct { .count = 2, } }; }, + .Optional => { + var opt_buf: Type.Payload.ElemType = undefined; + const child_type = ty.optionalChild(&opt_buf); + if (ty.isPtrLikeOptional()) { + return self.fail("TODO: wasm optional pointer", .{}); + } + + try self.locals.ensureUnusedCapacity(self.gpa, 2); + self.locals.appendAssumeCapacity(wasm.valtype(.i32)); // optional 'tag' for null-checking is always i32 + self.locals.appendAssumeCapacity(try self.genValtype(child_type)); + self.local_index += 2; + + return WValue{ .multi_value = .{ + .index = initial_index, + .count = 2, + } }; + }, else => { const valtype = try self.genValtype(ty); try self.locals.append(self.gpa, valtype); @@ -754,22 +771,21 @@ pub const Context = struct { } /// Generates the wasm bytecode for the declaration belonging to `Context` - pub fn gen(self: *Context, typed_value: TypedValue) InnerError!Result { - switch (typed_value.ty.zigTypeTag()) { + pub fn gen(self: *Context, ty: Type, val: Value) InnerError!Result { + switch (ty.zigTypeTag()) { .Fn => { try self.genFunctype(); - if (typed_value.val.castTag(.extern_fn)) |_| return Result.appended; // don't need code body for extern functions + if (val.tag() == .extern_fn) { + return Result.appended; // don't need code body for extern functions + } return self.fail("TODO implement wasm codegen for function pointers", .{}); }, .Array => { - if (typed_value.val.castTag(.bytes)) |payload| { - if (typed_value.ty.sentinel()) |sentinel| { + if (val.castTag(.bytes)) |payload| { + if (ty.sentinel()) |sentinel| { try self.code.appendSlice(payload.data); - switch (try self.gen(.{ - .ty = typed_value.ty.elemType(), - .val = sentinel, - })) { + switch (try self.gen(ty.elemType(), sentinel)) { .appended => return Result.appended, .externally_managed => |data| { try self.code.appendSlice(data); @@ -781,13 +797,17 @@ pub const Context = struct { } else return self.fail("TODO implement gen for more kinds of arrays", .{}); }, .Int => { - const info = typed_value.ty.intInfo(self.target); + const info = ty.intInfo(self.target); if (info.bits == 8 and info.signedness == .unsigned) { - const int_byte = typed_value.val.toUnsignedInt(); + const int_byte = val.toUnsignedInt(); try self.code.append(@intCast(u8, int_byte)); return Result.appended; } - return self.fail("TODO: Implement codegen for int type: '{}'", .{typed_value.ty}); + return self.fail("TODO: Implement codegen for int type: '{}'", .{ty}); + }, + .Enum => { + try self.emitConstant(val, ty); + return Result.appended; }, else => |tag| return self.fail("TODO: Implement zig type codegen for type: '{s}'", .{tag}), } @@ -797,8 +817,11 @@ pub const Context = struct { const air_tags = self.air.instructions.items(.tag); return switch (air_tags[inst]) { .add => self.airBinOp(inst, .add), + .addwrap => self.airWrapBinOp(inst, .add), .sub => self.airBinOp(inst, .sub), + .subwrap => self.airWrapBinOp(inst, .sub), .mul => self.airBinOp(inst, .mul), + .mulwrap => self.airWrapBinOp(inst, .mul), .div => self.airBinOp(inst, .div), .bit_and => self.airBinOp(inst, .@"and"), .bit_or => self.airBinOp(inst, .@"or"), @@ -823,8 +846,16 @@ pub const Context = struct { .cond_br => self.airCondBr(inst), .constant => unreachable, .dbg_stmt => WValue.none, + .intcast => self.airIntcast(inst), + .is_err => self.airIsErr(inst, .i32_ne), .is_non_err => self.airIsErr(inst, .i32_eq), + + .is_null => self.airIsNull(inst, .i32_ne), + .is_non_null => self.airIsNull(inst, .i32_eq), + .is_null_ptr => self.airIsNull(inst, .i32_ne), + .is_non_null_ptr => self.airIsNull(inst, .i32_eq), + .load => self.airLoad(inst), .loop => self.airLoop(inst), .not => self.airNot(inst), @@ -833,8 +864,13 @@ pub const Context = struct { .struct_field_ptr => self.airStructFieldPtr(inst), .switch_br => self.airSwitchBr(inst), .unreach => self.airUnreachable(inst), + .wrap_optional => self.airWrapOptional(inst), + .unwrap_errunion_payload => self.airUnwrapErrUnionPayload(inst), .wrap_errunion_payload => self.airWrapErrUnionPayload(inst), + + .optional_payload => self.airOptionalPayload(inst), + .optional_payload_ptr => self.airOptionalPayload(inst), else => |tag| self.fail("TODO: Implement wasm inst: {s}", .{@tagName(tag)}), }; } @@ -919,6 +955,22 @@ pub const Context = struct { try leb.writeULEB128(writer, multi_value.index + i - 1); } }, + .local => { + // This can occur when we wrap a single value into a multi-value, + // such as wrapping a non-optional value into an optional. + // This means we must zero the null-tag, and set the payload. + assert(multi_value.count == 2); + // set null-tag + try writer.writeByte(wasm.opcode(.i32_const)); + try leb.writeULEB128(writer, @as(u32, 0)); + try writer.writeByte(wasm.opcode(.local_set)); + try leb.writeULEB128(writer, multi_value.index); + + // set payload + try self.emitWValue(rhs); + try writer.writeByte(wasm.opcode(.local_set)); + try leb.writeULEB128(writer, multi_value.index + 1); + }, else => unreachable, }, .local => |local| { @@ -969,7 +1021,63 @@ pub const Context = struct { return WValue{ .code_offset = offset }; } - fn emitConstant(self: *Context, value: Value, ty: Type) InnerError!void { + fn airWrapBinOp(self: *Context, inst: Air.Inst.Index, op: Op) InnerError!WValue { + const bin_op = self.air.instructions.items(.data)[inst].bin_op; + const lhs = self.resolveInst(bin_op.lhs); + const rhs = self.resolveInst(bin_op.rhs); + + // it's possible for both lhs and/or rhs to return an offset as well, + // in which case we return the first offset occurance we find. + const offset = blk: { + if (lhs == .code_offset) break :blk lhs.code_offset; + if (rhs == .code_offset) break :blk rhs.code_offset; + break :blk self.code.items.len; + }; + + try self.emitWValue(lhs); + try self.emitWValue(rhs); + + const bin_ty = self.air.typeOf(bin_op.lhs); + const opcode: wasm.Opcode = buildOpcode(.{ + .op = op, + .valtype1 = try self.typeToValtype(bin_ty), + .signedness = if (bin_ty.isSignedInt()) .signed else .unsigned, + }); + try self.code.append(wasm.opcode(opcode)); + + const int_info = bin_ty.intInfo(self.target); + const bitsize = int_info.bits; + const is_signed = int_info.signedness == .signed; + // if target type bitsize is x < 32 and 32 > x < 64, we perform + // result & ((1< 64) { + return self.fail("TODO wasm: Integer wrapping for bitsizes larger than 64", .{}); + } + + return WValue{ .code_offset = offset }; + } + + fn emitConstant(self: *Context, val: Value, ty: Type) InnerError!void { const writer = self.code.writer(); switch (ty.zigTypeTag()) { .Int => { @@ -982,10 +1090,10 @@ pub const Context = struct { const int_info = ty.intInfo(self.target); // write constant switch (int_info.signedness) { - .signed => try leb.writeILEB128(writer, value.toSignedInt()), + .signed => try leb.writeILEB128(writer, val.toSignedInt()), .unsigned => switch (int_info.bits) { - 0...32 => try leb.writeILEB128(writer, @bitCast(i32, @intCast(u32, value.toUnsignedInt()))), - 33...64 => try leb.writeILEB128(writer, @bitCast(i64, value.toUnsignedInt())), + 0...32 => try leb.writeILEB128(writer, @bitCast(i32, @intCast(u32, val.toUnsignedInt()))), + 33...64 => try leb.writeILEB128(writer, @bitCast(i64, val.toUnsignedInt())), else => |bits| return self.fail("Wasm TODO: emitConstant for integer with {d} bits", .{bits}), }, } @@ -994,7 +1102,7 @@ pub const Context = struct { // write opcode try writer.writeByte(wasm.opcode(.i32_const)); // write constant - try leb.writeILEB128(writer, value.toSignedInt()); + try leb.writeILEB128(writer, val.toSignedInt()); }, .Float => { // write opcode @@ -1005,14 +1113,15 @@ pub const Context = struct { try writer.writeByte(wasm.opcode(opcode)); // write constant switch (ty.floatBits(self.target)) { - 0...32 => try writer.writeIntLittle(u32, @bitCast(u32, value.toFloat(f32))), - 64 => try writer.writeIntLittle(u64, @bitCast(u64, value.toFloat(f64))), + 0...32 => try writer.writeIntLittle(u32, @bitCast(u32, val.toFloat(f32))), + 64 => try writer.writeIntLittle(u64, @bitCast(u64, val.toFloat(f64))), else => |bits| return self.fail("Wasm TODO: emitConstant for float with {d} bits", .{bits}), } }, .Pointer => { - if (value.castTag(.decl_ref)) |payload| { + if (val.castTag(.decl_ref)) |payload| { const decl = payload.data; + decl.alive = true; // offset into the offset table within the 'data' section const ptr_width = self.target.cpu.arch.ptrBitWidth() / 8; @@ -1024,11 +1133,11 @@ pub const Context = struct { try writer.writeByte(wasm.opcode(.i32_load)); try leb.writeULEB128(writer, @as(u32, 0)); try leb.writeULEB128(writer, @as(u32, 0)); - } else return self.fail("Wasm TODO: emitConstant for other const pointer tag {s}", .{value.tag()}); + } else return self.fail("Wasm TODO: emitConstant for other const pointer tag {s}", .{val.tag()}); }, .Void => {}, .Enum => { - if (value.castTag(.enum_field_index)) |field_index| { + if (val.castTag(.enum_field_index)) |field_index| { switch (ty.tag()) { .enum_simple => { try writer.writeByte(wasm.opcode(.i32_const)); @@ -1049,21 +1158,27 @@ pub const Context = struct { } else { var int_tag_buffer: Type.Payload.Bits = undefined; const int_tag_ty = ty.intTagType(&int_tag_buffer); - try self.emitConstant(value, int_tag_ty); + try self.emitConstant(val, int_tag_ty); } }, .ErrorSet => { - const error_index = self.global_error_set.get(value.getError().?).?; + const error_index = self.global_error_set.get(val.getError().?).?; try writer.writeByte(wasm.opcode(.i32_const)); try leb.writeULEB128(writer, error_index); }, .ErrorUnion => { - const data = value.castTag(.error_union).?.data; const error_type = ty.errorUnionSet(); const payload_type = ty.errorUnionPayload(); - if (value.getError()) |_| { - // write the error value - try self.emitConstant(data, error_type); + if (val.castTag(.eu_payload)) |pl| { + const payload_val = pl.data; + // no error, so write a '0' const + try writer.writeByte(wasm.opcode(.i32_const)); + try leb.writeULEB128(writer, @as(u32, 0)); + // after the error code, we emit the payload + try self.emitConstant(payload_val, payload_type); + } else { + // write the error val + try self.emitConstant(val, error_type); // no payload, so write a '0' const const opcode: wasm.Opcode = buildOpcode(.{ @@ -1072,12 +1187,31 @@ pub const Context = struct { }); try writer.writeByte(wasm.opcode(opcode)); try leb.writeULEB128(writer, @as(u32, 0)); - } else { - // no error, so write a '0' const + } + }, + .Optional => { + var buf: Type.Payload.ElemType = undefined; + const payload_type = ty.optionalChild(&buf); + if (ty.isPtrLikeOptional()) { + return self.fail("Wasm TODO: emitConstant for optional pointer", .{}); + } + + // When constant has value 'null', set is_null local to '1' + // and payload to '0' + if (val.tag() == .null_value) { try writer.writeByte(wasm.opcode(.i32_const)); + try leb.writeILEB128(writer, @as(i32, 1)); + + const opcode: wasm.Opcode = buildOpcode(.{ + .op = .@"const", + .valtype1 = try self.typeToValtype(payload_type), + }); + try writer.writeByte(wasm.opcode(opcode)); try leb.writeULEB128(writer, @as(u32, 0)); - // after the error code, we emit the payload - try self.emitConstant(data, payload_type); + } else { + try writer.writeByte(wasm.opcode(.i32_const)); + try leb.writeILEB128(writer, @as(i32, 0)); + try self.emitConstant(val, payload_type); } }, else => |zig_type| return self.fail("Wasm TODO: emitConstant for zigTypeTag {s}", .{zig_type}), @@ -1085,7 +1219,7 @@ pub const Context = struct { } /// Returns a `Value` as a signed 32 bit value. - /// It's illegale to provide a value with a type that cannot be represented + /// It's illegal to provide a value with a type that cannot be represented /// as an integer value. fn valueAsI32(self: Context, val: Value, ty: Type) i32 { switch (ty.zigTypeTag()) { @@ -1180,7 +1314,6 @@ pub const Context = struct { const then_body = self.air.extra[extra.end..][0..extra.data.then_body_len]; const else_body = self.air.extra[extra.end + then_body.len ..][0..extra.data.else_body_len]; const writer = self.code.writer(); - // TODO: Handle death instructions for then and else body // insert blocks at the position of `offset` so @@ -1306,7 +1439,7 @@ pub const Context = struct { fn airStructFieldPtr(self: *Context, inst: Air.Inst.Index) InnerError!WValue { const ty_pl = self.air.instructions.items(.data)[inst].ty_pl; const extra = self.air.extraData(Air.StructField, ty_pl.payload); - const struct_ptr = self.resolveInst(extra.data.struct_ptr); + const struct_ptr = self.resolveInst(extra.data.struct_operand); return WValue{ .local = struct_ptr.multi_value.index + @intCast(u32, extra.data.field_index) }; } @@ -1490,4 +1623,60 @@ pub const Context = struct { const ty_op = self.air.instructions.items(.data)[inst].ty_op; return self.resolveInst(ty_op.operand); } + + fn airIntcast(self: *Context, inst: Air.Inst.Index) InnerError!WValue { + const ty_op = self.air.instructions.items(.data)[inst].ty_op; + const ty = self.air.getRefType(ty_op.ty); + const operand = self.resolveInst(ty_op.operand); + const ref_ty = self.air.typeOf(ty_op.operand); + const ref_info = ref_ty.intInfo(self.target); + const op_bits = ref_info.bits; + const wanted_bits = ty.intInfo(self.target).bits; + + try self.emitWValue(operand); + if (op_bits > 32 and wanted_bits <= 32) { + try self.code.append(wasm.opcode(.i32_wrap_i64)); + } else if (op_bits <= 32 and wanted_bits > 32) { + try self.code.append(wasm.opcode(switch (ref_info.signedness) { + .signed => .i64_extend_i32_s, + .unsigned => .i64_extend_i32_u, + })); + } + + // other cases are no-op + return .none; + } + + fn airIsNull(self: *Context, inst: Air.Inst.Index, opcode: wasm.Opcode) InnerError!WValue { + const un_op = self.air.instructions.items(.data)[inst].un_op; + const operand = self.resolveInst(un_op); + // const offset = self.code.items.len; + const writer = self.code.writer(); + + // load the null value which is positioned at multi_value's index + try self.emitWValue(.{ .local = operand.multi_value.index }); + // Compare the null value with '0' + try writer.writeByte(wasm.opcode(.i32_const)); + try leb.writeILEB128(writer, @as(i32, 0)); + + try writer.writeByte(@enumToInt(opcode)); + + // we save the result in a new local + const local = try self.allocLocal(Type.initTag(.i32)); + try writer.writeByte(wasm.opcode(.local_set)); + try leb.writeULEB128(writer, local.local); + + return local; + } + + fn airOptionalPayload(self: *Context, inst: Air.Inst.Index) InnerError!WValue { + const ty_op = self.air.instructions.items(.data)[inst].ty_op; + const operand = self.resolveInst(ty_op.operand); + return WValue{ .local = operand.multi_value.index + 1 }; + } + + fn airWrapOptional(self: *Context, inst: Air.Inst.Index) InnerError!WValue { + const ty_op = self.air.instructions.items(.data)[inst].ty_op; + return self.resolveInst(ty_op.operand); + } }; diff --git a/src/glibc.zig b/src/glibc.zig index 1a6756e467..aed1a24437 100644 --- a/src/glibc.zig +++ b/src/glibc.zig @@ -107,7 +107,7 @@ pub fn loadMetaData(gpa: *Allocator, zig_lib_dir: std.fs.Dir) LoadMetaDataError! defer gpa.free(abi_txt_contents); { - var it = mem.tokenize(vers_txt_contents, "\r\n"); + var it = mem.tokenize(u8, vers_txt_contents, "\r\n"); var line_i: usize = 1; while (it.next()) |line| : (line_i += 1) { const prefix = "GLIBC_"; @@ -124,10 +124,10 @@ pub fn loadMetaData(gpa: *Allocator, zig_lib_dir: std.fs.Dir) LoadMetaDataError! } } { - var file_it = mem.tokenize(fns_txt_contents, "\r\n"); + var file_it = mem.tokenize(u8, fns_txt_contents, "\r\n"); var line_i: usize = 1; while (file_it.next()) |line| : (line_i += 1) { - var line_it = mem.tokenize(line, " "); + var line_it = mem.tokenize(u8, line, " "); const fn_name = line_it.next() orelse { std.log.err("fns.txt:{d}: expected function name", .{line_i}); return error.ZigInstallationCorrupt; @@ -147,7 +147,7 @@ pub fn loadMetaData(gpa: *Allocator, zig_lib_dir: std.fs.Dir) LoadMetaDataError! } } { - var file_it = mem.split(abi_txt_contents, "\n"); + var file_it = mem.split(u8, abi_txt_contents, "\n"); var line_i: usize = 0; while (true) { const ver_list_base: []VerList = blk: { @@ -155,9 +155,9 @@ pub fn loadMetaData(gpa: *Allocator, zig_lib_dir: std.fs.Dir) LoadMetaDataError! if (line.len == 0) break; line_i += 1; const ver_list_base = try arena.alloc(VerList, all_functions.items.len); - var line_it = mem.tokenize(line, " "); + var line_it = mem.tokenize(u8, line, " "); while (line_it.next()) |target_string| { - var component_it = mem.tokenize(target_string, "-"); + var component_it = mem.tokenize(u8, target_string, "-"); const arch_name = component_it.next() orelse { std.log.err("abi.txt:{d}: expected arch name", .{line_i}); return error.ZigInstallationCorrupt; @@ -203,7 +203,7 @@ pub fn loadMetaData(gpa: *Allocator, zig_lib_dir: std.fs.Dir) LoadMetaDataError! .versions = undefined, .len = 0, }; - var line_it = mem.tokenize(line, " "); + var line_it = mem.tokenize(u8, line, " "); while (line_it.next()) |version_index_string| { if (ver_list.len >= ver_list.versions.len) { // If this happens with legit data, increase the array len in the type. diff --git a/src/libc_installation.zig b/src/libc_installation.zig index 783f76b9bd..b639e0f2f8 100644 --- a/src/libc_installation.zig +++ b/src/libc_installation.zig @@ -60,10 +60,10 @@ pub const LibCInstallation = struct { const contents = try std.fs.cwd().readFileAlloc(allocator, libc_file, std.math.maxInt(usize)); defer allocator.free(contents); - var it = std.mem.tokenize(contents, "\n"); + var it = std.mem.tokenize(u8, contents, "\n"); while (it.next()) |line| { if (line.len == 0 or line[0] == '#') continue; - var line_it = std.mem.split(line, "="); + var line_it = std.mem.split(u8, line, "="); const name = line_it.next() orelse { log.err("missing equal sign after field name\n", .{}); return error.ParseError; @@ -298,7 +298,7 @@ pub const LibCInstallation = struct { }, } - var it = std.mem.tokenize(exec_res.stderr, "\n\r"); + var it = std.mem.tokenize(u8, exec_res.stderr, "\n\r"); var search_paths = std.ArrayList([]const u8).init(allocator); defer search_paths.deinit(); while (it.next()) |line| { @@ -616,7 +616,7 @@ fn ccPrintFileName(args: CCPrintFileNameOptions) ![:0]u8 { }, } - var it = std.mem.tokenize(exec_res.stdout, "\n\r"); + var it = std.mem.tokenize(u8, exec_res.stdout, "\n\r"); const line = it.next() orelse return error.LibCRuntimeNotFound; // When this command fails, it returns exit code 0 and duplicates the input file name. // So we detect failure by checking if the output matches exactly the input. @@ -695,7 +695,7 @@ fn appendCcExe(args: *std.ArrayList([]const u8), skip_cc_env_var: bool) !void { return; }; // Respect space-separated flags to the C compiler. - var it = std.mem.tokenize(cc_env_var, " "); + var it = std.mem.tokenize(u8, cc_env_var, " "); while (it.next()) |arg| { try args.append(arg); } diff --git a/src/link/Coff.zig b/src/link/Coff.zig index 0bae2cc6cc..4f5df73f8d 100644 --- a/src/link/Coff.zig +++ b/src/link/Coff.zig @@ -777,8 +777,18 @@ pub fn freeDecl(self: *Coff, decl: *Module.Decl) void { self.offset_table_free_list.append(self.base.allocator, decl.link.coff.offset_table_index) catch {}; } -pub fn updateDeclExports(self: *Coff, module: *Module, decl: *Module.Decl, exports: []const *Module.Export) !void { - if (self.llvm_object) |_| return; +pub fn updateDeclExports( + self: *Coff, + module: *Module, + decl: *Module.Decl, + exports: []const *Module.Export, +) !void { + if (build_options.skip_non_native and builtin.object_format != .coff) { + @panic("Attempted to compile for object format that was disabled by build configuration"); + } + if (build_options.have_llvm) { + if (self.llvm_object) |llvm_object| return llvm_object.updateDeclExports(module, decl, exports); + } for (exports) |exp| { if (exp.options.section) |section_name| { @@ -875,7 +885,7 @@ fn linkWithLLD(self: *Coff, comp: *Compilation) !void { // Both stage1 and stage2 LLVM backend put the object file in the cache directory. if (self.base.options.use_llvm) { // Stage2 has to call flushModule since that outputs the LLVM object file. - if (!build_options.is_stage1) try self.flushModule(comp); + if (!build_options.is_stage1 or !self.base.options.use_stage1) try self.flushModule(comp); const obj_basename = try std.zig.binNameAlloc(arena, .{ .root_name = self.base.options.root_name, @@ -1259,7 +1269,10 @@ fn linkWithLLD(self: *Coff, comp: *Compilation) !void { // TODO: remove when stage2 can build compiler_rt.zig, c.zig and ssp.zig // compiler-rt, libc and libssp - if (is_exe_or_dyn_lib and !self.base.options.skip_linker_dependencies and build_options.is_stage1) { + if (is_exe_or_dyn_lib and + !self.base.options.skip_linker_dependencies and + build_options.is_stage1 and self.base.options.use_stage1) + { if (!self.base.options.link_libc) { try argv.append(comp.libc_static_lib.?.full_object_path); } diff --git a/src/link/Elf.zig b/src/link/Elf.zig index c95af23026..9ddebd3453 100644 --- a/src/link/Elf.zig +++ b/src/link/Elf.zig @@ -1257,7 +1257,7 @@ fn linkWithLLD(self: *Elf, comp: *Compilation) !void { // Both stage1 and stage2 LLVM backend put the object file in the cache directory. if (self.base.options.use_llvm) { // Stage2 has to call flushModule since that outputs the LLVM object file. - if (!build_options.is_stage1) try self.flushModule(comp); + if (!build_options.is_stage1 or !self.base.options.use_stage1) try self.flushModule(comp); const obj_basename = try std.zig.binNameAlloc(arena, .{ .root_name = self.base.options.root_name, @@ -1287,7 +1287,7 @@ fn linkWithLLD(self: *Elf, comp: *Compilation) !void { const allow_shlib_undefined = self.base.options.allow_shlib_undefined orelse !self.base.options.is_native_os; const compiler_rt_path: ?[]const u8 = if (self.base.options.include_compiler_rt) blk: { // TODO: remove when stage2 can build compiler_rt.zig - if (!build_options.is_stage1) break :blk null; + if (!build_options.is_stage1 or !self.base.options.use_stage1) break :blk null; // In the case of build-obj we include the compiler-rt symbols directly alongside // the symbols of the root source file, in the same compilation unit. @@ -1605,7 +1605,8 @@ fn linkWithLLD(self: *Elf, comp: *Compilation) !void { if (is_exe_or_dyn_lib and !self.base.options.skip_linker_dependencies and !self.base.options.link_libc and - build_options.is_stage1) + build_options.is_stage1 and + self.base.options.use_stage1) { try argv.append(comp.libc_static_lib.?.full_object_path); } @@ -2716,7 +2717,12 @@ pub fn updateDeclExports( decl: *Module.Decl, exports: []const *Module.Export, ) !void { - if (self.llvm_object) |_| return; + if (build_options.skip_non_native and builtin.object_format != .elf) { + @panic("Attempted to compile for object format that was disabled by build configuration"); + } + if (build_options.have_llvm) { + if (self.llvm_object) |llvm_object| return llvm_object.updateDeclExports(module, decl, exports); + } const tracy = trace(@src()); defer tracy.end(); diff --git a/src/link/MachO.zig b/src/link/MachO.zig index 21f4e9c33c..36d5bc6a87 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -61,11 +61,11 @@ header_pad: u16 = 0x1000, /// The absolute address of the entry point. entry_addr: ?u64 = null, -objects: std.ArrayListUnmanaged(*Object) = .{}, -archives: std.ArrayListUnmanaged(*Archive) = .{}, -dylibs: std.ArrayListUnmanaged(*Dylib) = .{}, +objects: std.ArrayListUnmanaged(Object) = .{}, +archives: std.ArrayListUnmanaged(Archive) = .{}, -next_dylib_ordinal: u16 = 1, +dylibs: std.ArrayListUnmanaged(Dylib) = .{}, +referenced_dylibs: std.AutoArrayHashMapUnmanaged(u16, void) = .{}, load_commands: std.ArrayListUnmanaged(LoadCommand) = .{}, @@ -168,8 +168,7 @@ strtab_needs_relocation: bool = false, has_dices: bool = false, has_stabs: bool = false, -section_ordinals: std.ArrayListUnmanaged(MatchingSection) = .{}, -section_to_ordinal: std.AutoHashMapUnmanaged(MatchingSection, u8) = .{}, +section_ordinals: std.AutoArrayHashMapUnmanaged(MatchingSection, void) = .{}, pending_updates: std.ArrayListUnmanaged(struct { kind: enum { @@ -929,12 +928,16 @@ fn linkWithZld(self: *MachO, comp: *Compilation) !void { else => unreachable, }; - // Initialize section ordinals with null ordinal pointing at - // PAGEZERO segment. - try self.section_ordinals.append(self.base.allocator, .{ - .seg = 0, - .sect = 0, + // TODO mimicking insertion of null symbol from incremental linker. + // This will need to moved. + try self.locals.append(self.base.allocator, .{ + .n_strx = 0, + .n_type = macho.N_UNDF, + .n_sect = 0, + .n_desc = 0, + .n_value = 0, }); + try self.strtab.append(self.base.allocator, 0); try self.populateMetadata(); try self.parseInputFiles(positionals.items, self.base.options.sysroot); @@ -958,7 +961,8 @@ fn linkWithZld(self: *MachO, comp: *Compilation) !void { } try self.sortSections(); - try self.addRpaths(rpaths.items); + try self.addRpathLCs(rpaths.items); + try self.addLoadDylibLCs(); try self.addDataInCodeLC(); try self.addCodeSignatureLC(); try self.allocateTextSegment(); @@ -966,7 +970,6 @@ fn linkWithZld(self: *MachO, comp: *Compilation) !void { try self.allocateDataSegment(); self.allocateLinkeditSegment(); try self.allocateTextBlocks(); - self.printSymtabAndTextBlock(); try self.flushZld(); } @@ -990,10 +993,11 @@ fn parseInputFiles(self: *MachO, files: []const []const u8, syslibroot: ?[]const const arch = self.base.options.target.cpu.arch; for (files) |file_name| { const full_path = full_path: { - var buffer: [std.fs.MAX_PATH_BYTES]u8 = undefined; + var buffer: [fs.MAX_PATH_BYTES]u8 = undefined; const path = try std.fs.realpath(file_name, &buffer); break :full_path try self.base.allocator.dupe(u8, path); }; + defer self.base.allocator.free(full_path); if (try Object.createAndParseFromPath(self.base.allocator, arch, full_path)) |object| { try self.objects.append(self.base.allocator, object); @@ -1441,7 +1445,7 @@ pub fn getMatchingSection(self: *MachO, sect: macho.section_64) !?MatchingSectio }; if (res) |match| { - try self.createSectionOrdinal(match); + _ = try self.section_ordinals.getOrPut(self.base.allocator, match); } return res; @@ -1470,6 +1474,7 @@ fn sortSections(self: *MachO) !void { &self.cstring_section_index, &self.ustring_section_index, &self.text_const_section_index, + &self.objc_methlist_section_index, &self.objc_methname_section_index, &self.objc_methtype_section_index, &self.objc_classname_section_index, @@ -1572,32 +1577,29 @@ fn sortSections(self: *MachO) !void { { // Create new section ordinals. self.section_ordinals.clearRetainingCapacity(); - self.section_to_ordinal.clearRetainingCapacity(); - // First ordinal is always null - self.section_ordinals.appendAssumeCapacity(.{ - .seg = 0, - .sect = 0, - }); const text_seg = self.load_commands.items[self.text_segment_cmd_index.?].Segment; for (text_seg.sections.items) |_, sect_id| { - try self.createSectionOrdinal(.{ + const res = self.section_ordinals.getOrPutAssumeCapacity(.{ .seg = self.text_segment_cmd_index.?, .sect = @intCast(u16, sect_id), }); + assert(!res.found_existing); } const data_const_seg = self.load_commands.items[self.data_const_segment_cmd_index.?].Segment; for (data_const_seg.sections.items) |_, sect_id| { - try self.createSectionOrdinal(.{ + const res = self.section_ordinals.getOrPutAssumeCapacity(.{ .seg = self.data_const_segment_cmd_index.?, .sect = @intCast(u16, sect_id), }); + assert(!res.found_existing); } const data_seg = self.load_commands.items[self.data_segment_cmd_index.?].Segment; for (data_seg.sections.items) |_, sect_id| { - try self.createSectionOrdinal(.{ + const res = self.section_ordinals.getOrPutAssumeCapacity(.{ .seg = self.data_segment_cmd_index.?, .sect = @intCast(u16, sect_id), }); + assert(!res.found_existing); } } } @@ -1726,7 +1728,7 @@ fn allocateTextBlocks(self: *MachO) !void { const sect = seg.sections.items[match.sect]; var base_addr: u64 = sect.addr; - const n_sect = self.section_to_ordinal.get(match) orelse unreachable; + const n_sect = @intCast(u8, self.section_ordinals.getIndex(match).? + 1); log.debug(" within section {s},{s}", .{ commands.segmentName(sect), commands.sectionName(sect) }); log.debug(" {}", .{sect}); @@ -1993,7 +1995,7 @@ fn writeStubHelperCommon(self: *MachO) !void { } fn resolveSymbolsInObject(self: *MachO, object_id: u16) !void { - const object = self.objects.items[object_id]; + const object = &self.objects.items[object_id]; log.debug("resolving symbols in '{s}'", .{object.name}); @@ -2004,21 +2006,21 @@ fn resolveSymbolsInObject(self: *MachO, object_id: u16) !void { if (symbolIsStab(sym)) { log.err("unhandled symbol type: stab", .{}); log.err(" symbol '{s}'", .{sym_name}); - log.err(" first definition in '{s}'", .{object.name.?}); + log.err(" first definition in '{s}'", .{object.name}); return error.UnhandledSymbolType; } if (symbolIsIndr(sym)) { log.err("unhandled symbol type: indirect", .{}); log.err(" symbol '{s}'", .{sym_name}); - log.err(" first definition in '{s}'", .{object.name.?}); + log.err(" first definition in '{s}'", .{object.name}); return error.UnhandledSymbolType; } if (symbolIsAbs(sym)) { log.err("unhandled symbol type: absolute", .{}); log.err(" symbol '{s}'", .{sym_name}); - log.err(" first definition in '{s}'", .{object.name.?}); + log.err(" first definition in '{s}'", .{object.name}); return error.UnhandledSymbolType; } @@ -2068,8 +2070,8 @@ fn resolveSymbolsInObject(self: *MachO, object_id: u16) !void { !(symbolIsWeakDef(global.*) or symbolIsPext(global.*))) { log.err("symbol '{s}' defined multiple times", .{sym_name}); - log.err(" first definition in '{s}'", .{self.objects.items[resolv.file].name.?}); - log.err(" next definition in '{s}'", .{object.name.?}); + log.err(" first definition in '{s}'", .{self.objects.items[resolv.file].name}); + log.err(" next definition in '{s}'", .{object.name}); return error.MultipleSymbolDefinitions; } @@ -2194,17 +2196,6 @@ fn resolveSymbolsInObject(self: *MachO, object_id: u16) !void { } fn resolveSymbols(self: *MachO) !void { - // TODO mimicking insertion of null symbol from incremental linker. - // This will need to moved. - try self.locals.append(self.base.allocator, .{ - .n_strx = 0, - .n_type = macho.N_UNDF, - .n_sect = 0, - .n_desc = 0, - .n_value = 0, - }); - try self.strtab.append(self.base.allocator, 0); - // First pass, resolve symbols in provided objects. for (self.objects.items) |_, object_id| { try self.resolveSymbolsInObject(@intCast(u16, object_id)); @@ -2228,9 +2219,13 @@ fn resolveSymbols(self: *MachO) !void { }; assert(offsets.items.len > 0); - const object = try archive.parseObject(offsets.items[0]); const object_id = @intCast(u16, self.objects.items.len); - try self.objects.append(self.base.allocator, object); + const object = try self.objects.addOne(self.base.allocator); + object.* = try archive.parseObject( + self.base.allocator, + self.base.options.target.cpu.arch, + offsets.items[0], + ); try self.resolveSymbolsInObject(object_id); continue :loop; @@ -2255,7 +2250,7 @@ fn resolveSymbols(self: *MachO) !void { .sect = self.common_section_index.?, }; }; - try self.createSectionOrdinal(match); + _ = try self.section_ordinals.getOrPut(self.base.allocator, match); const size = sym.n_value; const code = try self.base.allocator.alloc(u8, size); @@ -2268,7 +2263,7 @@ fn resolveSymbols(self: *MachO) !void { var nlist = macho.nlist_64{ .n_strx = sym.n_strx, .n_type = macho.N_SECT, - .n_sect = self.section_to_ordinal.get(match) orelse unreachable, + .n_sect = @intCast(u8, self.section_ordinals.getIndex(match).? + 1), .n_desc = 0, .n_value = 0, }; @@ -2329,33 +2324,19 @@ fn resolveSymbols(self: *MachO) !void { }); } - var referenced = std.AutoHashMap(*Dylib, void).init(self.base.allocator); - defer referenced.deinit(); - loop: for (self.undefs.items) |sym| { if (symbolIsNull(sym)) continue; const sym_name = self.getString(sym.n_strx); - for (self.dylibs.items) |dylib| { + for (self.dylibs.items) |*dylib, id| { if (!dylib.symbols.contains(sym_name)) continue; - if (!referenced.contains(dylib)) { - // Add LC_LOAD_DYLIB load command for each referenced dylib/stub. - dylib.ordinal = self.next_dylib_ordinal; - const dylib_id = dylib.id orelse unreachable; - var dylib_cmd = try commands.createLoadDylibCommand( - self.base.allocator, - dylib_id.name, - dylib_id.timestamp, - dylib_id.current_version, - dylib_id.compatibility_version, - ); - errdefer dylib_cmd.deinit(self.base.allocator); - try self.load_commands.append(self.base.allocator, .{ .Dylib = dylib_cmd }); - self.next_dylib_ordinal += 1; - try referenced.putNoClobber(dylib, {}); + const dylib_id = @intCast(u16, id); + if (!self.referenced_dylibs.contains(dylib_id)) { + try self.referenced_dylibs.putNoClobber(self.base.allocator, dylib_id, {}); } + const ordinal = self.referenced_dylibs.getIndex(dylib_id) orelse unreachable; const resolv = self.symbol_resolver.getPtr(sym.n_strx) orelse unreachable; const undef = &self.undefs.items[resolv.where_index]; const import_sym_index = @intCast(u32, self.imports.items.len); @@ -2363,7 +2344,7 @@ fn resolveSymbols(self: *MachO) !void { .n_strx = undef.n_strx, .n_type = macho.N_UNDF | macho.N_EXT, .n_sect = 0, - .n_desc = packDylibOrdinal(dylib.ordinal.?), + .n_desc = @intCast(u16, ordinal + 1) * macho.N_SYMBOL_RESOLVER, .n_value = 0, }); resolv.* = .{ @@ -2398,7 +2379,7 @@ fn resolveSymbols(self: *MachO) !void { var nlist = macho.nlist_64{ .n_strx = undef.n_strx, .n_type = macho.N_SECT, - .n_sect = self.section_to_ordinal.get(match) orelse unreachable, + .n_sect = @intCast(u8, self.section_ordinals.getIndex(match).? + 1), .n_desc = 0, .n_value = 0, }; @@ -2448,7 +2429,7 @@ fn resolveSymbols(self: *MachO) !void { const resolv = self.symbol_resolver.get(sym.n_strx) orelse unreachable; log.err("undefined reference to symbol '{s}'", .{sym_name}); - log.err(" first referenced in '{s}'", .{self.objects.items[resolv.file].name.?}); + log.err(" first referenced in '{s}'", .{self.objects.items[resolv.file].name}); has_undefined = true; } @@ -2456,8 +2437,8 @@ fn resolveSymbols(self: *MachO) !void { } fn parseTextBlocks(self: *MachO) !void { - for (self.objects.items) |object| { - try object.parseTextBlocks(self); + for (self.objects.items) |*object, object_id| { + try object.parseTextBlocks(self.base.allocator, @intCast(u16, object_id), self); } } @@ -2494,7 +2475,7 @@ fn populateMetadata(self: *MachO) !void { .@"align" = alignment, .flags = macho.S_REGULAR | macho.S_ATTR_PURE_INSTRUCTIONS | macho.S_ATTR_SOME_INSTRUCTIONS, }); - try self.createSectionOrdinal(.{ + _ = try self.section_ordinals.getOrPut(self.base.allocator, .{ .seg = self.text_segment_cmd_index.?, .sect = self.text_section_index.?, }); @@ -2518,7 +2499,7 @@ fn populateMetadata(self: *MachO) !void { .flags = macho.S_SYMBOL_STUBS | macho.S_ATTR_PURE_INSTRUCTIONS | macho.S_ATTR_SOME_INSTRUCTIONS, .reserved2 = stub_size, }); - try self.createSectionOrdinal(.{ + _ = try self.section_ordinals.getOrPut(self.base.allocator, .{ .seg = self.text_segment_cmd_index.?, .sect = self.stubs_section_index.?, }); @@ -2542,7 +2523,7 @@ fn populateMetadata(self: *MachO) !void { .@"align" = alignment, .flags = macho.S_REGULAR | macho.S_ATTR_PURE_INSTRUCTIONS | macho.S_ATTR_SOME_INSTRUCTIONS, }); - try self.createSectionOrdinal(.{ + _ = try self.section_ordinals.getOrPut(self.base.allocator, .{ .seg = self.text_segment_cmd_index.?, .sect = self.stub_helper_section_index.?, }); @@ -2565,7 +2546,7 @@ fn populateMetadata(self: *MachO) !void { .@"align" = 3, // 2^3 = @sizeOf(u64) .flags = macho.S_NON_LAZY_SYMBOL_POINTERS, }); - try self.createSectionOrdinal(.{ + _ = try self.section_ordinals.getOrPut(self.base.allocator, .{ .seg = self.data_const_segment_cmd_index.?, .sect = self.got_section_index.?, }); @@ -2588,7 +2569,7 @@ fn populateMetadata(self: *MachO) !void { .@"align" = 3, // 2^3 = @sizeOf(u64) .flags = macho.S_LAZY_SYMBOL_POINTERS, }); - try self.createSectionOrdinal(.{ + _ = try self.section_ordinals.getOrPut(self.base.allocator, .{ .seg = self.data_segment_cmd_index.?, .sect = self.la_symbol_ptr_section_index.?, }); @@ -2600,7 +2581,7 @@ fn populateMetadata(self: *MachO) !void { try data_seg.addSection(self.base.allocator, "__data", .{ .@"align" = 3, // 2^3 = @sizeOf(u64) }); - try self.createSectionOrdinal(.{ + _ = try self.section_ordinals.getOrPut(self.base.allocator, .{ .seg = self.data_segment_cmd_index.?, .sect = self.data_section_index.?, }); @@ -2798,7 +2779,7 @@ fn addCodeSignatureLC(self: *MachO) !void { } } -fn addRpaths(self: *MachO, rpaths: []const []const u8) !void { +fn addRpathLCs(self: *MachO, rpaths: []const []const u8) !void { for (rpaths) |rpath| { const cmdsize = @intCast(u32, mem.alignForwardGeneric( u64, @@ -2817,6 +2798,22 @@ fn addRpaths(self: *MachO, rpaths: []const []const u8) !void { } } +fn addLoadDylibLCs(self: *MachO) !void { + for (self.referenced_dylibs.keys()) |id| { + const dylib = self.dylibs.items[id]; + const dylib_id = dylib.id orelse unreachable; + var dylib_cmd = try commands.createLoadDylibCommand( + self.base.allocator, + dylib_id.name, + dylib_id.timestamp, + dylib_id.current_version, + dylib_id.compatibility_version, + ); + errdefer dylib_cmd.deinit(self.base.allocator); + try self.load_commands.append(self.base.allocator, .{ .Dylib = dylib_cmd }); + } +} + fn flushZld(self: *MachO) !void { self.load_commands_dirty = true; try self.writeTextBlocks(); @@ -3023,7 +3020,7 @@ fn writeBindInfoTableZld(self: *MachO) !void { try pointers.append(.{ .offset = base_offset + i * @sizeOf(u64), .segment_id = segment_id, - .dylib_ordinal = unpackDylibOrdinal(sym.n_desc), + .dylib_ordinal = @divExact(sym.n_desc, macho.N_SYMBOL_RESOLVER), .name = self.getString(sym.n_strx), }); } @@ -3048,7 +3045,7 @@ fn writeBindInfoTableZld(self: *MachO) !void { try pointers.append(.{ .offset = binding.offset + base_offset, .segment_id = match.seg, - .dylib_ordinal = unpackDylibOrdinal(bind_sym.n_desc), + .dylib_ordinal = @divExact(bind_sym.n_desc, macho.N_SYMBOL_RESOLVER), .name = self.getString(bind_sym.n_strx), }); } @@ -3095,7 +3092,7 @@ fn writeLazyBindInfoTableZld(self: *MachO) !void { pointers.appendAssumeCapacity(.{ .offset = base_offset + i * @sizeOf(u64), .segment_id = segment_id, - .dylib_ordinal = unpackDylibOrdinal(sym.n_desc), + .dylib_ordinal = @divExact(sym.n_desc, macho.N_SYMBOL_RESOLVER), .name = self.getString(sym.n_strx), }); } @@ -3121,8 +3118,8 @@ fn writeLazyBindInfoTableZld(self: *MachO) !void { } fn writeExportInfoZld(self: *MachO) !void { - var trie = Trie.init(self.base.allocator); - defer trie.deinit(); + var trie: Trie = .{}; + defer trie.deinit(self.base.allocator); const text_segment = self.load_commands.items[self.text_segment_cmd_index.?].Segment; const base_address = text_segment.inner.vmaddr; @@ -3134,14 +3131,14 @@ fn writeExportInfoZld(self: *MachO) !void { const sym_name = self.getString(sym.n_strx); log.debug(" | putting '{s}' defined at 0x{x}", .{ sym_name, sym.n_value }); - try trie.put(.{ + try trie.put(self.base.allocator, .{ .name = sym_name, .vmaddr_offset = sym.n_value - base_address, .export_flags = macho.EXPORT_SYMBOL_FLAGS_KIND_REGULAR, }); } - try trie.finalize(); + try trie.finalize(self.base.allocator); var buffer = try self.base.allocator.alloc(u8, @intCast(usize, trie.size)); defer self.base.allocator.free(buffer); @@ -3190,7 +3187,7 @@ fn writeSymbolTable(self: *MachO) !void { .n_value = 0, }); locals.appendAssumeCapacity(.{ - .n_strx = try self.makeString(object.name.?), + .n_strx = try self.makeString(object.name), .n_type = macho.N_OSO, .n_sect = 0, .n_desc = 1, @@ -3315,7 +3312,6 @@ pub fn deinit(self: *MachO) void { } self.section_ordinals.deinit(self.base.allocator); - self.section_to_ordinal.deinit(self.base.allocator); self.pending_updates.deinit(self.base.allocator); self.got_entries.deinit(self.base.allocator); self.got_entries_map.deinit(self.base.allocator); @@ -3333,23 +3329,21 @@ pub fn deinit(self: *MachO) void { self.locals_free_list.deinit(self.base.allocator); self.symbol_resolver.deinit(self.base.allocator); - for (self.objects.items) |object| { - object.deinit(); - self.base.allocator.destroy(object); + for (self.objects.items) |*object| { + object.deinit(self.base.allocator); } self.objects.deinit(self.base.allocator); - for (self.archives.items) |archive| { - archive.deinit(); - self.base.allocator.destroy(archive); + for (self.archives.items) |*archive| { + archive.deinit(self.base.allocator); } self.archives.deinit(self.base.allocator); - for (self.dylibs.items) |dylib| { - dylib.deinit(); - self.base.allocator.destroy(dylib); + for (self.dylibs.items) |*dylib| { + dylib.deinit(self.base.allocator); } self.dylibs.deinit(self.base.allocator); + self.referenced_dylibs.deinit(self.base.allocator); for (self.load_commands.items) |*lc| { lc.deinit(self.base.allocator); @@ -3372,10 +3366,13 @@ pub fn deinit(self: *MachO) void { pub fn closeFiles(self: MachO) void { for (self.objects.items) |object| { - object.closeFile(); + object.file.close(); } for (self.archives.items) |archive| { - archive.closeFile(); + archive.file.close(); + } + for (self.dylibs.items) |dylib| { + dylib.file.close(); } } @@ -3785,6 +3782,12 @@ pub fn updateDeclExports( decl: *Module.Decl, exports: []const *Module.Export, ) !void { + if (build_options.skip_non_native and builtin.object_format != .macho) { + @panic("Attempted to compile for object format that was disabled by build configuration"); + } + if (build_options.have_llvm) { + if (self.llvm_object) |llvm_object| return llvm_object.updateDeclExports(module, decl, exports); + } const tracy = trace(@src()); defer tracy.end(); @@ -4391,7 +4394,7 @@ pub fn populateMissingMetadata(self: *MachO) !void { .n_strx = n_strx, .n_type = macho.N_UNDF | macho.N_EXT, .n_sect = 0, - .n_desc = packDylibOrdinal(1), + .n_desc = @intCast(u8, 1) * macho.N_SYMBOL_RESOLVER, .n_value = 0, }); try self.symbol_resolver.putNoClobber(self.base.allocator, n_strx, .{ @@ -4537,7 +4540,7 @@ pub fn addExternFn(self: *MachO, name: []const u8) !u32 { .n_strx = n_strx, .n_type = macho.N_UNDF | macho.N_EXT, .n_sect = 0, - .n_desc = packDylibOrdinal(1), + .n_desc = @intCast(u8, 1) * macho.N_SYMBOL_RESOLVER, .n_value = 0, }); try self.symbol_resolver.putNoClobber(self.base.allocator, n_strx, .{ @@ -5228,14 +5231,17 @@ fn writeCodeSignature(self: *MachO) !void { const text_segment = self.load_commands.items[self.text_segment_cmd_index.?].Segment; const code_sig_cmd = self.load_commands.items[self.code_signature_cmd_index.?].LinkeditData; - var code_sig = CodeSignature.init(self.base.allocator, self.page_size); - defer code_sig.deinit(); + var code_sig: CodeSignature = .{}; + defer code_sig.deinit(self.base.allocator); + try code_sig.calcAdhocSignature( + self.base.allocator, self.base.file.?, self.base.options.emit.?.sub_path, text_segment.inner, code_sig_cmd, self.base.options.output_mode, + self.page_size, ); var buffer = try self.base.allocator.alloc(u8, code_sig.size()); @@ -5255,8 +5261,8 @@ fn writeExportInfo(self: *MachO) !void { const tracy = trace(@src()); defer tracy.end(); - var trie = Trie.init(self.base.allocator); - defer trie.deinit(); + var trie: Trie = .{}; + defer trie.deinit(self.base.allocator); const text_segment = self.load_commands.items[self.text_segment_cmd_index.?].Segment; const base_address = text_segment.inner.vmaddr; @@ -5268,14 +5274,14 @@ fn writeExportInfo(self: *MachO) !void { const sym_name = self.getString(sym.n_strx); log.debug(" | putting '{s}' defined at 0x{x}", .{ sym_name, sym.n_value }); - try trie.put(.{ + try trie.put(self.base.allocator, .{ .name = sym_name, .vmaddr_offset = sym.n_value - base_address, .export_flags = macho.EXPORT_SYMBOL_FLAGS_KIND_REGULAR, }); } + try trie.finalize(self.base.allocator); - try trie.finalize(); var buffer = try self.base.allocator.alloc(u8, @intCast(usize, trie.size)); defer self.base.allocator.free(buffer); var stream = std.io.fixedBufferStream(buffer); @@ -5416,7 +5422,7 @@ fn writeBindInfoTable(self: *MachO) !void { try pointers.append(.{ .offset = base_offset + i * @sizeOf(u64), .segment_id = segment_id, - .dylib_ordinal = unpackDylibOrdinal(sym.n_desc), + .dylib_ordinal = @divExact(sym.n_desc, macho.N_SYMBOL_RESOLVER), .name = self.getString(sym.n_strx), }); } @@ -5441,7 +5447,7 @@ fn writeBindInfoTable(self: *MachO) !void { try pointers.append(.{ .offset = binding.offset + base_offset, .segment_id = match.seg, - .dylib_ordinal = unpackDylibOrdinal(bind_sym.n_desc), + .dylib_ordinal = @divExact(bind_sym.n_desc, macho.N_SYMBOL_RESOLVER), .name = self.getString(bind_sym.n_strx), }); } @@ -5500,7 +5506,7 @@ fn writeLazyBindInfoTable(self: *MachO) !void { pointers.appendAssumeCapacity(.{ .offset = base_offset + i * @sizeOf(u64), .segment_id = segment_id, - .dylib_ordinal = unpackDylibOrdinal(sym.n_desc), + .dylib_ordinal = @divExact(sym.n_desc, macho.N_SYMBOL_RESOLVER), .name = self.getString(sym.n_strx), }); } @@ -5842,14 +5848,6 @@ pub fn symbolIsTemp(sym: macho.nlist_64, sym_name: []const u8) bool { return mem.startsWith(u8, sym_name, "l") or mem.startsWith(u8, sym_name, "L"); } -fn packDylibOrdinal(ordinal: u16) u16 { - return ordinal * macho.N_SYMBOL_RESOLVER; -} - -fn unpackDylibOrdinal(pack: u16) u16 { - return @divExact(pack, macho.N_SYMBOL_RESOLVER); -} - pub fn findFirst(comptime T: type, haystack: []T, start: usize, predicate: anytype) usize { if (!@hasDecl(@TypeOf(predicate), "predicate")) @compileError("Predicate is required to define fn predicate(@This(), T) bool"); @@ -5862,77 +5860,3 @@ pub fn findFirst(comptime T: type, haystack: []T, start: usize, predicate: anyty } return i; } - -fn createSectionOrdinal(self: *MachO, match: MatchingSection) !void { - if (self.section_to_ordinal.contains(match)) return; - const ordinal = @intCast(u8, self.section_ordinals.items.len); - try self.section_ordinals.append(self.base.allocator, match); - try self.section_to_ordinal.putNoClobber(self.base.allocator, match, ordinal); -} - -fn printSymtabAndTextBlock(self: *MachO) void { - log.debug("locals", .{}); - for (self.locals.items) |sym, id| { - log.debug(" {d}: {s}, {}", .{ id, self.getString(sym.n_strx), sym }); - } - - log.debug("globals", .{}); - for (self.globals.items) |sym, id| { - log.debug(" {d}: {s}, {}", .{ id, self.getString(sym.n_strx), sym }); - } - - log.debug("tentatives", .{}); - for (self.tentatives.items) |sym, id| { - log.debug(" {d}: {s}, {}", .{ id, self.getString(sym.n_strx), sym }); - } - - log.debug("undefines", .{}); - for (self.undefs.items) |sym, id| { - log.debug(" {d}: {s}, {}", .{ id, self.getString(sym.n_strx), sym }); - } - - log.debug("imports", .{}); - for (self.imports.items) |sym, id| { - log.debug(" {d}: {s}, {}", .{ id, self.getString(sym.n_strx), sym }); - } - - { - log.debug("symbol resolver", .{}); - var it = self.symbol_resolver.keyIterator(); - while (it.next()) |key_ptr| { - const sym_name = self.getString(key_ptr.*); - log.debug(" {s} => {}", .{ sym_name, self.symbol_resolver.get(key_ptr.*).? }); - } - } - - log.debug("mappings", .{}); - for (self.objects.items) |object| { - log.debug(" in object {s}", .{object.name.?}); - for (object.symtab.items) |sym, sym_id| { - if (object.symbol_mapping.get(@intCast(u32, sym_id))) |local_id| { - log.debug(" | {d} => {d}", .{ sym_id, local_id }); - } else { - log.debug(" | {d} no local mapping for {s}", .{ sym_id, object.getString(sym.n_strx) }); - } - } - } - - { - var it = self.blocks.iterator(); - while (it.next()) |entry| { - const seg = self.load_commands.items[entry.key_ptr.seg].Segment; - const sect = seg.sections.items[entry.key_ptr.sect]; - - var block: *TextBlock = entry.value_ptr.*; - - log.debug("\n\n{s},{s} contents:", .{ commands.segmentName(sect), commands.sectionName(sect) }); - log.debug("{}", .{sect}); - log.debug("{}", .{block}); - - while (block.prev) |prev| { - block = prev; - log.debug("{}", .{block}); - } - } - } -} diff --git a/src/link/MachO/Archive.zig b/src/link/MachO/Archive.zig index 4004cdaefc..6959dbac89 100644 --- a/src/link/MachO/Archive.zig +++ b/src/link/MachO/Archive.zig @@ -12,13 +12,10 @@ const Allocator = mem.Allocator; const Arch = std.Target.Cpu.Arch; const Object = @import("Object.zig"); -usingnamespace @import("commands.zig"); +file: fs.File, +name: []const u8, -allocator: *Allocator, -arch: ?Arch = null, -file: ?fs.File = null, header: ?ar_hdr = null, -name: ?[]const u8 = null, // The actual contents we care about linking with will be embedded at // an offset within a file if we are linking against a fat lib @@ -96,30 +93,35 @@ const ar_hdr = extern struct { } }; -pub fn createAndParseFromPath(allocator: *Allocator, arch: Arch, path: []const u8) !?*Archive { +pub fn deinit(self: *Archive, allocator: *Allocator) void { + for (self.toc.keys()) |*key| { + allocator.free(key.*); + } + for (self.toc.values()) |*value| { + value.deinit(allocator); + } + self.toc.deinit(allocator); + allocator.free(self.name); +} + +pub fn createAndParseFromPath(allocator: *Allocator, arch: Arch, path: []const u8) !?Archive { const file = fs.cwd().openFile(path, .{}) catch |err| switch (err) { error.FileNotFound => return null, else => |e| return e, }; errdefer file.close(); - const archive = try allocator.create(Archive); - errdefer allocator.destroy(archive); - const name = try allocator.dupe(u8, path); errdefer allocator.free(name); - archive.* = .{ - .allocator = allocator, - .arch = arch, + var archive = Archive{ .name = name, .file = file, }; - archive.parse() catch |err| switch (err) { + archive.parse(allocator, arch) catch |err| switch (err) { error.EndOfStream, error.NotArchive => { - archive.deinit(); - allocator.destroy(archive); + archive.deinit(allocator); return null; }, else => |e| return e, @@ -128,52 +130,28 @@ pub fn createAndParseFromPath(allocator: *Allocator, arch: Arch, path: []const u return archive; } -pub fn deinit(self: *Archive) void { - for (self.toc.keys()) |*key| { - self.allocator.free(key.*); - } - for (self.toc.values()) |*value| { - value.deinit(self.allocator); - } - self.toc.deinit(self.allocator); +pub fn parse(self: *Archive, allocator: *Allocator, arch: Arch) !void { + const reader = self.file.reader(); + self.library_offset = try fat.getLibraryOffset(reader, arch); + try self.file.seekTo(self.library_offset); - if (self.name) |n| { - self.allocator.free(n); - } -} - -pub fn closeFile(self: Archive) void { - if (self.file) |f| { - f.close(); - } -} - -pub fn parse(self: *Archive) !void { - self.library_offset = try fat.getLibraryOffset(self.file.?.reader(), self.arch.?); - - try self.file.?.seekTo(self.library_offset); - - var reader = self.file.?.reader(); const magic = try reader.readBytesNoEof(SARMAG); - if (!mem.eql(u8, &magic, ARMAG)) { log.debug("invalid magic: expected '{s}', found '{s}'", .{ ARMAG, magic }); return error.NotArchive; } self.header = try reader.readStruct(ar_hdr); - if (!mem.eql(u8, &self.header.?.ar_fmag, ARFMAG)) { log.debug("invalid header delimiter: expected '{s}', found '{s}'", .{ ARFMAG, self.header.?.ar_fmag }); return error.NotArchive; } - var embedded_name = try parseName(self.allocator, self.header.?, reader); - log.debug("parsing archive '{s}' at '{s}'", .{ embedded_name, self.name.? }); - defer self.allocator.free(embedded_name); - - try self.parseTableOfContents(reader); + var embedded_name = try parseName(allocator, self.header.?, reader); + log.debug("parsing archive '{s}' at '{s}'", .{ embedded_name, self.name }); + defer allocator.free(embedded_name); + try self.parseTableOfContents(allocator, reader); try reader.context.seekTo(0); } @@ -195,10 +173,10 @@ fn parseName(allocator: *Allocator, header: ar_hdr, reader: anytype) ![]u8 { return name; } -fn parseTableOfContents(self: *Archive, reader: anytype) !void { +fn parseTableOfContents(self: *Archive, allocator: *Allocator, reader: anytype) !void { const symtab_size = try reader.readIntLittle(u32); - var symtab = try self.allocator.alloc(u8, symtab_size); - defer self.allocator.free(symtab); + var symtab = try allocator.alloc(u8, symtab_size); + defer allocator.free(symtab); reader.readNoEof(symtab) catch { log.err("incomplete symbol table: expected symbol table of length 0x{x}", .{symtab_size}); @@ -206,8 +184,8 @@ fn parseTableOfContents(self: *Archive, reader: anytype) !void { }; const strtab_size = try reader.readIntLittle(u32); - var strtab = try self.allocator.alloc(u8, strtab_size); - defer self.allocator.free(strtab); + var strtab = try allocator.alloc(u8, strtab_size); + defer allocator.free(strtab); reader.readNoEof(strtab) catch { log.err("incomplete symbol table: expected string table of length 0x{x}", .{strtab_size}); @@ -225,21 +203,20 @@ fn parseTableOfContents(self: *Archive, reader: anytype) !void { const object_offset = try symtab_reader.readIntLittle(u32); const sym_name = mem.spanZ(@ptrCast([*:0]const u8, strtab.ptr + n_strx)); - const owned_name = try self.allocator.dupe(u8, sym_name); - const res = try self.toc.getOrPut(self.allocator, owned_name); - defer if (res.found_existing) self.allocator.free(owned_name); + const owned_name = try allocator.dupe(u8, sym_name); + const res = try self.toc.getOrPut(allocator, owned_name); + defer if (res.found_existing) allocator.free(owned_name); if (!res.found_existing) { res.value_ptr.* = .{}; } - try res.value_ptr.append(self.allocator, object_offset); + try res.value_ptr.append(allocator, object_offset); } } -/// Caller owns the Object instance. -pub fn parseObject(self: Archive, offset: u32) !*Object { - var reader = self.file.?.reader(); +pub fn parseObject(self: Archive, allocator: *Allocator, arch: Arch, offset: u32) !Object { + const reader = self.file.reader(); try reader.context.seekTo(offset + self.library_offset); const object_header = try reader.readStruct(ar_hdr); @@ -249,29 +226,25 @@ pub fn parseObject(self: Archive, offset: u32) !*Object { return error.MalformedArchive; } - const object_name = try parseName(self.allocator, object_header, reader); - defer self.allocator.free(object_name); + const object_name = try parseName(allocator, object_header, reader); + defer allocator.free(object_name); - log.debug("extracting object '{s}' from archive '{s}'", .{ object_name, self.name.? }); + log.debug("extracting object '{s}' from archive '{s}'", .{ object_name, self.name }); const name = name: { var buffer: [std.fs.MAX_PATH_BYTES]u8 = undefined; - const path = try std.os.realpath(self.name.?, &buffer); - break :name try std.fmt.allocPrint(self.allocator, "{s}({s})", .{ path, object_name }); + const path = try std.os.realpath(self.name, &buffer); + break :name try std.fmt.allocPrint(allocator, "{s}({s})", .{ path, object_name }); }; - var object = try self.allocator.create(Object); - errdefer self.allocator.destroy(object); - - object.* = .{ - .allocator = self.allocator, - .arch = self.arch.?, - .file = try fs.cwd().openFile(self.name.?, .{}), + var object = Object{ + .file = try fs.cwd().openFile(self.name, .{}), .name = name, .file_offset = @intCast(u32, try reader.context.getPos()), .mtime = try self.header.?.date(), }; - try object.parse(); + + try object.parse(allocator, arch); try reader.context.seekTo(0); return object; diff --git a/src/link/MachO/CodeSignature.zig b/src/link/MachO/CodeSignature.zig index d0dd47be92..6dd7e556b5 100644 --- a/src/link/MachO/CodeSignature.zig +++ b/src/link/MachO/CodeSignature.zig @@ -46,8 +46,6 @@ const CodeDirectory = struct { } }; -allocator: *Allocator, - /// Code signature blob header. inner: macho.SuperBlob = .{ .magic = macho.CSMAGIC_EMBEDDED_SIGNATURE, @@ -58,24 +56,15 @@ inner: macho.SuperBlob = .{ /// CodeDirectory header which holds the hash of the binary. cdir: ?CodeDirectory = null, -/// Page size is dependent on the target cpu architecture. -/// For x86_64 that's 4KB, whereas for aarch64, that's 16KB. -page_size: u16, - -pub fn init(allocator: *Allocator, page_size: u16) CodeSignature { - return .{ - .allocator = allocator, - .page_size = page_size, - }; -} - pub fn calcAdhocSignature( self: *CodeSignature, + allocator: *Allocator, file: fs.File, id: []const u8, text_segment: macho.segment_command_64, code_sig_cmd: macho.linkedit_data_command, output_mode: std.builtin.OutputMode, + page_size: u16, ) !void { const execSegBase: u64 = text_segment.fileoff; const execSegLimit: u64 = text_segment.filesize; @@ -95,7 +84,7 @@ pub fn calcAdhocSignature( .hashSize = hash_size, .hashType = macho.CS_HASHTYPE_SHA256, .platform = 0, - .pageSize = @truncate(u8, std.math.log2(self.page_size)), + .pageSize = @truncate(u8, std.math.log2(page_size)), .spare2 = 0, .scatterOffset = 0, .teamOffset = 0, @@ -107,13 +96,13 @@ pub fn calcAdhocSignature( }, }; - const total_pages = mem.alignForward(file_size, self.page_size) / self.page_size; + const total_pages = mem.alignForward(file_size, page_size) / page_size; var hash: [hash_size]u8 = undefined; - var buffer = try self.allocator.alloc(u8, self.page_size); - defer self.allocator.free(buffer); + var buffer = try allocator.alloc(u8, page_size); + defer allocator.free(buffer); - try cdir.data.ensureCapacity(self.allocator, total_pages * hash_size + id.len + 1); + try cdir.data.ensureCapacity(allocator, total_pages * hash_size + id.len + 1); // 1. Save the identifier and update offsets cdir.inner.identOffset = cdir.inner.length; @@ -126,8 +115,8 @@ pub fn calcAdhocSignature( cdir.inner.hashOffset = cdir.inner.identOffset + @intCast(u32, id.len) + 1; var i: usize = 0; while (i < total_pages) : (i += 1) { - const fstart = i * self.page_size; - const fsize = if (fstart + self.page_size > file_size) file_size - fstart else self.page_size; + const fstart = i * page_size; + const fsize = if (fstart + page_size > file_size) file_size - fstart else page_size; const len = try file.preadAll(buffer, fstart); assert(fsize <= len); @@ -156,9 +145,9 @@ pub fn write(self: CodeSignature, writer: anytype) !void { try self.cdir.?.write(writer); } -pub fn deinit(self: *CodeSignature) void { +pub fn deinit(self: *CodeSignature, allocator: *Allocator) void { if (self.cdir) |*cdir| { - cdir.data.deinit(self.allocator); + cdir.data.deinit(allocator); } } @@ -174,8 +163,8 @@ fn writeBlobIndex(tt: u32, offset: u32, writer: anytype) !void { } test "CodeSignature header" { - var code_sig = CodeSignature.init(testing.allocator, 0x1000); - defer code_sig.deinit(); + var code_sig: CodeSignature = .{}; + defer code_sig.deinit(testing.allocator); var buffer: [@sizeOf(macho.SuperBlob)]u8 = undefined; var stream = std.io.fixedBufferStream(&buffer); diff --git a/src/link/MachO/Dylib.zig b/src/link/MachO/Dylib.zig index 0e7f95a3d5..4763203c3b 100644 --- a/src/link/MachO/Dylib.zig +++ b/src/link/MachO/Dylib.zig @@ -9,22 +9,18 @@ const macho = std.macho; const math = std.math; const mem = std.mem; const fat = @import("fat.zig"); +const commands = @import("commands.zig"); const Allocator = mem.Allocator; const Arch = std.Target.Cpu.Arch; const LibStub = @import("../tapi.zig").LibStub; +const LoadCommand = commands.LoadCommand; const MachO = @import("../MachO.zig"); -usingnamespace @import("commands.zig"); +file: fs.File, +name: []const u8, -allocator: *Allocator, -arch: ?Arch = null, header: ?macho.mach_header_64 = null, -file: ?fs.File = null, -name: ?[]const u8 = null, -syslibroot: ?[]const u8 = null, - -ordinal: ?u16 = null, // The actual dylib contents we care about linking with will be embedded at // an offset within a file if we are linking against a fat lib @@ -61,7 +57,7 @@ pub const Id = struct { }; } - pub fn fromLoadCommand(allocator: *Allocator, lc: GenericCommandWithData(macho.dylib_command)) !Id { + pub fn fromLoadCommand(allocator: *Allocator, lc: commands.GenericCommandWithData(macho.dylib_command)) !Id { const dylib = lc.inner.dylib; const dylib_name = @ptrCast([*:0]const u8, lc.data[dylib.name - @sizeOf(macho.dylib_command) ..]); const name = try allocator.dupe(u8, mem.spanZ(dylib_name)); @@ -110,7 +106,7 @@ pub const Id = struct { var out: u32 = 0; var values: [3][]const u8 = undefined; - var split = mem.split(string, "."); + var split = mem.split(u8, string, "."); var count: u4 = 0; while (split.next()) |value| { if (count > 2) { @@ -150,39 +146,32 @@ pub fn createAndParseFromPath( arch: Arch, path: []const u8, opts: CreateOpts, -) Error!?[]*Dylib { +) Error!?[]Dylib { const file = fs.cwd().openFile(path, .{}) catch |err| switch (err) { error.FileNotFound => return null, else => |e| return e, }; errdefer file.close(); - const dylib = try allocator.create(Dylib); - errdefer allocator.destroy(dylib); - const name = try allocator.dupe(u8, path); errdefer allocator.free(name); - dylib.* = .{ - .allocator = allocator, - .arch = arch, + var dylib = Dylib{ .name = name, .file = file, - .syslibroot = opts.syslibroot, }; - dylib.parse() catch |err| switch (err) { + dylib.parse(allocator, arch) catch |err| switch (err) { error.EndOfStream, error.NotDylib => { try file.seekTo(0); var lib_stub = LibStub.loadFromFile(allocator, file) catch { - dylib.deinit(); - allocator.destroy(dylib); + dylib.deinit(allocator); return null; }; defer lib_stub.deinit(); - try dylib.parseFromStub(lib_stub); + try dylib.parseFromStub(allocator, arch, lib_stub); }, else => |e| return e, }; @@ -195,60 +184,50 @@ pub fn createAndParseFromPath( log.warn(" | dylib version: {}", .{dylib.id.?.current_version}); // TODO maybe this should be an error and facilitate auto-cleanup? - dylib.deinit(); - allocator.destroy(dylib); + dylib.deinit(allocator); return null; } } - var dylibs = std.ArrayList(*Dylib).init(allocator); + var dylibs = std.ArrayList(Dylib).init(allocator); defer dylibs.deinit(); try dylibs.append(dylib); - try dylib.parseDependentLibs(&dylibs); + try dylib.parseDependentLibs(allocator, arch, &dylibs, opts.syslibroot); return dylibs.toOwnedSlice(); } -pub fn deinit(self: *Dylib) void { +pub fn deinit(self: *Dylib, allocator: *Allocator) void { for (self.load_commands.items) |*lc| { - lc.deinit(self.allocator); + lc.deinit(allocator); } - self.load_commands.deinit(self.allocator); + self.load_commands.deinit(allocator); for (self.symbols.keys()) |key| { - self.allocator.free(key); + allocator.free(key); } - self.symbols.deinit(self.allocator); + self.symbols.deinit(allocator); for (self.dependent_libs.items) |*id| { - id.deinit(self.allocator); - } - self.dependent_libs.deinit(self.allocator); - - if (self.name) |name| { - self.allocator.free(name); + id.deinit(allocator); } + self.dependent_libs.deinit(allocator); + allocator.free(self.name); if (self.id) |*id| { - id.deinit(self.allocator); + id.deinit(allocator); } } -pub fn closeFile(self: Dylib) void { - if (self.file) |file| { - file.close(); - } -} +pub fn parse(self: *Dylib, allocator: *Allocator, arch: Arch) !void { + log.debug("parsing shared library '{s}'", .{self.name}); -pub fn parse(self: *Dylib) !void { - log.debug("parsing shared library '{s}'", .{self.name.?}); + self.library_offset = try fat.getLibraryOffset(self.file.reader(), arch); - self.library_offset = try fat.getLibraryOffset(self.file.?.reader(), self.arch.?); + try self.file.seekTo(self.library_offset); - try self.file.?.seekTo(self.library_offset); - - var reader = self.file.?.reader(); + var reader = self.file.reader(); self.header = try reader.readStruct(macho.mach_header_64); if (self.header.?.filetype != macho.MH_DYLIB) { @@ -258,24 +237,24 @@ pub fn parse(self: *Dylib) !void { const this_arch: Arch = try fat.decodeArch(self.header.?.cputype, true); - if (this_arch != self.arch.?) { - log.err("mismatched cpu architecture: expected {s}, found {s}", .{ self.arch.?, this_arch }); + if (this_arch != arch) { + log.err("mismatched cpu architecture: expected {s}, found {s}", .{ arch, this_arch }); return error.MismatchedCpuArchitecture; } - try self.readLoadCommands(reader); - try self.parseId(); - try self.parseSymbols(); + try self.readLoadCommands(allocator, reader); + try self.parseId(allocator); + try self.parseSymbols(allocator); } -fn readLoadCommands(self: *Dylib, reader: anytype) !void { +fn readLoadCommands(self: *Dylib, allocator: *Allocator, reader: anytype) !void { const should_lookup_reexports = self.header.?.flags & macho.MH_NO_REEXPORTED_DYLIBS == 0; - try self.load_commands.ensureCapacity(self.allocator, self.header.?.ncmds); + try self.load_commands.ensureCapacity(allocator, self.header.?.ncmds); var i: u16 = 0; while (i < self.header.?.ncmds) : (i += 1) { - var cmd = try LoadCommand.read(self.allocator, reader); + var cmd = try LoadCommand.read(allocator, reader); switch (cmd.cmd()) { macho.LC_SYMTAB => { self.symtab_cmd_index = i; @@ -289,8 +268,8 @@ fn readLoadCommands(self: *Dylib, reader: anytype) !void { macho.LC_REEXPORT_DYLIB => { if (should_lookup_reexports) { // Parse install_name to dependent dylib. - const id = try Id.fromLoadCommand(self.allocator, cmd.Dylib); - try self.dependent_libs.append(self.allocator, id); + const id = try Id.fromLoadCommand(allocator, cmd.Dylib); + try self.dependent_libs.append(allocator, id); } }, else => { @@ -301,27 +280,27 @@ fn readLoadCommands(self: *Dylib, reader: anytype) !void { } } -fn parseId(self: *Dylib) !void { +fn parseId(self: *Dylib, allocator: *Allocator) !void { const index = self.id_cmd_index orelse { log.debug("no LC_ID_DYLIB load command found; using hard-coded defaults...", .{}); - self.id = try Id.default(self.allocator, self.name.?); + self.id = try Id.default(allocator, self.name); return; }; - self.id = try Id.fromLoadCommand(self.allocator, self.load_commands.items[index].Dylib); + self.id = try Id.fromLoadCommand(allocator, self.load_commands.items[index].Dylib); } -fn parseSymbols(self: *Dylib) !void { +fn parseSymbols(self: *Dylib, allocator: *Allocator) !void { const index = self.symtab_cmd_index orelse return; const symtab_cmd = self.load_commands.items[index].Symtab; - var symtab = try self.allocator.alloc(u8, @sizeOf(macho.nlist_64) * symtab_cmd.nsyms); - defer self.allocator.free(symtab); - _ = try self.file.?.preadAll(symtab, symtab_cmd.symoff + self.library_offset); + var symtab = try allocator.alloc(u8, @sizeOf(macho.nlist_64) * symtab_cmd.nsyms); + defer allocator.free(symtab); + _ = try self.file.preadAll(symtab, symtab_cmd.symoff + self.library_offset); const slice = @alignCast(@alignOf(macho.nlist_64), mem.bytesAsSlice(macho.nlist_64, symtab)); - var strtab = try self.allocator.alloc(u8, symtab_cmd.strsize); - defer self.allocator.free(strtab); - _ = try self.file.?.preadAll(strtab, symtab_cmd.stroff + self.library_offset); + var strtab = try allocator.alloc(u8, symtab_cmd.strsize); + defer allocator.free(strtab); + _ = try self.file.preadAll(strtab, symtab_cmd.stroff + self.library_offset); for (slice) |sym| { const add_to_symtab = MachO.symbolIsExt(sym) and (MachO.symbolIsSect(sym) or MachO.symbolIsIndr(sym)); @@ -329,8 +308,8 @@ fn parseSymbols(self: *Dylib) !void { if (!add_to_symtab) continue; const sym_name = mem.spanZ(@ptrCast([*:0]const u8, strtab.ptr + sym.n_strx)); - const name = try self.allocator.dupe(u8, sym_name); - try self.symbols.putNoClobber(self.allocator, name, {}); + const name = try allocator.dupe(u8, sym_name); + try self.symbols.putNoClobber(allocator, name, {}); } } @@ -341,26 +320,26 @@ fn hasTarget(targets: []const []const u8, target: []const u8) bool { return false; } -fn addObjCClassSymbols(self: *Dylib, sym_name: []const u8) !void { +fn addObjCClassSymbols(self: *Dylib, allocator: *Allocator, sym_name: []const u8) !void { const expanded = &[_][]const u8{ - try std.fmt.allocPrint(self.allocator, "_OBJC_CLASS_$_{s}", .{sym_name}), - try std.fmt.allocPrint(self.allocator, "_OBJC_METACLASS_$_{s}", .{sym_name}), + try std.fmt.allocPrint(allocator, "_OBJC_CLASS_$_{s}", .{sym_name}), + try std.fmt.allocPrint(allocator, "_OBJC_METACLASS_$_{s}", .{sym_name}), }; for (expanded) |sym| { if (self.symbols.contains(sym)) continue; - try self.symbols.putNoClobber(self.allocator, sym, .{}); + try self.symbols.putNoClobber(allocator, sym, .{}); } } -pub fn parseFromStub(self: *Dylib, lib_stub: LibStub) !void { +pub fn parseFromStub(self: *Dylib, allocator: *Allocator, arch: Arch, lib_stub: LibStub) !void { if (lib_stub.inner.len == 0) return error.EmptyStubFile; - log.debug("parsing shared library from stub '{s}'", .{self.name.?}); + log.debug("parsing shared library from stub '{s}'", .{self.name}); const umbrella_lib = lib_stub.inner[0]; - var id = try Id.default(self.allocator, umbrella_lib.install_name); + var id = try Id.default(allocator, umbrella_lib.install_name); if (umbrella_lib.current_version) |version| { try id.parseCurrentVersion(version); } @@ -369,13 +348,13 @@ pub fn parseFromStub(self: *Dylib, lib_stub: LibStub) !void { } self.id = id; - const target_string: []const u8 = switch (self.arch.?) { + const target_string: []const u8 = switch (arch) { .aarch64 => "arm64-macos", .x86_64 => "x86_64-macos", else => unreachable, }; - var umbrella_libs = std.StringHashMap(void).init(self.allocator); + var umbrella_libs = std.StringHashMap(void).init(allocator); defer umbrella_libs.deinit(); for (lib_stub.inner) |stub, stub_index| { @@ -395,13 +374,13 @@ pub fn parseFromStub(self: *Dylib, lib_stub: LibStub) !void { if (exp.symbols) |symbols| { for (symbols) |sym_name| { if (self.symbols.contains(sym_name)) continue; - try self.symbols.putNoClobber(self.allocator, try self.allocator.dupe(u8, sym_name), {}); + try self.symbols.putNoClobber(allocator, try allocator.dupe(u8, sym_name), {}); } } if (exp.objc_classes) |classes| { for (classes) |sym_name| { - try self.addObjCClassSymbols(sym_name); + try self.addObjCClassSymbols(allocator, sym_name); } } } @@ -414,13 +393,13 @@ pub fn parseFromStub(self: *Dylib, lib_stub: LibStub) !void { if (reexp.symbols) |symbols| { for (symbols) |sym_name| { if (self.symbols.contains(sym_name)) continue; - try self.symbols.putNoClobber(self.allocator, try self.allocator.dupe(u8, sym_name), {}); + try self.symbols.putNoClobber(allocator, try allocator.dupe(u8, sym_name), {}); } } if (reexp.objc_classes) |classes| { for (classes) |sym_name| { - try self.addObjCClassSymbols(sym_name); + try self.addObjCClassSymbols(allocator, sym_name); } } } @@ -428,7 +407,7 @@ pub fn parseFromStub(self: *Dylib, lib_stub: LibStub) !void { if (stub.objc_classes) |classes| { for (classes) |sym_name| { - try self.addObjCClassSymbols(sym_name); + try self.addObjCClassSymbols(allocator, sym_name); } } } @@ -451,15 +430,21 @@ pub fn parseFromStub(self: *Dylib, lib_stub: LibStub) !void { log.debug(" | {s}", .{lib}); - const dep_id = try Id.default(self.allocator, lib); - try self.dependent_libs.append(self.allocator, dep_id); + const dep_id = try Id.default(allocator, lib); + try self.dependent_libs.append(allocator, dep_id); } } } } } -pub fn parseDependentLibs(self: *Dylib, out: *std.ArrayList(*Dylib)) !void { +pub fn parseDependentLibs( + self: *Dylib, + allocator: *Allocator, + arch: Arch, + out: *std.ArrayList(Dylib), + syslibroot: ?[]const u8, +) !void { outer: for (self.dependent_libs.items) |id| { const has_ext = blk: { const basename = fs.path.basename(id.name); @@ -472,31 +457,32 @@ pub fn parseDependentLibs(self: *Dylib, out: *std.ArrayList(*Dylib)) !void { } else id.name; for (&[_][]const u8{ extension, ".tbd" }) |ext| { - const with_ext = try std.fmt.allocPrint(self.allocator, "{s}{s}", .{ + const with_ext = try std.fmt.allocPrint(allocator, "{s}{s}", .{ without_ext, ext, }); - defer self.allocator.free(with_ext); + defer allocator.free(with_ext); - const full_path = if (self.syslibroot) |syslibroot| - try fs.path.join(self.allocator, &.{ syslibroot, with_ext }) + const full_path = if (syslibroot) |root| + try fs.path.join(allocator, &.{ root, with_ext }) else with_ext; - defer if (self.syslibroot) |_| self.allocator.free(full_path); + defer if (syslibroot) |_| allocator.free(full_path); log.debug("trying dependency at fully resolved path {s}", .{full_path}); const dylibs = (try createAndParseFromPath( - self.allocator, - self.arch.?, + allocator, + arch, full_path, .{ .id = id, - .syslibroot = self.syslibroot, + .syslibroot = syslibroot, }, )) orelse { continue; }; + defer allocator.free(dylibs); try out.appendSlice(dylibs); diff --git a/src/link/MachO/Object.zig b/src/link/MachO/Object.zig index fc17669e04..2e6a20ad4b 100644 --- a/src/link/MachO/Object.zig +++ b/src/link/MachO/Object.zig @@ -10,20 +10,22 @@ const macho = std.macho; const math = std.math; const mem = std.mem; const sort = std.sort; +const commands = @import("commands.zig"); +const segmentName = commands.segmentName; +const sectionName = commands.sectionName; const Allocator = mem.Allocator; const Arch = std.Target.Cpu.Arch; +const LoadCommand = commands.LoadCommand; const MachO = @import("../MachO.zig"); const TextBlock = @import("TextBlock.zig"); -usingnamespace @import("commands.zig"); +file: fs.File, +name: []const u8, -allocator: *Allocator, -arch: ?Arch = null, -header: ?macho.mach_header_64 = null, -file: ?fs.File = null, file_offset: ?u32 = null, -name: ?[]const u8 = null, + +header: ?macho.mach_header_64 = null, load_commands: std.ArrayListUnmanaged(LoadCommand) = .{}, @@ -125,30 +127,51 @@ const DebugInfo = struct { } }; -pub fn createAndParseFromPath(allocator: *Allocator, arch: Arch, path: []const u8) !?*Object { +pub fn deinit(self: *Object, allocator: *Allocator) void { + for (self.load_commands.items) |*lc| { + lc.deinit(allocator); + } + self.load_commands.deinit(allocator); + self.data_in_code_entries.deinit(allocator); + self.symtab.deinit(allocator); + self.strtab.deinit(allocator); + self.text_blocks.deinit(allocator); + self.sections_as_symbols.deinit(allocator); + self.symbol_mapping.deinit(allocator); + self.reverse_symbol_mapping.deinit(allocator); + allocator.free(self.name); + + if (self.debug_info) |*db| { + db.deinit(allocator); + } + + if (self.tu_name) |n| { + allocator.free(n); + } + + if (self.tu_comp_dir) |n| { + allocator.free(n); + } +} + +pub fn createAndParseFromPath(allocator: *Allocator, arch: Arch, path: []const u8) !?Object { const file = fs.cwd().openFile(path, .{}) catch |err| switch (err) { error.FileNotFound => return null, else => |e| return e, }; errdefer file.close(); - const object = try allocator.create(Object); - errdefer allocator.destroy(object); - const name = try allocator.dupe(u8, path); errdefer allocator.free(name); - object.* = .{ - .allocator = allocator, - .arch = arch, + var object = Object{ .name = name, .file = file, }; - object.parse() catch |err| switch (err) { + object.parse(allocator, arch) catch |err| switch (err) { error.EndOfStream, error.NotObject => { - object.deinit(); - allocator.destroy(object); + object.deinit(allocator); return null; }, else => |e| return e, @@ -157,52 +180,18 @@ pub fn createAndParseFromPath(allocator: *Allocator, arch: Arch, path: []const u return object; } -pub fn deinit(self: *Object) void { - for (self.load_commands.items) |*lc| { - lc.deinit(self.allocator); - } - self.load_commands.deinit(self.allocator); - self.data_in_code_entries.deinit(self.allocator); - self.symtab.deinit(self.allocator); - self.strtab.deinit(self.allocator); - self.text_blocks.deinit(self.allocator); - self.sections_as_symbols.deinit(self.allocator); - self.symbol_mapping.deinit(self.allocator); - self.reverse_symbol_mapping.deinit(self.allocator); - - if (self.debug_info) |*db| { - db.deinit(self.allocator); - } - - if (self.tu_name) |n| { - self.allocator.free(n); - } - - if (self.tu_comp_dir) |n| { - self.allocator.free(n); - } - - if (self.name) |n| { - self.allocator.free(n); - } -} - -pub fn closeFile(self: Object) void { - if (self.file) |f| { - f.close(); - } -} - -pub fn parse(self: *Object) !void { - var reader = self.file.?.reader(); +pub fn parse(self: *Object, allocator: *Allocator, arch: Arch) !void { + const reader = self.file.reader(); if (self.file_offset) |offset| { try reader.context.seekTo(offset); } const header = try reader.readStruct(macho.mach_header_64); - if (header.filetype != macho.MH_OBJECT) { - log.debug("invalid filetype: expected 0x{x}, found 0x{x}", .{ macho.MH_OBJECT, header.filetype }); + log.debug("invalid filetype: expected 0x{x}, found 0x{x}", .{ + macho.MH_OBJECT, + header.filetype, + }); return error.NotObject; } @@ -214,26 +203,28 @@ pub fn parse(self: *Object) !void { return error.UnsupportedCpuArchitecture; }, }; - if (this_arch != self.arch.?) { - log.err("mismatched cpu architecture: expected {s}, found {s}", .{ self.arch.?, this_arch }); + if (this_arch != arch) { + log.err("mismatched cpu architecture: expected {s}, found {s}", .{ arch, this_arch }); return error.MismatchedCpuArchitecture; } self.header = header; - try self.readLoadCommands(reader); - try self.parseSymtab(); - try self.parseDataInCode(); - try self.parseDebugInfo(); + try self.readLoadCommands(allocator, reader); + try self.parseSymtab(allocator); + try self.parseDataInCode(allocator); + try self.parseDebugInfo(allocator); } -pub fn readLoadCommands(self: *Object, reader: anytype) !void { +pub fn readLoadCommands(self: *Object, allocator: *Allocator, reader: anytype) !void { + const header = self.header orelse unreachable; // Unreachable here signifies a fatal unexplored condition. const offset = self.file_offset orelse 0; - try self.load_commands.ensureCapacity(self.allocator, self.header.?.ncmds); + + try self.load_commands.ensureCapacity(allocator, header.ncmds); var i: u16 = 0; - while (i < self.header.?.ncmds) : (i += 1) { - var cmd = try LoadCommand.read(self.allocator, reader); + while (i < header.ncmds) : (i += 1) { + var cmd = try LoadCommand.read(allocator, reader); switch (cmd.cmd()) { macho.LC_SEGMENT_64 => { self.segment_cmd_index = i; @@ -347,26 +338,25 @@ fn filterDice(dices: []macho.data_in_code_entry, start_addr: u64, end_addr: u64) return dices[start..end]; } -const TextBlockParser = struct { +const Context = struct { allocator: *Allocator, + object: *Object, + macho_file: *MachO, + match: MachO.MatchingSection, +}; + +const TextBlockParser = struct { section: macho.section_64, code: []u8, relocs: []macho.relocation_info, - object: *Object, - macho_file: *MachO, nlists: []NlistWithIndex, index: u32 = 0, - match: MachO.MatchingSection, - fn peek(self: *TextBlockParser) ?NlistWithIndex { + fn peek(self: TextBlockParser) ?NlistWithIndex { return if (self.index + 1 < self.nlists.len) self.nlists[self.index + 1] else null; } - const SeniorityContext = struct { - object: *Object, - }; - - fn lessThanBySeniority(context: SeniorityContext, lhs: NlistWithIndex, rhs: NlistWithIndex) bool { + fn lessThanBySeniority(context: Context, lhs: NlistWithIndex, rhs: NlistWithIndex) bool { if (!MachO.symbolIsExt(rhs.nlist)) { return MachO.symbolIsTemp(lhs.nlist, context.object.getString(lhs.nlist.n_strx)); } else if (MachO.symbolIsPext(rhs.nlist) or MachO.symbolIsWeakDef(rhs.nlist)) { @@ -376,10 +366,10 @@ const TextBlockParser = struct { } } - pub fn next(self: *TextBlockParser) !?*TextBlock { + pub fn next(self: *TextBlockParser, context: Context) !?*TextBlock { if (self.index == self.nlists.len) return null; - var aliases = std.ArrayList(NlistWithIndex).init(self.allocator); + var aliases = std.ArrayList(NlistWithIndex).init(context.allocator); defer aliases.deinit(); const next_nlist: ?NlistWithIndex = blk: while (true) { @@ -397,7 +387,7 @@ const TextBlockParser = struct { } else null; for (aliases.items) |*nlist_with_index| { - nlist_with_index.index = self.object.symbol_mapping.get(nlist_with_index.index) orelse unreachable; + nlist_with_index.index = context.object.symbol_mapping.get(nlist_with_index.index) orelse unreachable; } if (aliases.items.len > 1) { @@ -405,14 +395,14 @@ const TextBlockParser = struct { sort.sort( NlistWithIndex, aliases.items, - SeniorityContext{ .object = self.object }, + context, TextBlockParser.lessThanBySeniority, ); } const senior_nlist = aliases.pop(); - const senior_sym = &self.macho_file.locals.items[senior_nlist.index]; - senior_sym.n_sect = self.macho_file.section_to_ordinal.get(self.match) orelse unreachable; + const senior_sym = &context.macho_file.locals.items[senior_nlist.index]; + senior_sym.n_sect = @intCast(u8, context.macho_file.section_ordinals.getIndex(context.match).? + 1); const start_addr = senior_nlist.nlist.n_value - self.section.addr; const end_addr = if (next_nlist) |n| n.nlist.n_value - self.section.addr else self.section.size; @@ -426,7 +416,7 @@ const TextBlockParser = struct { else max_align; - const stab: ?TextBlock.Stab = if (self.object.debug_info) |di| blk: { + const stab: ?TextBlock.Stab = if (context.object.debug_info) |di| blk: { // TODO there has to be a better to handle this. for (di.inner.func_list.items) |func| { if (func.pc_range) |range| { @@ -442,35 +432,37 @@ const TextBlockParser = struct { break :blk .static; } else null; - const block = try self.macho_file.base.allocator.create(TextBlock); + const block = try context.allocator.create(TextBlock); block.* = TextBlock.empty; block.local_sym_index = senior_nlist.index; block.stab = stab; block.size = size; block.alignment = actual_align; - try self.macho_file.managed_blocks.append(self.macho_file.base.allocator, block); + try context.macho_file.managed_blocks.append(context.allocator, block); - try block.code.appendSlice(self.macho_file.base.allocator, code); + try block.code.appendSlice(context.allocator, code); - try block.aliases.ensureTotalCapacity(self.macho_file.base.allocator, aliases.items.len); + try block.aliases.ensureTotalCapacity(context.allocator, aliases.items.len); for (aliases.items) |alias| { block.aliases.appendAssumeCapacity(alias.index); - const sym = &self.macho_file.locals.items[alias.index]; - sym.n_sect = self.macho_file.section_to_ordinal.get(self.match) orelse unreachable; + const sym = &context.macho_file.locals.items[alias.index]; + sym.n_sect = @intCast(u8, context.macho_file.section_ordinals.getIndex(context.match).? + 1); } - try block.parseRelocsFromObject(self.macho_file.base.allocator, self.relocs, self.object, .{ + try block.parseRelocs(self.relocs, .{ .base_addr = start_addr, - .macho_file = self.macho_file, + .allocator = context.allocator, + .object = context.object, + .macho_file = context.macho_file, }); - if (self.macho_file.has_dices) { + if (context.macho_file.has_dices) { const dices = filterDice( - self.object.data_in_code_entries.items, + context.object.data_in_code_entries.items, senior_nlist.nlist.n_value, senior_nlist.nlist.n_value + size, ); - try block.dices.ensureTotalCapacity(self.macho_file.base.allocator, dices.len); + try block.dices.ensureTotalCapacity(context.allocator, dices.len); for (dices) |dice| { block.dices.appendAssumeCapacity(.{ @@ -487,16 +479,21 @@ const TextBlockParser = struct { } }; -pub fn parseTextBlocks(self: *Object, macho_file: *MachO) !void { +pub fn parseTextBlocks( + self: *Object, + allocator: *Allocator, + object_id: u16, + macho_file: *MachO, +) !void { const seg = self.load_commands.items[self.segment_cmd_index.?].Segment; - log.debug("analysing {s}", .{self.name.?}); + log.debug("analysing {s}", .{self.name}); // You would expect that the symbol table is at least pre-sorted based on symbol's type: // local < extern defined < undefined. Unfortunately, this is not guaranteed! For instance, // the GO compiler does not necessarily respect that therefore we sort immediately by type // and address within. - var sorted_all_nlists = std.ArrayList(NlistWithIndex).init(self.allocator); + var sorted_all_nlists = std.ArrayList(NlistWithIndex).init(allocator); defer sorted_all_nlists.deinit(); try sorted_all_nlists.ensureTotalCapacity(self.symtab.items.len); @@ -540,14 +537,14 @@ pub fn parseTextBlocks(self: *Object, macho_file: *MachO) !void { }; // Read section's code - var code = try self.allocator.alloc(u8, @intCast(usize, sect.size)); - defer self.allocator.free(code); - _ = try self.file.?.preadAll(code, sect.offset); + var code = try allocator.alloc(u8, @intCast(usize, sect.size)); + defer allocator.free(code); + _ = try self.file.preadAll(code, sect.offset); // Read section's list of relocations - var raw_relocs = try self.allocator.alloc(u8, sect.nreloc * @sizeOf(macho.relocation_info)); - defer self.allocator.free(raw_relocs); - _ = try self.file.?.preadAll(raw_relocs, sect.reloff); + var raw_relocs = try allocator.alloc(u8, sect.nreloc * @sizeOf(macho.relocation_info)); + defer allocator.free(raw_relocs); + _ = try self.file.preadAll(raw_relocs, sect.reloff); const relocs = mem.bytesAsSlice(macho.relocation_info, raw_relocs); // Symbols within this section only. @@ -579,46 +576,48 @@ pub fn parseTextBlocks(self: *Object, macho_file: *MachO) !void { // as a temporary symbol and insert the matching TextBlock. const first_nlist = filtered_nlists[0].nlist; if (first_nlist.n_value > sect.addr) { - const sym_name = try std.fmt.allocPrint(self.allocator, "l_{s}_{s}_{s}", .{ - self.name.?, + const sym_name = try std.fmt.allocPrint(allocator, "l_{s}_{s}_{s}", .{ + self.name, segmentName(sect), sectionName(sect), }); - defer self.allocator.free(sym_name); + defer allocator.free(sym_name); const block_local_sym_index = self.sections_as_symbols.get(sect_id) orelse blk: { const block_local_sym_index = @intCast(u32, macho_file.locals.items.len); - try macho_file.locals.append(macho_file.base.allocator, .{ + try macho_file.locals.append(allocator, .{ .n_strx = try macho_file.makeString(sym_name), .n_type = macho.N_SECT, - .n_sect = macho_file.section_to_ordinal.get(match) orelse unreachable, + .n_sect = @intCast(u8, macho_file.section_ordinals.getIndex(match).? + 1), .n_desc = 0, .n_value = sect.addr, }); - try self.sections_as_symbols.putNoClobber(self.allocator, sect_id, block_local_sym_index); + try self.sections_as_symbols.putNoClobber(allocator, sect_id, block_local_sym_index); break :blk block_local_sym_index; }; const block_code = code[0 .. first_nlist.n_value - sect.addr]; const block_size = block_code.len; - const block = try macho_file.base.allocator.create(TextBlock); + const block = try allocator.create(TextBlock); block.* = TextBlock.empty; block.local_sym_index = block_local_sym_index; block.size = block_size; block.alignment = sect.@"align"; - try macho_file.managed_blocks.append(macho_file.base.allocator, block); + try macho_file.managed_blocks.append(allocator, block); - try block.code.appendSlice(macho_file.base.allocator, block_code); + try block.code.appendSlice(allocator, block_code); - try block.parseRelocsFromObject(self.allocator, relocs, self, .{ + try block.parseRelocs(relocs, .{ .base_addr = 0, + .allocator = allocator, + .object = self, .macho_file = macho_file, }); if (macho_file.has_dices) { const dices = filterDice(self.data_in_code_entries.items, sect.addr, sect.addr + block_size); - try block.dices.ensureTotalCapacity(macho_file.base.allocator, dices.len); + try block.dices.ensureTotalCapacity(allocator, dices.len); for (dices) |dice| { block.dices.appendAssumeCapacity(.{ @@ -645,24 +644,25 @@ pub fn parseTextBlocks(self: *Object, macho_file: *MachO) !void { block.prev = last.*; last.* = block; } else { - try macho_file.blocks.putNoClobber(macho_file.base.allocator, match, block); + try macho_file.blocks.putNoClobber(allocator, match, block); } - try self.text_blocks.append(self.allocator, block); + try self.text_blocks.append(allocator, block); } var parser = TextBlockParser{ - .allocator = self.allocator, .section = sect, .code = code, .relocs = relocs, - .object = self, - .macho_file = macho_file, .nlists = filtered_nlists, - .match = match, }; - while (try parser.next()) |block| { + while (try parser.next(.{ + .allocator = allocator, + .object = self, + .macho_file = macho_file, + .match = match, + })) |block| { const sym = macho_file.locals.items[block.local_sym_index]; const is_ext = blk: { const orig_sym_id = self.reverse_symbol_mapping.get(block.local_sym_index) orelse unreachable; @@ -671,13 +671,14 @@ pub fn parseTextBlocks(self: *Object, macho_file: *MachO) !void { if (is_ext) { if (macho_file.symbol_resolver.get(sym.n_strx)) |resolv| { assert(resolv.where == .global); - const global_object = macho_file.objects.items[resolv.file]; - if (global_object != self) { + if (resolv.file != object_id) { log.debug("deduping definition of {s} in {s}", .{ macho_file.getString(sym.n_strx), - self.name.?, + self.name, + }); + log.debug(" already defined in {s}", .{ + macho_file.objects.items[resolv.file].name, }); - log.debug(" already defined in {s}", .{global_object.name.?}); continue; } } @@ -688,7 +689,7 @@ pub fn parseTextBlocks(self: *Object, macho_file: *MachO) !void { // In x86_64 relocs, it can so happen that the compiler refers to the same // atom by both the actual assigned symbol and the start of the section. In this // case, we need to link the two together so add an alias. - try block.aliases.append(macho_file.base.allocator, alias); + try block.aliases.append(allocator, alias); } } @@ -708,10 +709,10 @@ pub fn parseTextBlocks(self: *Object, macho_file: *MachO) !void { block.prev = last.*; last.* = block; } else { - try macho_file.blocks.putNoClobber(macho_file.base.allocator, match, block); + try macho_file.blocks.putNoClobber(allocator, match, block); } - try self.text_blocks.append(self.allocator, block); + try self.text_blocks.append(allocator, block); } break :next; @@ -720,43 +721,45 @@ pub fn parseTextBlocks(self: *Object, macho_file: *MachO) !void { // Since there is no symbol to refer to this block, we create // a temp one, unless we already did that when working out the relocations // of other text blocks. - const sym_name = try std.fmt.allocPrint(self.allocator, "l_{s}_{s}_{s}", .{ - self.name.?, + const sym_name = try std.fmt.allocPrint(allocator, "l_{s}_{s}_{s}", .{ + self.name, segmentName(sect), sectionName(sect), }); - defer self.allocator.free(sym_name); + defer allocator.free(sym_name); const block_local_sym_index = self.sections_as_symbols.get(sect_id) orelse blk: { const block_local_sym_index = @intCast(u32, macho_file.locals.items.len); - try macho_file.locals.append(macho_file.base.allocator, .{ + try macho_file.locals.append(allocator, .{ .n_strx = try macho_file.makeString(sym_name), .n_type = macho.N_SECT, - .n_sect = macho_file.section_to_ordinal.get(match) orelse unreachable, + .n_sect = @intCast(u8, macho_file.section_ordinals.getIndex(match).? + 1), .n_desc = 0, .n_value = sect.addr, }); - try self.sections_as_symbols.putNoClobber(self.allocator, sect_id, block_local_sym_index); + try self.sections_as_symbols.putNoClobber(allocator, sect_id, block_local_sym_index); break :blk block_local_sym_index; }; - const block = try macho_file.base.allocator.create(TextBlock); + const block = try allocator.create(TextBlock); block.* = TextBlock.empty; block.local_sym_index = block_local_sym_index; block.size = sect.size; block.alignment = sect.@"align"; - try macho_file.managed_blocks.append(macho_file.base.allocator, block); + try macho_file.managed_blocks.append(allocator, block); - try block.code.appendSlice(macho_file.base.allocator, code); + try block.code.appendSlice(allocator, code); - try block.parseRelocsFromObject(self.allocator, relocs, self, .{ + try block.parseRelocs(relocs, .{ .base_addr = 0, + .allocator = allocator, + .object = self, .macho_file = macho_file, }); if (macho_file.has_dices) { const dices = filterDice(self.data_in_code_entries.items, sect.addr, sect.addr + sect.size); - try block.dices.ensureTotalCapacity(macho_file.base.allocator, dices.len); + try block.dices.ensureTotalCapacity(allocator, dices.len); for (dices) |dice| { block.dices.appendAssumeCapacity(.{ @@ -772,13 +775,13 @@ pub fn parseTextBlocks(self: *Object, macho_file: *MachO) !void { // the filtered symbols and note which symbol is contained within so that // we can properly allocate addresses down the line. // While we're at it, we need to update segment,section mapping of each symbol too. - try block.contained.ensureTotalCapacity(self.allocator, filtered_nlists.len); + try block.contained.ensureTotalCapacity(allocator, filtered_nlists.len); for (filtered_nlists) |nlist_with_index| { const nlist = nlist_with_index.nlist; const local_sym_index = self.symbol_mapping.get(nlist_with_index.index) orelse unreachable; const local = &macho_file.locals.items[local_sym_index]; - local.n_sect = macho_file.section_to_ordinal.get(match) orelse unreachable; + local.n_sect = @intCast(u8, macho_file.section_ordinals.getIndex(match).? + 1); const stab: ?TextBlock.Stab = if (self.debug_info) |di| blk: { // TODO there has to be a better to handle this. @@ -819,35 +822,35 @@ pub fn parseTextBlocks(self: *Object, macho_file: *MachO) !void { block.prev = last.*; last.* = block; } else { - try macho_file.blocks.putNoClobber(macho_file.base.allocator, match, block); + try macho_file.blocks.putNoClobber(allocator, match, block); } - try self.text_blocks.append(self.allocator, block); + try self.text_blocks.append(allocator, block); } } } -fn parseSymtab(self: *Object) !void { +fn parseSymtab(self: *Object, allocator: *Allocator) !void { const index = self.symtab_cmd_index orelse return; const symtab_cmd = self.load_commands.items[index].Symtab; - var symtab = try self.allocator.alloc(u8, @sizeOf(macho.nlist_64) * symtab_cmd.nsyms); - defer self.allocator.free(symtab); - _ = try self.file.?.preadAll(symtab, symtab_cmd.symoff); + var symtab = try allocator.alloc(u8, @sizeOf(macho.nlist_64) * symtab_cmd.nsyms); + defer allocator.free(symtab); + _ = try self.file.preadAll(symtab, symtab_cmd.symoff); const slice = @alignCast(@alignOf(macho.nlist_64), mem.bytesAsSlice(macho.nlist_64, symtab)); - try self.symtab.appendSlice(self.allocator, slice); + try self.symtab.appendSlice(allocator, slice); - var strtab = try self.allocator.alloc(u8, symtab_cmd.strsize); - defer self.allocator.free(strtab); - _ = try self.file.?.preadAll(strtab, symtab_cmd.stroff); - try self.strtab.appendSlice(self.allocator, strtab); + var strtab = try allocator.alloc(u8, symtab_cmd.strsize); + defer allocator.free(strtab); + _ = try self.file.preadAll(strtab, symtab_cmd.stroff); + try self.strtab.appendSlice(allocator, strtab); } -pub fn parseDebugInfo(self: *Object) !void { - log.debug("parsing debug info in '{s}'", .{self.name.?}); +pub fn parseDebugInfo(self: *Object, allocator: *Allocator) !void { + log.debug("parsing debug info in '{s}'", .{self.name}); var debug_info = blk: { - var di = try DebugInfo.parseFromObject(self.allocator, self); + var di = try DebugInfo.parseFromObject(allocator, self); break :blk di orelse return; }; @@ -855,7 +858,7 @@ pub fn parseDebugInfo(self: *Object) !void { const compile_unit = debug_info.inner.findCompileUnit(0x0) catch |err| switch (err) { error.MissingDebugInfo => { // TODO audit cases with missing debug info and audit our dwarf.zig module. - log.debug("invalid or missing debug info in {s}; skipping", .{self.name.?}); + log.debug("invalid or missing debug info in {s}; skipping", .{self.name}); return; }, else => |e| return e, @@ -864,26 +867,25 @@ pub fn parseDebugInfo(self: *Object) !void { const comp_dir = try compile_unit.die.getAttrString(&debug_info.inner, dwarf.AT_comp_dir); self.debug_info = debug_info; - self.tu_name = try self.allocator.dupe(u8, name); - self.tu_comp_dir = try self.allocator.dupe(u8, comp_dir); + self.tu_name = try allocator.dupe(u8, name); + self.tu_comp_dir = try allocator.dupe(u8, comp_dir); if (self.mtime == null) { self.mtime = mtime: { - const file = self.file orelse break :mtime 0; - const stat = file.stat() catch break :mtime 0; + const stat = self.file.stat() catch break :mtime 0; break :mtime @intCast(u64, @divFloor(stat.mtime, 1_000_000_000)); }; } } -pub fn parseDataInCode(self: *Object) !void { +pub fn parseDataInCode(self: *Object, allocator: *Allocator) !void { const index = self.data_in_code_cmd_index orelse return; const data_in_code = self.load_commands.items[index].LinkeditData; - var buffer = try self.allocator.alloc(u8, data_in_code.datasize); - defer self.allocator.free(buffer); + var buffer = try allocator.alloc(u8, data_in_code.datasize); + defer allocator.free(buffer); - _ = try self.file.?.preadAll(buffer, data_in_code.dataoff); + _ = try self.file.preadAll(buffer, data_in_code.dataoff); var stream = io.fixedBufferStream(buffer); var reader = stream.reader(); @@ -892,7 +894,7 @@ pub fn parseDataInCode(self: *Object) !void { error.EndOfStream => break, else => |e| return e, }; - try self.data_in_code_entries.append(self.allocator, dice); + try self.data_in_code_entries.append(allocator, dice); } } @@ -900,7 +902,7 @@ fn readSection(self: Object, allocator: *Allocator, index: u16) ![]u8 { const seg = self.load_commands.items[self.segment_cmd_index.?].Segment; const sect = seg.sections.items[index]; var buffer = try allocator.alloc(u8, @intCast(usize, sect.size)); - _ = try self.file.?.preadAll(buffer, sect.offset); + _ = try self.file.preadAll(buffer, sect.offset); return buffer; } diff --git a/src/link/MachO/TextBlock.zig b/src/link/MachO/TextBlock.zig index 8dca7bc37b..55dc2db471 100644 --- a/src/link/MachO/TextBlock.zig +++ b/src/link/MachO/TextBlock.zig @@ -606,12 +606,14 @@ pub fn freeListEligible(self: TextBlock, macho_file: MachO) bool { const RelocContext = struct { base_addr: u64 = 0, + allocator: *Allocator, + object: *Object, macho_file: *MachO, }; -fn initRelocFromObject(rel: macho.relocation_info, object: *Object, ctx: RelocContext) !Relocation { +fn initRelocFromObject(rel: macho.relocation_info, context: RelocContext) !Relocation { var parsed_rel = Relocation{ - .offset = @intCast(u32, @intCast(u64, rel.r_address) - ctx.base_addr), + .offset = @intCast(u32, @intCast(u64, rel.r_address) - context.base_addr), .where = undefined, .where_index = undefined, .payload = undefined, @@ -620,44 +622,44 @@ fn initRelocFromObject(rel: macho.relocation_info, object: *Object, ctx: RelocCo if (rel.r_extern == 0) { const sect_id = @intCast(u16, rel.r_symbolnum - 1); - const local_sym_index = object.sections_as_symbols.get(sect_id) orelse blk: { - const seg = object.load_commands.items[object.segment_cmd_index.?].Segment; + const local_sym_index = context.object.sections_as_symbols.get(sect_id) orelse blk: { + const seg = context.object.load_commands.items[context.object.segment_cmd_index.?].Segment; const sect = seg.sections.items[sect_id]; - const match = (try ctx.macho_file.getMatchingSection(sect)) orelse unreachable; - const local_sym_index = @intCast(u32, ctx.macho_file.locals.items.len); - const sym_name = try std.fmt.allocPrint(ctx.macho_file.base.allocator, "l_{s}_{s}_{s}", .{ - object.name.?, + const match = (try context.macho_file.getMatchingSection(sect)) orelse unreachable; + const local_sym_index = @intCast(u32, context.macho_file.locals.items.len); + const sym_name = try std.fmt.allocPrint(context.allocator, "l_{s}_{s}_{s}", .{ + context.object.name, commands.segmentName(sect), commands.sectionName(sect), }); - defer ctx.macho_file.base.allocator.free(sym_name); + defer context.allocator.free(sym_name); - try ctx.macho_file.locals.append(ctx.macho_file.base.allocator, .{ - .n_strx = try ctx.macho_file.makeString(sym_name), + try context.macho_file.locals.append(context.allocator, .{ + .n_strx = try context.macho_file.makeString(sym_name), .n_type = macho.N_SECT, - .n_sect = ctx.macho_file.section_to_ordinal.get(match) orelse unreachable, + .n_sect = @intCast(u8, context.macho_file.section_ordinals.getIndex(match).? + 1), .n_desc = 0, .n_value = sect.addr, }); - try object.sections_as_symbols.putNoClobber(object.allocator, sect_id, local_sym_index); + try context.object.sections_as_symbols.putNoClobber(context.allocator, sect_id, local_sym_index); break :blk local_sym_index; }; parsed_rel.where = .local; parsed_rel.where_index = local_sym_index; } else { - const sym = object.symtab.items[rel.r_symbolnum]; - const sym_name = object.getString(sym.n_strx); + const sym = context.object.symtab.items[rel.r_symbolnum]; + const sym_name = context.object.getString(sym.n_strx); if (MachO.symbolIsSect(sym) and !MachO.symbolIsExt(sym)) { - const where_index = object.symbol_mapping.get(rel.r_symbolnum) orelse unreachable; + const where_index = context.object.symbol_mapping.get(rel.r_symbolnum) orelse unreachable; parsed_rel.where = .local; parsed_rel.where_index = where_index; } else { - const n_strx = ctx.macho_file.strtab_dir.getAdapted(@as([]const u8, sym_name), MachO.StringSliceAdapter{ - .strtab = &ctx.macho_file.strtab, + const n_strx = context.macho_file.strtab_dir.getAdapted(@as([]const u8, sym_name), MachO.StringSliceAdapter{ + .strtab = &context.macho_file.strtab, }) orelse unreachable; - const resolv = ctx.macho_file.symbol_resolver.get(n_strx) orelse unreachable; + const resolv = context.macho_file.symbol_resolver.get(n_strx) orelse unreachable; switch (resolv.where) { .global => { parsed_rel.where = .local; @@ -675,29 +677,24 @@ fn initRelocFromObject(rel: macho.relocation_info, object: *Object, ctx: RelocCo return parsed_rel; } -pub fn parseRelocsFromObject( - self: *TextBlock, - allocator: *Allocator, - relocs: []macho.relocation_info, - object: *Object, - ctx: RelocContext, -) !void { - const filtered_relocs = filterRelocs(relocs, ctx.base_addr, ctx.base_addr + self.size); +pub fn parseRelocs(self: *TextBlock, relocs: []macho.relocation_info, context: RelocContext) !void { + const filtered_relocs = filterRelocs(relocs, context.base_addr, context.base_addr + self.size); var it = RelocIterator{ .buffer = filtered_relocs, }; var addend: u32 = 0; var subtractor: ?u32 = null; + const arch = context.macho_file.base.options.target.cpu.arch; while (it.next()) |rel| { - if (isAddend(rel, object.arch.?)) { + if (isAddend(rel, arch)) { // Addend is not a relocation with effect on the TextBlock, so // parse it and carry on. assert(addend == 0); // Oh no, addend was not reset! addend = rel.r_symbolnum; - // Verify ADDEND is followed by a load. + // Verify ADDEND is followed by a PAGE21 or PAGEOFF12. const next = @intToEnum(macho.reloc_type_arm64, it.peek().r_type); switch (next) { .ARM64_RELOC_PAGE21, .ARM64_RELOC_PAGEOFF12 => {}, @@ -709,28 +706,28 @@ pub fn parseRelocsFromObject( continue; } - if (isSubtractor(rel, object.arch.?)) { + if (isSubtractor(rel, arch)) { // Subtractor is not a relocation with effect on the TextBlock, so // parse it and carry on. assert(subtractor == null); // Oh no, subtractor was not reset! assert(rel.r_extern == 1); - const sym = object.symtab.items[rel.r_symbolnum]; - const sym_name = object.getString(sym.n_strx); + const sym = context.object.symtab.items[rel.r_symbolnum]; + const sym_name = context.object.getString(sym.n_strx); if (MachO.symbolIsSect(sym) and !MachO.symbolIsExt(sym)) { - const where_index = object.symbol_mapping.get(rel.r_symbolnum) orelse unreachable; + const where_index = context.object.symbol_mapping.get(rel.r_symbolnum) orelse unreachable; subtractor = where_index; } else { - const n_strx = ctx.macho_file.strtab_dir.getAdapted(@as([]const u8, sym_name), MachO.StringSliceAdapter{ - .strtab = &ctx.macho_file.strtab, + const n_strx = context.macho_file.strtab_dir.getAdapted(@as([]const u8, sym_name), MachO.StringSliceAdapter{ + .strtab = &context.macho_file.strtab, }) orelse unreachable; - const resolv = ctx.macho_file.symbol_resolver.get(n_strx) orelse unreachable; + const resolv = context.macho_file.symbol_resolver.get(n_strx) orelse unreachable; assert(resolv.where == .global); subtractor = resolv.local_sym_index; } // Verify SUBTRACTOR is followed by UNSIGNED. - switch (object.arch.?) { + switch (arch) { .aarch64 => { const next = @intToEnum(macho.reloc_type_arm64, it.peek().r_type); if (next != .ARM64_RELOC_UNSIGNED) { @@ -750,19 +747,19 @@ pub fn parseRelocsFromObject( continue; } - var parsed_rel = try initRelocFromObject(rel, object, ctx); + var parsed_rel = try initRelocFromObject(rel, context); - switch (object.arch.?) { + switch (arch) { .aarch64 => { const rel_type = @intToEnum(macho.reloc_type_arm64, rel.r_type); switch (rel_type) { .ARM64_RELOC_ADDEND => unreachable, .ARM64_RELOC_SUBTRACTOR => unreachable, .ARM64_RELOC_BRANCH26 => { - self.parseBranch(rel, &parsed_rel, ctx); + self.parseBranch(rel, &parsed_rel, context); }, .ARM64_RELOC_UNSIGNED => { - self.parseUnsigned(rel, &parsed_rel, subtractor, ctx); + self.parseUnsigned(rel, &parsed_rel, subtractor, context); subtractor = null; }, .ARM64_RELOC_PAGE21, @@ -790,10 +787,10 @@ pub fn parseRelocsFromObject( switch (@intToEnum(macho.reloc_type_x86_64, rel.r_type)) { .X86_64_RELOC_SUBTRACTOR => unreachable, .X86_64_RELOC_BRANCH => { - self.parseBranch(rel, &parsed_rel, ctx); + self.parseBranch(rel, &parsed_rel, context); }, .X86_64_RELOC_UNSIGNED => { - self.parseUnsigned(rel, &parsed_rel, subtractor, ctx); + self.parseUnsigned(rel, &parsed_rel, subtractor, context); subtractor = null; }, .X86_64_RELOC_SIGNED, @@ -801,7 +798,7 @@ pub fn parseRelocsFromObject( .X86_64_RELOC_SIGNED_2, .X86_64_RELOC_SIGNED_4, => { - self.parseSigned(rel, &parsed_rel, ctx); + self.parseSigned(rel, &parsed_rel, context); }, .X86_64_RELOC_GOT_LOAD, .X86_64_RELOC_GOT, @@ -814,7 +811,7 @@ pub fn parseRelocsFromObject( else => unreachable, } - try self.relocs.append(allocator, parsed_rel); + try self.relocs.append(context.allocator, parsed_rel); const is_via_got = switch (parsed_rel.payload) { .pointer_to_got => true, @@ -832,23 +829,23 @@ pub fn parseRelocsFromObject( }, .where_index = parsed_rel.where_index, }; - if (ctx.macho_file.got_entries_map.contains(key)) break :blk; + if (context.macho_file.got_entries_map.contains(key)) break :blk; - const got_index = @intCast(u32, ctx.macho_file.got_entries.items.len); - try ctx.macho_file.got_entries.append(ctx.macho_file.base.allocator, key); - try ctx.macho_file.got_entries_map.putNoClobber(ctx.macho_file.base.allocator, key, got_index); + const got_index = @intCast(u32, context.macho_file.got_entries.items.len); + try context.macho_file.got_entries.append(context.allocator, key); + try context.macho_file.got_entries_map.putNoClobber(context.allocator, key, got_index); } else if (parsed_rel.payload == .unsigned) { switch (parsed_rel.where) { .import => { - try self.bindings.append(allocator, .{ + try self.bindings.append(context.allocator, .{ .local_sym_index = parsed_rel.where_index, .offset = parsed_rel.offset, }); }, .local => { - const source_sym = ctx.macho_file.locals.items[self.local_sym_index]; - const match = ctx.macho_file.section_ordinals.items[source_sym.n_sect]; - const seg = ctx.macho_file.load_commands.items[match.seg].Segment; + const source_sym = context.macho_file.locals.items[self.local_sym_index]; + const match = context.macho_file.section_ordinals.keys()[source_sym.n_sect - 1]; + const seg = context.macho_file.load_commands.items[match.seg].Segment; const sect = seg.sections.items[match.sect]; const sect_type = commands.sectionType(sect); @@ -858,12 +855,12 @@ pub fn parseRelocsFromObject( // TODO actually, a check similar to what dyld is doing, that is, verifying // that the segment is writable should be enough here. const is_right_segment = blk: { - if (ctx.macho_file.data_segment_cmd_index) |idx| { + if (context.macho_file.data_segment_cmd_index) |idx| { if (match.seg == idx) { break :blk true; } } - if (ctx.macho_file.data_const_segment_cmd_index) |idx| { + if (context.macho_file.data_const_segment_cmd_index) |idx| { if (match.seg == idx) { break :blk true; } @@ -884,17 +881,17 @@ pub fn parseRelocsFromObject( }; if (should_rebase) { - try self.rebases.append(allocator, parsed_rel.offset); + try self.rebases.append(context.allocator, parsed_rel.offset); } }, } } else if (parsed_rel.payload == .branch) blk: { if (parsed_rel.where != .import) break :blk; - if (ctx.macho_file.stubs_map.contains(parsed_rel.where_index)) break :blk; + if (context.macho_file.stubs_map.contains(parsed_rel.where_index)) break :blk; - const stubs_index = @intCast(u32, ctx.macho_file.stubs.items.len); - try ctx.macho_file.stubs.append(ctx.macho_file.base.allocator, parsed_rel.where_index); - try ctx.macho_file.stubs_map.putNoClobber(ctx.macho_file.base.allocator, parsed_rel.where_index, stubs_index); + const stubs_index = @intCast(u32, context.macho_file.stubs.items.len); + try context.macho_file.stubs.append(context.allocator, parsed_rel.where_index); + try context.macho_file.stubs_map.putNoClobber(context.allocator, parsed_rel.where_index, stubs_index); } } } @@ -917,7 +914,7 @@ fn parseUnsigned( rel: macho.relocation_info, out: *Relocation, subtractor: ?u32, - ctx: RelocContext, + context: RelocContext, ) void { assert(rel.r_pcrel == 0); @@ -934,7 +931,7 @@ fn parseUnsigned( if (rel.r_extern == 0) { assert(out.where == .local); - const target_sym = ctx.macho_file.locals.items[out.where_index]; + const target_sym = context.macho_file.locals.items[out.where_index]; addend -= @intCast(i64, target_sym.n_value); } @@ -947,14 +944,14 @@ fn parseUnsigned( }; } -fn parseBranch(self: TextBlock, rel: macho.relocation_info, out: *Relocation, ctx: RelocContext) void { +fn parseBranch(self: TextBlock, rel: macho.relocation_info, out: *Relocation, context: RelocContext) void { _ = self; assert(rel.r_pcrel == 1); assert(rel.r_length == 2); out.payload = .{ .branch = .{ - .arch = ctx.macho_file.base.options.target.cpu.arch, + .arch = context.macho_file.base.options.target.cpu.arch, }, }; } @@ -1015,7 +1012,7 @@ fn parsePointerToGot(self: TextBlock, rel: macho.relocation_info, out: *Relocati }; } -fn parseSigned(self: TextBlock, rel: macho.relocation_info, out: *Relocation, ctx: RelocContext) void { +fn parseSigned(self: TextBlock, rel: macho.relocation_info, out: *Relocation, context: RelocContext) void { assert(rel.r_pcrel == 1); assert(rel.r_length == 2); @@ -1030,10 +1027,10 @@ fn parseSigned(self: TextBlock, rel: macho.relocation_info, out: *Relocation, ct var addend: i64 = mem.readIntLittle(i32, self.code.items[out.offset..][0..4]) + correction; if (rel.r_extern == 0) { - const source_sym = ctx.macho_file.locals.items[self.local_sym_index]; + const source_sym = context.macho_file.locals.items[self.local_sym_index]; const target_sym = switch (out.where) { - .local => ctx.macho_file.locals.items[out.where_index], - .import => ctx.macho_file.imports.items[out.where_index], + .local => context.macho_file.locals.items[out.where_index], + .import => context.macho_file.imports.items[out.where_index], }; addend = @intCast(i64, source_sym.n_value + out.offset + 4) + addend - @intCast(i64, target_sym.n_value); } @@ -1111,7 +1108,7 @@ pub fn resolveRelocs(self: *TextBlock, macho_file: *MachO) !void { const sym = macho_file.locals.items[rel.where_index]; const is_tlv = is_tlv: { const source_sym = macho_file.locals.items[self.local_sym_index]; - const match = macho_file.section_ordinals.items[source_sym.n_sect]; + const match = macho_file.section_ordinals.keys()[source_sym.n_sect - 1]; const seg = macho_file.load_commands.items[match.seg].Segment; const sect = seg.sections.items[match.sect]; break :is_tlv commands.sectionType(sect) == macho.S_THREAD_LOCAL_VARIABLES; diff --git a/src/link/MachO/Trie.zig b/src/link/MachO/Trie.zig index 8aa2262bff..ab3a97eb33 100644 --- a/src/link/MachO/Trie.zig +++ b/src/link/MachO/Trie.zig @@ -273,8 +273,6 @@ pub const Node = struct { /// The root node of the trie. root: ?*Node = null, -allocator: *Allocator, - /// If you want to access nodes ordered in DFS fashion, /// you should call `finalize` first since the nodes /// in this container are not guaranteed to not be stale @@ -294,10 +292,6 @@ node_count: usize = 0, trie_dirty: bool = true, -pub fn init(allocator: *Allocator) Trie { - return .{ .allocator = allocator }; -} - /// Export symbol that is to be placed in the trie. pub const ExportSymbol = struct { /// Name of the symbol. @@ -314,9 +308,9 @@ pub const ExportSymbol = struct { /// Insert a symbol into the trie, updating the prefixes in the process. /// This operation may change the layout of the trie by splicing edges in /// certain circumstances. -pub fn put(self: *Trie, symbol: ExportSymbol) !void { - try self.createRoot(); - const node = try self.root.?.put(self.allocator, symbol.name); +pub fn put(self: *Trie, allocator: *Allocator, symbol: ExportSymbol) !void { + try self.createRoot(allocator); + const node = try self.root.?.put(allocator, symbol.name); node.terminal_info = .{ .vmaddr_offset = symbol.vmaddr_offset, .export_flags = symbol.export_flags, @@ -328,13 +322,13 @@ pub fn put(self: *Trie, symbol: ExportSymbol) !void { /// This step performs multiple passes through the trie ensuring /// there are no gaps after every `Node` is ULEB128 encoded. /// Call this method before trying to `write` the trie to a byte stream. -pub fn finalize(self: *Trie) !void { +pub fn finalize(self: *Trie, allocator: *Allocator) !void { if (!self.trie_dirty) return; self.ordered_nodes.shrinkRetainingCapacity(0); - try self.ordered_nodes.ensureCapacity(self.allocator, self.node_count); + try self.ordered_nodes.ensureCapacity(allocator, self.node_count); - var fifo = std.fifo.LinearFifo(*Node, .Dynamic).init(self.allocator); + var fifo = std.fifo.LinearFifo(*Node, .Dynamic).init(allocator); defer fifo.deinit(); try fifo.writeItem(self.root.?); @@ -367,9 +361,9 @@ const ReadError = error{ }; /// Parse the trie from a byte stream. -pub fn read(self: *Trie, reader: anytype) ReadError!usize { - try self.createRoot(); - return self.root.?.read(self.allocator, reader); +pub fn read(self: *Trie, allocator: *Allocator, reader: anytype) ReadError!usize { + try self.createRoot(allocator); + return self.root.?.read(allocator, reader); } /// Write the trie to a byte stream. @@ -383,17 +377,17 @@ pub fn write(self: Trie, writer: anytype) !u64 { return counting_writer.bytes_written; } -pub fn deinit(self: *Trie) void { +pub fn deinit(self: *Trie, allocator: *Allocator) void { if (self.root) |root| { - root.deinit(self.allocator); - self.allocator.destroy(root); + root.deinit(allocator); + allocator.destroy(root); } - self.ordered_nodes.deinit(self.allocator); + self.ordered_nodes.deinit(allocator); } -fn createRoot(self: *Trie) !void { +fn createRoot(self: *Trie, allocator: *Allocator) !void { if (self.root == null) { - const root = try self.allocator.create(Node); + const root = try allocator.create(Node); root.* = .{ .base = self }; self.root = root; self.node_count += 1; @@ -402,13 +396,13 @@ fn createRoot(self: *Trie) !void { test "Trie node count" { var gpa = testing.allocator; - var trie = Trie.init(gpa); - defer trie.deinit(); + var trie: Trie = .{}; + defer trie.deinit(gpa); try testing.expectEqual(trie.node_count, 0); try testing.expect(trie.root == null); - try trie.put(.{ + try trie.put(gpa, .{ .name = "_main", .vmaddr_offset = 0, .export_flags = 0, @@ -416,14 +410,14 @@ test "Trie node count" { try testing.expectEqual(trie.node_count, 2); // Inserting the same node shouldn't update the trie. - try trie.put(.{ + try trie.put(gpa, .{ .name = "_main", .vmaddr_offset = 0, .export_flags = 0, }); try testing.expectEqual(trie.node_count, 2); - try trie.put(.{ + try trie.put(gpa, .{ .name = "__mh_execute_header", .vmaddr_offset = 0x1000, .export_flags = 0, @@ -431,13 +425,13 @@ test "Trie node count" { try testing.expectEqual(trie.node_count, 4); // Inserting the same node shouldn't update the trie. - try trie.put(.{ + try trie.put(gpa, .{ .name = "__mh_execute_header", .vmaddr_offset = 0x1000, .export_flags = 0, }); try testing.expectEqual(trie.node_count, 4); - try trie.put(.{ + try trie.put(gpa, .{ .name = "_main", .vmaddr_offset = 0, .export_flags = 0, @@ -447,11 +441,11 @@ test "Trie node count" { test "Trie basic" { var gpa = testing.allocator; - var trie = Trie.init(gpa); - defer trie.deinit(); + var trie: Trie = .{}; + defer trie.deinit(gpa); // root --- _st ---> node - try trie.put(.{ + try trie.put(gpa, .{ .name = "_st", .vmaddr_offset = 0, .export_flags = 0, @@ -461,7 +455,7 @@ test "Trie basic" { { // root --- _st ---> node --- art ---> node - try trie.put(.{ + try trie.put(gpa, .{ .name = "_start", .vmaddr_offset = 0, .export_flags = 0, @@ -477,7 +471,7 @@ test "Trie basic" { // root --- _ ---> node --- st ---> node --- art ---> node // | // | --- main ---> node - try trie.put(.{ + try trie.put(gpa, .{ .name = "_main", .vmaddr_offset = 0, .export_flags = 0, @@ -497,22 +491,22 @@ test "Trie basic" { test "write Trie to a byte stream" { var gpa = testing.allocator; - var trie = Trie.init(gpa); - defer trie.deinit(); + var trie: Trie = .{}; + defer trie.deinit(gpa); - try trie.put(.{ + try trie.put(gpa, .{ .name = "__mh_execute_header", .vmaddr_offset = 0, .export_flags = 0, }); - try trie.put(.{ + try trie.put(gpa, .{ .name = "_main", .vmaddr_offset = 0x1000, .export_flags = 0, }); - try trie.finalize(); - try trie.finalize(); // Finalizing mulitple times is a nop subsequently unless we add new nodes. + try trie.finalize(gpa); + try trie.finalize(gpa); // Finalizing mulitple times is a nop subsequently unless we add new nodes. const exp_buffer = [_]u8{ 0x0, 0x1, // node root @@ -557,13 +551,13 @@ test "parse Trie from byte stream" { }; var in_stream = std.io.fixedBufferStream(&in_buffer); - var trie = Trie.init(gpa); - defer trie.deinit(); - const nread = try trie.read(in_stream.reader()); + var trie: Trie = .{}; + defer trie.deinit(gpa); + const nread = try trie.read(gpa, in_stream.reader()); try testing.expect(nread == in_buffer.len); - try trie.finalize(); + try trie.finalize(gpa); var out_buffer = try gpa.alloc(u8, trie.size); defer gpa.free(out_buffer); diff --git a/src/link/Plan9.zig b/src/link/Plan9.zig index 135b59f82b..3b2aae85bc 100644 --- a/src/link/Plan9.zig +++ b/src/link/Plan9.zig @@ -224,7 +224,9 @@ pub fn flushModule(self: *Plan9, comp: *Compilation) !void { const mod = self.base.options.module orelse return error.LinkingWithoutZigSourceUnimplemented; - assert(self.got_len == self.fn_decl_table.count() + self.data_decl_table.count()); + // TODO I changed this assert from == to >= but this code all needs to be audited; see + // the comment in `freeDecl`. + assert(self.got_len >= self.fn_decl_table.count() + self.data_decl_table.count()); const got_size = self.got_len * if (!self.sixtyfour_bit) @as(u32, 4) else 8; var got_table = try self.base.allocator.alloc(u8, got_size); defer self.base.allocator.free(got_table); @@ -358,11 +360,18 @@ fn addDeclExports( } pub fn freeDecl(self: *Plan9, decl: *Module.Decl) void { + // TODO this is not the correct check for being function body, + // it could just be a function pointer. + // TODO audit the lifetimes of decls table entries. It's possible to get + // allocateDeclIndexes and then freeDecl without any updateDecl in between. + // However that is planned to change, see the TODO comment in Module.zig + // in the deleteUnusedDecl function. const is_fn = (decl.ty.zigTypeTag() == .Fn); - if (is_fn) - assert(self.fn_decl_table.swapRemove(decl)) - else - assert(self.data_decl_table.swapRemove(decl)); + if (is_fn) { + _ = self.fn_decl_table.swapRemove(decl); + } else { + _ = self.data_decl_table.swapRemove(decl); + } } pub fn updateDeclExports( diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig index 2ed6576033..3c3cd4eef3 100644 --- a/src/link/Wasm.zig +++ b/src/link/Wasm.zig @@ -275,7 +275,7 @@ pub fn updateDecl(self: *Wasm, module: *Module, decl: *Module.Decl) !void { defer context.deinit(); // generate the 'code' section for the function declaration - const result = context.gen(.{ .ty = decl.ty, .val = decl.val }) catch |err| switch (err) { + const result = context.gen(decl.ty, decl.val) catch |err| switch (err) { error.CodegenFail => { decl.analysis = .codegen_failure; try module.failed_decls.put(module.gpa, decl, context.err_msg); @@ -330,10 +330,12 @@ pub fn updateDeclExports( decl: *const Module.Decl, exports: []const *Module.Export, ) !void { - _ = self; - _ = module; - _ = decl; - _ = exports; + if (build_options.skip_non_native and builtin.object_format != .wasm) { + @panic("Attempted to compile for object format that was disabled by build configuration"); + } + if (build_options.have_llvm) { + if (self.llvm_object) |llvm_object| return llvm_object.updateDeclExports(module, decl, exports); + } } pub fn freeDecl(self: *Wasm, decl: *Module.Decl) void { diff --git a/src/main.zig b/src/main.zig index d0aa6213cb..0987a46989 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1200,7 +1200,7 @@ fn buildOutputType( }, .rdynamic => rdynamic = true, .wl => { - var split_it = mem.split(it.only_arg, ","); + var split_it = mem.split(u8, it.only_arg, ","); while (split_it.next()) |linker_arg| { // Handle nested-joined args like `-Wl,-rpath=foo`. // Must be prefixed with 1 or 2 dashes. @@ -2753,6 +2753,8 @@ pub const usage_build = ; pub fn cmdBuild(gpa: *Allocator, arena: *Allocator, args: []const []const u8) !void { + var prominent_compile_errors: bool = false; + // We want to release all the locks before executing the child process, so we make a nice // big block here to ensure the cleanup gets run when we extract out our argv. const child_argv = argv: { @@ -2804,6 +2806,8 @@ pub fn cmdBuild(gpa: *Allocator, arena: *Allocator, args: []const []const u8) !v i += 1; override_global_cache_dir = args[i]; continue; + } else if (mem.eql(u8, arg, "--prominent-compile-errors")) { + prominent_compile_errors = true; } } try child_argv.append(arg); @@ -2973,8 +2977,13 @@ pub fn cmdBuild(gpa: *Allocator, arena: *Allocator, args: []const []const u8) !v switch (term) { .Exited => |code| { if (code == 0) return cleanExit(); - const cmd = try argvCmd(arena, child_argv); - fatal("the following build command failed with exit code {d}:\n{s}", .{ code, cmd }); + + if (prominent_compile_errors) { + fatal("the build command failed with exit code {d}", .{code}); + } else { + const cmd = try argvCmd(arena, child_argv); + fatal("the following build command failed with exit code {d}:\n{s}", .{ code, cmd }); + } }, else => { const cmd = try argvCmd(arena, child_argv); @@ -3646,7 +3655,7 @@ pub const ClangArgIterator = struct { defer allocator.free(resp_contents); // TODO is there a specification for this file format? Let's find it and make this parsing more robust // at the very least I'm guessing this needs to handle quotes and `#` comments. - var it = mem.tokenize(resp_contents, " \t\r\n"); + var it = mem.tokenize(u8, resp_contents, " \t\r\n"); var resp_arg_list = std.ArrayList([]const u8).init(allocator); defer resp_arg_list.deinit(); { @@ -3877,6 +3886,8 @@ const usage_ast_check = \\ -h, --help Print this help and exit \\ --color [auto|off|on] Enable or disable colored error messages \\ -t (debug option) Output ZIR in text form to stdout + \\ + \\ ; pub fn cmdAstCheck( diff --git a/src/print_air.zig b/src/print_air.zig index 2c756670ad..66490b6512 100644 --- a/src/print_air.zig +++ b/src/print_air.zig @@ -15,12 +15,11 @@ pub fn dump(gpa: *Allocator, air: Air, zir: Zir, liveness: Liveness) void { (@sizeOf(Air.Inst.Tag) + 8); const extra_bytes = air.extra.len * @sizeOf(u32); const values_bytes = air.values.len * @sizeOf(Value); - const variables_bytes = air.variables.len * @sizeOf(*Module.Var); const tomb_bytes = liveness.tomb_bits.len * @sizeOf(usize); const liveness_extra_bytes = liveness.extra.len * @sizeOf(u32); const liveness_special_bytes = liveness.special.count() * 8; const total_bytes = @sizeOf(Air) + instruction_bytes + extra_bytes + - values_bytes * variables_bytes + @sizeOf(Liveness) + liveness_extra_bytes + + values_bytes + @sizeOf(Liveness) + liveness_extra_bytes + liveness_special_bytes + tomb_bytes; // zig fmt: off @@ -29,7 +28,6 @@ pub fn dump(gpa: *Allocator, air: Air, zir: Zir, liveness: Liveness) void { \\# AIR Instructions: {d} ({}) \\# AIR Extra Data: {d} ({}) \\# AIR Values Bytes: {d} ({}) - \\# AIR Variables Bytes: {d} ({}) \\# Liveness tomb_bits: {} \\# Liveness Extra Data: {d} ({}) \\# Liveness special table: {d} ({}) @@ -39,7 +37,6 @@ pub fn dump(gpa: *Allocator, air: Air, zir: Zir, liveness: Liveness) void { air.instructions.len, fmtIntSizeBin(instruction_bytes), air.extra.len, fmtIntSizeBin(extra_bytes), air.values.len, fmtIntSizeBin(values_bytes), - air.variables.len, fmtIntSizeBin(variables_bytes), fmtIntSizeBin(tomb_bytes), liveness.extra.len, fmtIntSizeBin(liveness_extra_bytes), liveness.special.count(), fmtIntSizeBin(liveness_special_bytes), @@ -112,6 +109,8 @@ const Writer = struct { .mul, .mulwrap, .div, + .ptr_add, + .ptr_sub, .bit_and, .bit_or, .xor, @@ -126,6 +125,8 @@ const Writer = struct { .store, .slice_elem_val, .ptr_slice_elem_val, + .ptr_elem_val, + .ptr_ptr_elem_val, => try w.writeBinOp(s, inst), .is_null, @@ -137,6 +138,7 @@ const Writer = struct { .is_err_ptr, .is_non_err_ptr, .ptrtoint, + .bool_to_int, .ret, => try w.writeUnOp(s, inst), @@ -151,9 +153,9 @@ const Writer = struct { .not, .bitcast, .load, - .ref, .floatcast, .intcast, + .trunc, .optional_payload, .optional_payload_ptr, .wrap_optional, @@ -171,8 +173,8 @@ const Writer = struct { .loop, => try w.writeBlock(s, inst), - .struct_field_ptr => try w.writeStructFieldPtr(s, inst), - .varptr => try w.writeVarPtr(s, inst), + .struct_field_ptr => try w.writeStructField(s, inst), + .struct_field_val => try w.writeStructField(s, inst), .constant => try w.writeConstant(s, inst), .assembly => try w.writeAssembly(s, inst), .dbg_stmt => try w.writeDbgStmt(s, inst), @@ -224,7 +226,7 @@ const Writer = struct { const extra = w.air.extraData(Air.Block, ty_pl.payload); const body = w.air.extra[extra.end..][0..extra.data.body_len]; - try s.writeAll("{\n"); + try s.print("{}, {{\n", .{w.air.getRefType(ty_pl.ty)}); const old_indent = w.indent; w.indent += 2; try w.writeBody(s, body); @@ -233,20 +235,14 @@ const Writer = struct { try s.writeAll("}"); } - fn writeStructFieldPtr(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void { + fn writeStructField(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void { const ty_pl = w.air.instructions.items(.data)[inst].ty_pl; const extra = w.air.extraData(Air.StructField, ty_pl.payload); - try w.writeOperand(s, inst, 0, extra.data.struct_ptr); + try w.writeOperand(s, inst, 0, extra.data.struct_operand); try s.print(", {d}", .{extra.data.field_index}); } - fn writeVarPtr(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void { - _ = w; - _ = inst; - try s.writeAll("TODO"); - } - fn writeConstant(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void { const ty_pl = w.air.instructions.items(.data)[inst].ty_pl; const val = w.air.values[ty_pl.payload]; diff --git a/src/stage1/all_types.hpp b/src/stage1/all_types.hpp index ee06c15cf0..dfebc66cfd 100644 --- a/src/stage1/all_types.hpp +++ b/src/stage1/all_types.hpp @@ -107,6 +107,7 @@ enum X64CABIClass { X64CABIClass_MEMORY_nobyval, X64CABIClass_INTEGER, X64CABIClass_SSE, + X64CABIClass_AGG, }; struct Stage1Zir { @@ -1569,8 +1570,9 @@ struct ZigType { // These are not supposed to be accessed directly. They're // null during semantic analysis, memoized with get_llvm_type - // and get_llvm_di_type + // get_llvm_c_abi_type and get_llvm_di_type LLVMTypeRef llvm_type; + LLVMTypeRef llvm_c_abi_type; ZigLLVMDIType *llvm_di_type; union { @@ -1624,6 +1626,7 @@ struct GlobalExport { struct ZigFn { LLVMValueRef llvm_value; + LLVMValueRef abi_return_value; // alloca used when converting at SysV ABI boundaries const char *llvm_name; AstNode *proto_node; AstNode *body_node; @@ -1755,6 +1758,7 @@ enum BuiltinFnId { BuiltinFnIdIntToEnum, BuiltinFnIdVectorType, BuiltinFnIdShuffle, + BuiltinFnIdSelect, BuiltinFnIdSplat, BuiltinFnIdSetCold, BuiltinFnIdSetRuntimeSafety, @@ -1795,6 +1799,8 @@ enum BuiltinFnId { BuiltinFnIdWasmMemoryGrow, BuiltinFnIdSrc, BuiltinFnIdReduce, + BuiltinFnIdMaximum, + BuiltinFnIdMinimum, }; struct BuiltinFnEntry { @@ -2544,6 +2550,7 @@ enum Stage1ZirInstId : uint8_t { Stage1ZirInstIdBoolToInt, Stage1ZirInstIdVectorType, Stage1ZirInstIdShuffleVector, + Stage1ZirInstIdSelect, Stage1ZirInstIdSplat, Stage1ZirInstIdBoolNot, Stage1ZirInstIdMemset, @@ -2664,6 +2671,7 @@ enum Stage1AirInstId : uint8_t { Stage1AirInstIdReduce, Stage1AirInstIdTruncate, Stage1AirInstIdShuffleVector, + Stage1AirInstIdSelect, Stage1AirInstIdSplat, Stage1AirInstIdBoolNot, Stage1AirInstIdMemset, @@ -2935,6 +2943,8 @@ enum IrBinOp { IrBinOpRemMod, IrBinOpArrayCat, IrBinOpArrayMult, + IrBinOpMaximum, + IrBinOpMinimum, }; struct Stage1ZirInstBinOp { @@ -4295,6 +4305,23 @@ struct Stage1AirInstShuffleVector { Stage1AirInst *mask; // This is in zig-format, not llvm format }; +struct Stage1ZirInstSelect { + Stage1ZirInst base; + + Stage1ZirInst *scalar_type; + Stage1ZirInst *pred; // This is in zig-format, not llvm format + Stage1ZirInst *a; + Stage1ZirInst *b; +}; + +struct Stage1AirInstSelect { + Stage1AirInst base; + + Stage1AirInst *pred; // This is in zig-format, not llvm format + Stage1AirInst *a; + Stage1AirInst *b; +}; + struct Stage1ZirInstSplat { Stage1ZirInst base; diff --git a/src/stage1/analyze.cpp b/src/stage1/analyze.cpp index 501e43373d..cf61bf79b7 100644 --- a/src/stage1/analyze.cpp +++ b/src/stage1/analyze.cpp @@ -6063,6 +6063,12 @@ Error type_has_bits2(CodeGen *g, ZigType *type_entry, bool *result) { return ErrorNone; } +bool fn_returns_c_abi_small_struct(FnTypeId *fn_type_id) { + ZigType *type = fn_type_id->return_type; + return !calling_convention_allows_zig_types(fn_type_id->cc) && + type->id == ZigTypeIdStruct && type->abi_size <= 16; +} + // Whether you can infer the value based solely on the type. OnePossibleValue type_has_one_possible_value(CodeGen *g, ZigType *type_entry) { assert(type_entry != nullptr); @@ -8376,6 +8382,9 @@ static X64CABIClass type_system_V_abi_x86_64_class(CodeGen *g, ZigType *ty, size // be memory. return X64CABIClass_MEMORY; } + // "If the size of the aggregate exceeds a single eightbyte, each is classified + // separately.". + // "If one of the classes is MEMORY, the whole argument is passed in memory" X64CABIClass working_class = X64CABIClass_Unknown; for (uint32_t i = 0; i < ty->data.structure.src_field_count; i += 1) { X64CABIClass field_class = type_c_abi_x86_64_class(g, ty->data.structure.fields[0]->type_entry); @@ -8385,7 +8394,10 @@ static X64CABIClass type_system_V_abi_x86_64_class(CodeGen *g, ZigType *ty, size working_class = field_class; } } - return working_class; + if (working_class == X64CABIClass_MEMORY) { + return X64CABIClass_MEMORY; + } + return X64CABIClass_AGG; } case ZigTypeIdUnion: { // "If the size of an object is larger than four eightbytes, or it contains unaligned @@ -8407,7 +8419,7 @@ static X64CABIClass type_system_V_abi_x86_64_class(CodeGen *g, ZigType *ty, size X64CABIClass field_class = type_c_abi_x86_64_class(g, ty->data.unionation.fields->type_entry); if (field_class == X64CABIClass_Unknown) return X64CABIClass_Unknown; - if (i == 0 || field_class == X64CABIClass_MEMORY || working_class == X64CABIClass_SSE) { + if (i == 0 || field_class == X64CABIClass_MEMORY || field_class == X64CABIClass_INTEGER || working_class == X64CABIClass_SSE) { working_class = field_class; } } @@ -8678,6 +8690,95 @@ static LLVMTypeRef get_llvm_type_of_n_bytes(unsigned byte_size) { LLVMInt8Type() : LLVMArrayType(LLVMInt8Type(), byte_size); } +static LLVMTypeRef llvm_int_for_size(size_t size) { + if (size > 4) { + return LLVMInt64Type(); + } else if (size > 2) { + return LLVMInt32Type(); + } else if (size == 2) { + return LLVMInt16Type(); + } else { + return LLVMInt8Type(); + } +} + +static LLVMTypeRef llvm_sse_for_size(size_t size) { + if (size > 4) + return LLVMDoubleType(); + else + return LLVMFloatType(); +} + +// Since it's not possible to control calling convention or register +// allocation in LLVM, clang seems to use intermediate types to manipulate +// LLVM into doing the right thing. It uses a float to force SSE registers, +// and a struct when 2 registers must be used. Some examples: +// { f32 } -> float +// { f32, i32 } -> { float, i32 } +// { i32, i32, f32 } -> { i64, float } +// +// The implementation below does not match clang 1:1. For instance, clang +// uses `<2x float>` while we generate `double`. There's a lot more edge +// cases and complexity when converting back and forth in clang though, +// so below is the simplest implementation that passes all tests. +static Error resolve_llvm_c_abi_type(CodeGen *g, ZigType *ty) { + size_t ty_size = type_size(g, ty); + LLVMTypeRef abi_type; + switch (ty->id) { + case ZigTypeIdEnum: + case ZigTypeIdInt: + case ZigTypeIdBool: + abi_type = llvm_int_for_size(ty_size); + break; + case ZigTypeIdFloat: + case ZigTypeIdVector: + abi_type = llvm_sse_for_size(ty_size); + break; + case ZigTypeIdStruct: { + uint32_t eightbyte_index = 0; + size_t type_sizes[] = {0, 0}; + X64CABIClass type_classes[] = {X64CABIClass_Unknown, X64CABIClass_Unknown}; + for (uint32_t i = 0; i < ty->data.structure.src_field_count; i += 1) { + if (ty->data.structure.fields[i]->offset >= 8) { + eightbyte_index = 1; + } + X64CABIClass field_class = type_c_abi_x86_64_class(g, ty->data.structure.fields[i]->type_entry); + + if (field_class == X64CABIClass_INTEGER) { + type_classes[eightbyte_index] = X64CABIClass_INTEGER; + } else if (type_classes[eightbyte_index] == X64CABIClass_Unknown) { + type_classes[eightbyte_index] = field_class; + } + type_sizes[eightbyte_index] += ty->data.structure.fields[i]->type_entry->abi_size; + } + + LLVMTypeRef return_elem_types[] = { + LLVMVoidType(), + LLVMVoidType(), + }; + for (uint32_t i = 0; i <= eightbyte_index; i += 1) { + if (type_classes[i] == X64CABIClass_INTEGER) { + return_elem_types[i] = llvm_int_for_size(type_sizes[i]); + } else { + return_elem_types[i] = llvm_sse_for_size(type_sizes[i]); + } + } + if (eightbyte_index == 0) { + abi_type = return_elem_types[0]; + } else { + abi_type = LLVMStructType(return_elem_types, 2, false); + } + break; + } + case ZigTypeIdUnion: + default: + // currently unreachable + zig_panic("TODO: support C ABI unions"); + } + ty->llvm_c_abi_type = abi_type; + return ErrorNone; +} + static void resolve_llvm_types_struct(CodeGen *g, ZigType *struct_type, ResolveStatus wanted_resolve_status, ZigType *async_frame_type) { @@ -8936,6 +9037,9 @@ static void resolve_llvm_types_struct(CodeGen *g, ZigType *struct_type, ResolveS g->type_resolve_stack.swap_remove(struct_type->data.structure.llvm_full_type_queue_index); struct_type->data.structure.llvm_full_type_queue_index = SIZE_MAX; } + + if (struct_type->abi_size <= 16 && struct_type->data.structure.layout == ContainerLayoutExtern) + resolve_llvm_c_abi_type(g, struct_type); } // This is to be used instead of void for debug info types, to avoid tripping @@ -9536,8 +9640,13 @@ static void resolve_llvm_types_fn_type(CodeGen *g, ZigType *fn_type) { assert(gen_param_types.items[i] != nullptr); } - fn_type->data.fn.raw_type_ref = LLVMFunctionType(get_llvm_type(g, gen_return_type), - gen_param_types.items, (unsigned int)gen_param_types.length, fn_type_id->is_var_args); + if (!first_arg_return && fn_returns_c_abi_small_struct(fn_type_id)) { + fn_type->data.fn.raw_type_ref = LLVMFunctionType(get_llvm_c_abi_type(g, gen_return_type), + gen_param_types.items, (unsigned int)gen_param_types.length, fn_type_id->is_var_args); + } else { + fn_type->data.fn.raw_type_ref = LLVMFunctionType(get_llvm_type(g, gen_return_type), + gen_param_types.items, (unsigned int)gen_param_types.length, fn_type_id->is_var_args); + } const unsigned fn_addrspace = ZigLLVMDataLayoutGetProgramAddressSpace(g->target_data_ref); fn_type->llvm_type = LLVMPointerType(fn_type->data.fn.raw_type_ref, fn_addrspace); fn_type->data.fn.raw_di_type = ZigLLVMCreateSubroutineType(g->dbuilder, param_di_types.items, (int)param_di_types.length, 0); @@ -9827,6 +9936,13 @@ static void resolve_llvm_types(CodeGen *g, ZigType *type, ResolveStatus wanted_r zig_unreachable(); } +LLVMTypeRef get_llvm_c_abi_type(CodeGen *g, ZigType *type) { + assertNoError(type_resolve(g, type, ResolveStatusLLVMFull)); + assert(type->abi_size == 0 || type->abi_size >= LLVMABISizeOfType(g->target_data_ref, type->llvm_type)); + assert(type->abi_align == 0 || type->abi_align >= LLVMABIAlignmentOfType(g->target_data_ref, type->llvm_type)); + return type->llvm_c_abi_type; +} + LLVMTypeRef get_llvm_type(CodeGen *g, ZigType *type) { assertNoError(type_resolve(g, type, ResolveStatusLLVMFull)); assert(type->abi_size == 0 || type->abi_size >= LLVMABISizeOfType(g->target_data_ref, type->llvm_type)); diff --git a/src/stage1/analyze.hpp b/src/stage1/analyze.hpp index 22951db0f0..8290ef572c 100644 --- a/src/stage1/analyze.hpp +++ b/src/stage1/analyze.hpp @@ -54,6 +54,8 @@ uint32_t get_async_frame_align_bytes(CodeGen *g); bool type_has_bits(CodeGen *g, ZigType *type_entry); Error type_has_bits2(CodeGen *g, ZigType *type_entry, bool *result); +bool fn_returns_c_abi_small_struct(FnTypeId *fn_type_id); + enum ExternPosition { ExternPositionFunctionParameter, ExternPositionFunctionReturn, @@ -268,6 +270,7 @@ Buf *type_bare_name(ZigType *t); Buf *type_h_name(ZigType *t); LLVMTypeRef get_llvm_type(CodeGen *g, ZigType *type); +LLVMTypeRef get_llvm_c_abi_type(CodeGen *g, ZigType *type); ZigLLVMDIType *get_llvm_di_type(CodeGen *g, ZigType *type); void add_cc_args(CodeGen *g, ZigList &args, const char *out_dep_path, bool translate_c, diff --git a/src/stage1/astgen.cpp b/src/stage1/astgen.cpp index cc8ccefad7..44dc1080c2 100644 --- a/src/stage1/astgen.cpp +++ b/src/stage1/astgen.cpp @@ -196,6 +196,8 @@ void destroy_instruction_src(Stage1ZirInst *inst) { return heap::c_allocator.destroy(reinterpret_cast(inst)); case Stage1ZirInstIdShuffleVector: return heap::c_allocator.destroy(reinterpret_cast(inst)); + case Stage1ZirInstIdSelect: + return heap::c_allocator.destroy(reinterpret_cast(inst)); case Stage1ZirInstIdSplat: return heap::c_allocator.destroy(reinterpret_cast(inst)); case Stage1ZirInstIdBoolNot: @@ -651,6 +653,10 @@ static constexpr Stage1ZirInstId ir_inst_id(Stage1ZirInstShuffleVector *) { return Stage1ZirInstIdShuffleVector; } +static constexpr Stage1ZirInstId ir_inst_id(Stage1ZirInstSelect *) { + return Stage1ZirInstIdSelect; +} + static constexpr Stage1ZirInstId ir_inst_id(Stage1ZirInstSplat *) { return Stage1ZirInstIdSplat; } @@ -2037,6 +2043,22 @@ static Stage1ZirInst *ir_build_shuffle_vector(Stage1AstGen *ag, Scope *scope, As return &instruction->base; } +static Stage1ZirInst *ir_build_select(Stage1AstGen *ag, Scope *scope, AstNode *source_node, + Stage1ZirInst *scalar_type, Stage1ZirInst *pred, Stage1ZirInst *a, Stage1ZirInst *b) +{ + Stage1ZirInstSelect *instruction = ir_build_instruction(ag, scope, source_node); + instruction->scalar_type = scalar_type; + instruction->pred = pred; + instruction->a = a; + instruction->b = b; + + ir_ref_instruction(pred, ag->current_basic_block); + ir_ref_instruction(a, ag->current_basic_block); + ir_ref_instruction(b, ag->current_basic_block); + + return &instruction->base; +} + static Stage1ZirInst *ir_build_splat_src(Stage1AstGen *ag, Scope *scope, AstNode *source_node, Stage1ZirInst *len, Stage1ZirInst *scalar) { @@ -3432,7 +3454,7 @@ static Stage1ZirInst *astgen_merge_err_sets(Stage1AstGen *ag, Scope *scope, AstN // TODO only pass type_name when the || operator is the top level AST node in the var decl expr Buf bare_name = BUF_INIT; - Buf *type_name = get_anon_type_name(ag->codegen, ag->exec, "error", scope, node, &bare_name); + Buf *type_name = get_anon_type_name(ag->codegen, ag->exec, "error", scope, node, &bare_name, nullptr); return ir_build_merge_err_sets(ag, scope, node, op1, op2, type_name); } @@ -4619,6 +4641,35 @@ static Stage1ZirInst *astgen_builtin_fn_call(Stage1AstGen *ag, Scope *scope, Ast arg0_value, arg1_value, arg2_value, arg3_value); return ir_lval_wrap(ag, scope, shuffle_vector, lval, result_loc); } + case BuiltinFnIdSelect: + { + // Used for the type expr + Scope *comptime_scope = create_comptime_scope(ag->codegen, node, scope); + + AstNode *arg0_node = node->data.fn_call_expr.params.at(0); + Stage1ZirInst *arg0_value = astgen_node(ag, arg0_node, comptime_scope); + if (arg0_value == ag->codegen->invalid_inst_src) + return arg0_value; + + AstNode *arg1_node = node->data.fn_call_expr.params.at(1); + Stage1ZirInst *arg1_value = astgen_node(ag, arg1_node, scope); + if (arg0_value == ag->codegen->invalid_inst_src) + return arg1_value; + + AstNode *arg2_node = node->data.fn_call_expr.params.at(2); + Stage1ZirInst *arg2_value = astgen_node(ag, arg2_node, scope); + if (arg1_value == ag->codegen->invalid_inst_src) + return arg2_value; + + AstNode *arg3_node = node->data.fn_call_expr.params.at(3); + Stage1ZirInst *arg3_value = astgen_node(ag, arg3_node, scope); + if (arg2_value == ag->codegen->invalid_inst_src) + return arg3_value; + + Stage1ZirInst *select = ir_build_select(ag, scope, node, + arg0_value, arg1_value, arg2_value, arg3_value); + return ir_lval_wrap(ag, scope, select, lval, result_loc); + } case BuiltinFnIdSplat: { AstNode *arg0_node = node->data.fn_call_expr.params.at(0); @@ -4635,6 +4686,21 @@ static Stage1ZirInst *astgen_builtin_fn_call(Stage1AstGen *ag, Scope *scope, Ast arg0_value, arg1_value); return ir_lval_wrap(ag, scope, splat, lval, result_loc); } + case BuiltinFnIdMaximum: + { + AstNode *arg0_node = node->data.fn_call_expr.params.at(0); + Stage1ZirInst *arg0_value = astgen_node(ag, arg0_node, scope); + if (arg0_value == ag->codegen->invalid_inst_src) + return arg0_value; + + AstNode *arg1_node = node->data.fn_call_expr.params.at(1); + Stage1ZirInst *arg1_value = astgen_node(ag, arg1_node, scope); + if (arg1_value == ag->codegen->invalid_inst_src) + return arg1_value; + + Stage1ZirInst *bin_op = ir_build_bin_op(ag, scope, node, IrBinOpMaximum, arg0_value, arg1_value, true); + return ir_lval_wrap(ag, scope, bin_op, lval, result_loc); + } case BuiltinFnIdMemcpy: { AstNode *arg0_node = node->data.fn_call_expr.params.at(0); @@ -4675,6 +4741,21 @@ static Stage1ZirInst *astgen_builtin_fn_call(Stage1AstGen *ag, Scope *scope, Ast Stage1ZirInst *ir_memset = ir_build_memset_src(ag, scope, node, arg0_value, arg1_value, arg2_value); return ir_lval_wrap(ag, scope, ir_memset, lval, result_loc); } + case BuiltinFnIdMinimum: + { + AstNode *arg0_node = node->data.fn_call_expr.params.at(0); + Stage1ZirInst *arg0_value = astgen_node(ag, arg0_node, scope); + if (arg0_value == ag->codegen->invalid_inst_src) + return arg0_value; + + AstNode *arg1_node = node->data.fn_call_expr.params.at(1); + Stage1ZirInst *arg1_value = astgen_node(ag, arg1_node, scope); + if (arg1_value == ag->codegen->invalid_inst_src) + return arg1_value; + + Stage1ZirInst *bin_op = ir_build_bin_op(ag, scope, node, IrBinOpMinimum, arg0_value, arg1_value, true); + return ir_lval_wrap(ag, scope, bin_op, lval, result_loc); + } case BuiltinFnIdWasmMemorySize: { AstNode *arg0_node = node->data.fn_call_expr.params.at(0); @@ -7507,42 +7588,73 @@ static bool render_instance_name_recursive(CodeGen *codegen, Buf *name, Scope *o } Buf *get_anon_type_name(CodeGen *codegen, Stage1Zir *exec, const char *kind_name, - Scope *scope, AstNode *source_node, Buf *out_bare_name) + Scope *scope, AstNode *source_node, Buf *out_bare_name, ResultLoc *result_loc) { - if (exec != nullptr && exec->name) { - ZigType *import = get_scope_import(scope); - Buf *namespace_name = buf_alloc(); - append_namespace_qualification(codegen, namespace_name, import); - buf_append_buf(namespace_name, exec->name); - buf_init_from_buf(out_bare_name, exec->name); - return namespace_name; - } else if (exec != nullptr && exec->name_fn != nullptr) { - Buf *name = buf_alloc(); - buf_append_buf(name, &exec->name_fn->symbol_name); - buf_appendf(name, "("); - render_instance_name_recursive(codegen, name, &exec->name_fn->fndef_scope->base, exec->begin_scope); - buf_appendf(name, ")"); - buf_init_from_buf(out_bare_name, name); - return name; - } else { - ZigType *import = get_scope_import(scope); - Buf *namespace_name = buf_alloc(); - append_namespace_qualification(codegen, namespace_name, import); - RootStruct *root_struct = source_node->owner->data.structure.root_struct; - TokenLoc tok_loc = root_struct->token_locs[source_node->main_token]; - buf_appendf(namespace_name, "%s:%u:%u", kind_name, - tok_loc.line + 1, tok_loc.column + 1); - buf_init_from_buf(out_bare_name, namespace_name); - return namespace_name; + // See https://ziglang.org/documentation/master/#Struct-Naming . + bool force_generic = false; + if (result_loc != nullptr + && result_loc->source_instruction != nullptr + && result_loc->source_instruction->source_node != nullptr + ) { + switch (result_loc->source_instruction->source_node->type) { + case NodeTypeVariableDeclaration: { + ZigType *import = get_scope_import(scope); + Buf *name = buf_alloc(); + append_namespace_qualification(codegen, name, import); + const auto &basename = result_loc->source_instruction->source_node->data.variable_declaration.symbol; + buf_append_buf(name, basename); + buf_init_from_buf(out_bare_name, basename); + return name; + } + case NodeTypeFnCallExpr: + case NodeTypeStructValueField: + force_generic = true; + break; + default: + break; + } } + + if (!force_generic) { + if (exec != nullptr && exec->name != nullptr) { + ZigType *import = get_scope_import(scope); + Buf *namespace_name = buf_alloc(); + append_namespace_qualification(codegen, namespace_name, import); + buf_append_buf(namespace_name, exec->name); + buf_init_from_buf(out_bare_name, exec->name); + return namespace_name; + } + if (exec != nullptr && exec->name_fn != nullptr) { + Buf *name = buf_alloc(); + buf_append_buf(name, &exec->name_fn->symbol_name); + buf_appendf(name, "("); + render_instance_name_recursive(codegen, name, &exec->name_fn->fndef_scope->base, exec->begin_scope); + buf_appendf(name, ")"); + buf_init_from_buf(out_bare_name, name); + return name; + } + } + + ZigType *import = get_scope_import(scope); + Buf *namespace_name = buf_alloc(); + append_namespace_qualification(codegen, namespace_name, import); + RootStruct *root_struct = source_node->owner->data.structure.root_struct; + TokenLoc tok_loc = root_struct->token_locs[source_node->main_token]; + buf_appendf(namespace_name, "%s:%u:%u", kind_name, + tok_loc.line + 1, tok_loc.column + 1); + buf_init_from_buf(out_bare_name, namespace_name); + return namespace_name; } -static Stage1ZirInst *astgen_container_decl(Stage1AstGen *ag, Scope *parent_scope, AstNode *node) { +static Stage1ZirInst *astgen_container_decl(Stage1AstGen *ag, Scope *parent_scope, + AstNode *node, ResultLoc *result_loc) +{ assert(node->type == NodeTypeContainerDecl); ContainerKind kind = node->data.container_decl.kind; Buf *bare_name = buf_alloc(); - Buf *name = get_anon_type_name(ag->codegen, ag->exec, container_string(kind), parent_scope, node, bare_name); + Buf *name = get_anon_type_name(ag->codegen, + ag->exec, container_string(kind), parent_scope, node, bare_name, result_loc); ContainerLayout layout = node->data.container_decl.layout; ZigType *container_type = get_partial_container_type(ag->codegen, parent_scope, @@ -7572,7 +7684,7 @@ static Stage1ZirInst *astgen_err_set_decl(Stage1AstGen *ag, Scope *parent_scope, uint32_t err_count = node->data.err_set_decl.decls.length; Buf bare_name = BUF_INIT; - Buf *type_name = get_anon_type_name(ag->codegen, ag->exec, "error", parent_scope, node, &bare_name); + Buf *type_name = get_anon_type_name(ag->codegen, ag->exec, "error", parent_scope, node, &bare_name, nullptr); ZigType *err_set_type = new_type_table_entry(ZigTypeIdErrorSet); buf_init_from_buf(&err_set_type->name, type_name); err_set_type->data.error_set.err_count = err_count; @@ -7882,7 +7994,7 @@ static Stage1ZirInst *astgen_node_raw(Stage1AstGen *ag, AstNode *node, Scope *sc case NodeTypeCatchExpr: return astgen_catch(ag, scope, node, lval, result_loc); case NodeTypeContainerDecl: - return ir_lval_wrap(ag, scope, astgen_container_decl(ag, scope, node), lval, result_loc); + return ir_lval_wrap(ag, scope, astgen_container_decl(ag, scope, node, result_loc), lval, result_loc); case NodeTypeFnProto: return ir_lval_wrap(ag, scope, astgen_fn_proto(ag, scope, node), lval, result_loc); case NodeTypeErrorSetDecl: diff --git a/src/stage1/astgen.hpp b/src/stage1/astgen.hpp index d4bb6923a1..c0ca583f56 100644 --- a/src/stage1/astgen.hpp +++ b/src/stage1/astgen.hpp @@ -32,6 +32,6 @@ void destroy_instruction_src(Stage1ZirInst *inst); bool ir_should_inline(Stage1Zir *exec, Scope *scope); Buf *get_anon_type_name(CodeGen *codegen, Stage1Zir *exec, const char *kind_name, - Scope *scope, AstNode *source_node, Buf *out_bare_name); + Scope *scope, AstNode *source_node, Buf *out_bare_name, ResultLoc *result_loc); #endif diff --git a/src/stage1/bigfloat.cpp b/src/stage1/bigfloat.cpp index 56bf2637e3..e5f21e34ea 100644 --- a/src/stage1/bigfloat.cpp +++ b/src/stage1/bigfloat.cpp @@ -191,6 +191,30 @@ void bigfloat_sqrt(BigFloat *dest, const BigFloat *op) { f128M_sqrt(&op->value, &dest->value); } +void bigfloat_min(BigFloat *dest, const BigFloat *op1, const BigFloat *op2) { + if (bigfloat_is_nan(op1)) { + bigfloat_init_bigfloat(dest, op2); + } else if (bigfloat_is_nan(op2)) { + bigfloat_init_bigfloat(dest, op1); + } else if (f128M_lt(&op1->value, &op2->value)) { + bigfloat_init_bigfloat(dest, op1); + } else { + bigfloat_init_bigfloat(dest, op2); + } +} + +void bigfloat_max(BigFloat *dest, const BigFloat *op1, const BigFloat *op2) { + if (bigfloat_is_nan(op1)) { + bigfloat_init_bigfloat(dest, op2); + } else if (bigfloat_is_nan(op2)) { + bigfloat_init_bigfloat(dest, op1); + } else if (f128M_lt(&op1->value, &op2->value)) { + bigfloat_init_bigfloat(dest, op2); + } else { + bigfloat_init_bigfloat(dest, op1); + } +} + bool bigfloat_is_nan(const BigFloat *op) { return f128M_isSignalingNaN(&op->value); } diff --git a/src/stage1/bigfloat.hpp b/src/stage1/bigfloat.hpp index 52e92d20f4..ffaff320e9 100644 --- a/src/stage1/bigfloat.hpp +++ b/src/stage1/bigfloat.hpp @@ -45,9 +45,12 @@ void bigfloat_div_floor(BigFloat *dest, const BigFloat *op1, const BigFloat *op2 void bigfloat_rem(BigFloat *dest, const BigFloat *op1, const BigFloat *op2); void bigfloat_mod(BigFloat *dest, const BigFloat *op1, const BigFloat *op2); void bigfloat_sqrt(BigFloat *dest, const BigFloat *op); +void bigfloat_min(BigFloat *dest, const BigFloat *op1, const BigFloat *op2); +void bigfloat_max(BigFloat *dest, const BigFloat *op1, const BigFloat *op2); void bigfloat_append_buf(Buf *buf, const BigFloat *op); Cmp bigfloat_cmp(const BigFloat *op1, const BigFloat *op2); + bool bigfloat_is_nan(const BigFloat *op); // convenience functions diff --git a/src/stage1/bigint.cpp b/src/stage1/bigint.cpp index 3ab6d08d79..5c8efad698 100644 --- a/src/stage1/bigint.cpp +++ b/src/stage1/bigint.cpp @@ -448,6 +448,26 @@ bool mul_u64_overflow(uint64_t op1, uint64_t op2, uint64_t *result) { } #endif +void bigint_max(BigInt* dest, const BigInt *op1, const BigInt *op2) { + switch (bigint_cmp(op1, op2)) { + case CmpEQ: + case CmpLT: + return bigint_init_bigint(dest, op2); + case CmpGT: + return bigint_init_bigint(dest, op1); + } +} + +void bigint_min(BigInt* dest, const BigInt *op1, const BigInt *op2) { + switch (bigint_cmp(op1, op2)) { + case CmpEQ: + case CmpLT: + return bigint_init_bigint(dest, op1); + case CmpGT: + return bigint_init_bigint(dest, op2); + } +} + void bigint_add(BigInt *dest, const BigInt *op1, const BigInt *op2) { if (op1->digit_count == 0) { return bigint_init_bigint(dest, op2); diff --git a/src/stage1/bigint.hpp b/src/stage1/bigint.hpp index 67f3ca1368..53e07f9284 100644 --- a/src/stage1/bigint.hpp +++ b/src/stage1/bigint.hpp @@ -56,6 +56,8 @@ bool bigint_fits_in_bits(const BigInt *bn, size_t bit_count, bool is_signed); void bigint_write_twos_complement(const BigInt *big_int, uint8_t *buf, size_t bit_count, bool is_big_endian); void bigint_read_twos_complement(BigInt *dest, const uint8_t *buf, size_t bit_count, bool is_big_endian, bool is_signed); +void bigint_max(BigInt* dest, const BigInt *op1, const BigInt *op2); +void bigint_min(BigInt* dest, const BigInt *op1, const BigInt *op2); void bigint_add(BigInt *dest, const BigInt *op1, const BigInt *op2); void bigint_add_wrap(BigInt *dest, const BigInt *op1, const BigInt *op2, size_t bit_count, bool is_signed); void bigint_sub(BigInt *dest, const BigInt *op1, const BigInt *op2); diff --git a/src/stage1/codegen.cpp b/src/stage1/codegen.cpp index 2ea230404f..359af18e82 100644 --- a/src/stage1/codegen.cpp +++ b/src/stage1/codegen.cpp @@ -2144,75 +2144,103 @@ static bool iter_function_params_c_abi(CodeGen *g, ZigType *fn_type, FnWalk *fn_ } } return true; - } else if (abi_class == X64CABIClass_SSE) { - // For now only handle structs with only floats/doubles in it. - if (ty->id != ZigTypeIdStruct) { - if (source_node != nullptr) { - give_up_with_c_abi_error(g, source_node); - } - // otherwise allow codegen code to report a compile error - return false; - } - - for (uint32_t i = 0; i < ty->data.structure.src_field_count; i += 1) { - if (ty->data.structure.fields[i]->type_entry->id != ZigTypeIdFloat) { - if (source_node != nullptr) { - give_up_with_c_abi_error(g, source_node); - } - // otherwise allow codegen code to report a compile error - return false; - } - } - - // The SystemV ABI says that we have to setup 1 FP register per f64. + } else if (abi_class == X64CABIClass_AGG) { + // The SystemV ABI says that we have to setup 1 register per eightbyte. // So two f32 can be passed in one f64, but 3 f32 have to be passed in 2 FP registers. - // To achieve this with LLVM API, we pass multiple f64 parameters to the LLVM function if - // the type is bigger than 8 bytes. + // Similarly, two i32 can be passed in one i64, but 3 i32 have to be passed in 2 registers. + // LLVM does not allow us to control registers in this way, nor to request specific + // ABI conventions. So we have to trick it into allocating the right registers, based + // on how clang does it. + + // First, we get the LLVM type corresponding to the C abi for the struct, then + // we pass each field as an argument. // Example: // extern struct { // x: f32, // y: f32, - // z: f32, + // z: i32, // }; - // const ptr = (*f64)*Struct; - // Register 1: ptr.* - // Register 2: (ptr + 1).* + // LLVM abi type: { double, i32 } + // const ptr = (*abi_type)*Struct; + // FP Register 1: abi_type[0] + // Register 1: abi_type[1] - // One floating point register per f64 or 2 f32's - size_t number_of_fp_regs = (ty_size + 7) / 8; + // However, if the struct fits in one register, then we'll pass it as such + size_t number_of_regs = (size_t)ceilf((float)ty_size / (float)8); + + LLVMTypeRef abi_type = get_llvm_c_abi_type(g, ty); + + assert(ty_size <= 16); switch (fn_walk->id) { case FnWalkIdAttrs: { - fn_walk->data.attrs.gen_i += number_of_fp_regs; + fn_walk->data.attrs.gen_i += number_of_regs; break; } case FnWalkIdCall: { - LLVMValueRef f64_ptr_to_struct = LLVMBuildBitCast(g->builder, val, LLVMPointerType(LLVMDoubleType(), 0), ""); - for (uint32_t i = 0; i < number_of_fp_regs; i += 1) { - LLVMValueRef index = LLVMConstInt(g->builtin_types.entry_usize->llvm_type, i, false); - LLVMValueRef indices[] = { index }; - LLVMValueRef adjusted_ptr_to_struct = LLVMBuildInBoundsGEP(g->builder, f64_ptr_to_struct, indices, 1, ""); + LLVMValueRef abi_ptr_to_struct = LLVMBuildBitCast(g->builder, val, LLVMPointerType(abi_type, 0), ""); + if (number_of_regs == 1) { + LLVMValueRef loaded = LLVMBuildLoad(g->builder, abi_ptr_to_struct, ""); + fn_walk->data.call.gen_param_values->append(loaded); + break; + } + for (uint32_t i = 0; i < number_of_regs; i += 1) { + LLVMValueRef zero = LLVMConstInt(LLVMInt32Type(), 0, false); + LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), i, false); + LLVMValueRef indices[] = { zero, index }; + LLVMValueRef adjusted_ptr_to_struct = LLVMBuildInBoundsGEP(g->builder, abi_ptr_to_struct, indices, 2, ""); LLVMValueRef loaded = LLVMBuildLoad(g->builder, adjusted_ptr_to_struct, ""); fn_walk->data.call.gen_param_values->append(loaded); } break; } case FnWalkIdTypes: { - for (uint32_t i = 0; i < number_of_fp_regs; i += 1) { - fn_walk->data.types.gen_param_types->append(get_llvm_type(g, g->builtin_types.entry_f64)); + if (number_of_regs == 1) { + fn_walk->data.types.gen_param_types->append(abi_type); + fn_walk->data.types.param_di_types->append(get_llvm_di_type(g, g->builtin_types.entry_f64)); + break; + } + for (uint32_t i = 0; i < number_of_regs; i += 1) { + fn_walk->data.types.gen_param_types->append(LLVMStructGetTypeAtIndex(abi_type, i)); fn_walk->data.types.param_di_types->append(get_llvm_di_type(g, g->builtin_types.entry_f64)); } break; } - case FnWalkIdVars: + case FnWalkIdVars: { + var->value_ref = build_alloca(g, ty, var->name, var->align_bytes); + di_arg_index = fn_walk->data.vars.gen_i; + fn_walk->data.vars.gen_i += 1; + dest_ty = ty; + goto var_ok; + } case FnWalkIdInits: { - // TODO: Handle exporting functions - if (source_node != nullptr) { - give_up_with_c_abi_error(g, source_node); + // since we're representing the struct differently as an arg, and potentially + // splitting it, we have to do some work to put it back together. + // the one reg case is straightforward, but if we used two registers we have + // to iterate through the struct abi repr fields and load them one by one. + if (number_of_regs == 1) { + LLVMValueRef arg = LLVMGetParam(llvm_fn, fn_walk->data.inits.gen_i); + LLVMTypeRef ptr_to_int_type_ref = LLVMPointerType(abi_type, 0); + LLVMValueRef bitcasted = LLVMBuildBitCast(g->builder, var->value_ref, ptr_to_int_type_ref, ""); + gen_store_untyped(g, arg, bitcasted, var->align_bytes, false); + } else { + LLVMValueRef abi_ptr_to_struct = LLVMBuildBitCast(g->builder, var->value_ref, LLVMPointerType(abi_type, 0), ""); + for (uint32_t i = 0; i < number_of_regs; i += 1) { + LLVMValueRef arg = LLVMGetParam(llvm_fn, fn_walk->data.inits.gen_i + i); + LLVMValueRef zero = LLVMConstInt(LLVMInt32Type(), 0, false); + LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), i, false); + LLVMValueRef indices[] = { zero, index }; + LLVMValueRef adjusted_ptr_to_struct = LLVMBuildInBoundsGEP(g->builder, abi_ptr_to_struct, indices, 2, ""); + LLVMBuildStore(g->builder, arg, adjusted_ptr_to_struct); + } + fn_walk->data.inits.gen_i += 1; } - // otherwise allow codegen code to report a compile error - return false; + if (var->decl_node) { + gen_var_debug_decl(g, var); + } + fn_walk->data.inits.gen_i += 1; + break; } } return true; @@ -2656,13 +2684,36 @@ static void gen_async_return(CodeGen *g, Stage1AirInstReturn *instruction) { LLVMBuildRetVoid(g->builder); } +static LLVMValueRef gen_convert_to_c_abi(CodeGen *g, LLVMValueRef location, LLVMValueRef value) { + ZigType *return_type = g->cur_fn->type_entry->data.fn.gen_return_type; + size_t size = type_size(g, return_type); + + LLVMTypeRef abi_return_type = get_llvm_c_abi_type(g, return_type); + LLVMTypeRef abi_return_type_pointer = LLVMPointerType(abi_return_type, 0); + + if (size < 8) { + LLVMValueRef bitcast = LLVMBuildBitCast(g->builder, value, abi_return_type_pointer, ""); + return LLVMBuildLoad(g->builder, bitcast, ""); + } else { + LLVMTypeRef i8ptr = LLVMPointerType(LLVMInt8Type(), 0); + LLVMValueRef bc_location = LLVMBuildBitCast(g->builder, location, i8ptr, ""); + LLVMValueRef bc_value = LLVMBuildBitCast(g->builder, value, i8ptr, ""); + + LLVMValueRef len = LLVMConstInt(LLVMInt64Type(), size, false); + ZigLLVMBuildMemCpy(g->builder, bc_location, 8, bc_value, return_type->abi_align, len, false); + return LLVMBuildLoad(g->builder, location, ""); + } +} + static LLVMValueRef ir_render_return(CodeGen *g, Stage1Air *executable, Stage1AirInstReturn *instruction) { if (fn_is_async(g->cur_fn)) { gen_async_return(g, instruction); return nullptr; } - if (want_first_arg_sret(g, &g->cur_fn->type_entry->data.fn.fn_type_id)) { + FnTypeId *fn_type_id = &g->cur_fn->type_entry->data.fn.fn_type_id; + + if (want_first_arg_sret(g, fn_type_id)) { if (instruction->operand == nullptr) { LLVMBuildRetVoid(g->builder); return nullptr; @@ -2673,6 +2724,16 @@ static LLVMValueRef ir_render_return(CodeGen *g, Stage1Air *executable, Stage1Ai ZigType *return_type = instruction->operand->value->type; gen_assign_raw(g, g->cur_ret_ptr, get_pointer_to_type(g, return_type, false), value); LLVMBuildRetVoid(g->builder); + } else if (fn_returns_c_abi_small_struct(fn_type_id)) { + LLVMValueRef location = g->cur_fn->abi_return_value; + if (instruction->operand == nullptr) { + LLVMValueRef converted = gen_convert_to_c_abi(g, location, g->cur_ret_ptr); + LLVMBuildRet(g->builder, converted); + } else { + LLVMValueRef value = ir_llvm_value(g, instruction->operand); + LLVMValueRef converted = gen_convert_to_c_abi(g, location, value); + LLVMBuildRet(g->builder, converted); + } } else if (g->cur_fn->type_entry->data.fn.fn_type_id.cc != CallingConventionAsync && handle_is_ptr(g, g->cur_fn->type_entry->data.fn.fn_type_id.return_type)) { @@ -3250,6 +3311,30 @@ static LLVMValueRef ir_render_bin_op(CodeGen *g, Stage1Air *executable, case IrBinOpRemMod: return gen_rem(g, want_runtime_safety, ir_want_fast_math(g, &bin_op_instruction->base), op1_value, op2_value, operand_type, RemKindMod); + case IrBinOpMaximum: + if (scalar_type->id == ZigTypeIdFloat) { + return ZigLLVMBuildMaxNum(g->builder, op1_value, op2_value, ""); + } else if (scalar_type->id == ZigTypeIdInt) { + if (scalar_type->data.integral.is_signed) { + return ZigLLVMBuildSMax(g->builder, op1_value, op2_value, ""); + } else { + return ZigLLVMBuildUMax(g->builder, op1_value, op2_value, ""); + } + } else { + zig_unreachable(); + } + case IrBinOpMinimum: + if (scalar_type->id == ZigTypeIdFloat) { + return ZigLLVMBuildMinNum(g->builder, op1_value, op2_value, ""); + } else if (scalar_type->id == ZigTypeIdInt) { + if (scalar_type->data.integral.is_signed) { + return ZigLLVMBuildSMin(g->builder, op1_value, op2_value, ""); + } else { + return ZigLLVMBuildUMin(g->builder, op1_value, op2_value, ""); + } + } else { + zig_unreachable(); + } } zig_unreachable(); } @@ -4656,6 +4741,12 @@ static LLVMValueRef ir_render_call(CodeGen *g, Stage1Air *executable, Stage1AirI } else if (first_arg_ret) { ZigLLVMSetCallSret(result, get_llvm_type(g, src_return_type)); return result_loc; + } else if (fn_returns_c_abi_small_struct(fn_type_id)) { + LLVMTypeRef abi_type = get_llvm_c_abi_type(g, src_return_type); + LLVMTypeRef abi_type_ptr = LLVMPointerType(abi_type, 0); + LLVMValueRef bitcast = LLVMBuildBitCast(g->builder, result_loc, abi_type_ptr, ""); + LLVMBuildStore(g->builder, result, bitcast); + return result_loc; } else if (handle_is_ptr(g, src_return_type)) { LLVMValueRef store_instr = LLVMBuildStore(g->builder, result, result_loc); LLVMSetAlignment(store_instr, get_ptr_align(g, instruction->result_loc->value->type)); @@ -5164,6 +5255,13 @@ static LLVMValueRef ir_render_shuffle_vector(CodeGen *g, Stage1Air *executable, llvm_mask_value, ""); } +static LLVMValueRef ir_render_select(CodeGen *g, Stage1Air *executable, Stage1AirInstSelect *instruction) { + LLVMValueRef pred = ir_llvm_value(g, instruction->pred); + LLVMValueRef a = ir_llvm_value(g, instruction->a); + LLVMValueRef b = ir_llvm_value(g, instruction->b); + return LLVMBuildSelect(g->builder, pred, a, b, ""); +} + static LLVMValueRef ir_render_splat(CodeGen *g, Stage1Air *executable, Stage1AirInstSplat *instruction) { ZigType *result_type = instruction->base.value->type; ir_assert(result_type->id == ZigTypeIdVector, &instruction->base); @@ -7017,6 +7115,8 @@ static LLVMValueRef ir_render_instruction(CodeGen *g, Stage1Air *executable, Sta return ir_render_spill_end(g, executable, (Stage1AirInstSpillEnd *)instruction); case Stage1AirInstIdShuffleVector: return ir_render_shuffle_vector(g, executable, (Stage1AirInstShuffleVector *) instruction); + case Stage1AirInstIdSelect: + return ir_render_select(g, executable, (Stage1AirInstSelect *) instruction); case Stage1AirInstIdSplat: return ir_render_splat(g, executable, (Stage1AirInstSplat *) instruction); case Stage1AirInstIdVectorExtractElem: @@ -8260,6 +8360,11 @@ static void do_code_gen(CodeGen *g) { g->cur_err_ret_trace_val_stack = nullptr; } + if (fn_returns_c_abi_small_struct(fn_type_id)) { + LLVMTypeRef abi_type = get_llvm_c_abi_type(g, fn_type_id->return_type); + fn_table_entry->abi_return_value = LLVMBuildAlloca(g->builder, abi_type, ""); + } + if (!is_async) { // allocate async frames for nosuspend calls & awaits to async functions ZigType *largest_call_frame_type = nullptr; @@ -8763,6 +8868,9 @@ static void define_builtin_types(CodeGen *g) { case ZigLLVM_sparcv9: add_fp_entry(g, "c_longdouble", 128, LLVMFP128Type(), &g->builtin_types.entry_c_longdouble); break; + case ZigLLVM_systemz: + add_fp_entry(g, "c_longdouble", 128, LLVMDoubleType(), &g->builtin_types.entry_c_longdouble); + break; case ZigLLVM_avr: // It's either a float or a double, depending on a toolchain switch add_fp_entry(g, "c_longdouble", 64, LLVMDoubleType(), &g->builtin_types.entry_c_longdouble); @@ -8922,6 +9030,7 @@ static void define_builtin_fns(CodeGen *g) { create_builtin_fn(g, BuiltinFnIdCompileLog, "compileLog", SIZE_MAX); create_builtin_fn(g, BuiltinFnIdVectorType, "Vector", 2); create_builtin_fn(g, BuiltinFnIdShuffle, "shuffle", 4); + create_builtin_fn(g, BuiltinFnIdSelect, "select", 4); create_builtin_fn(g, BuiltinFnIdSplat, "splat", 2); create_builtin_fn(g, BuiltinFnIdSetCold, "setCold", 1); create_builtin_fn(g, BuiltinFnIdSetRuntimeSafety, "setRuntimeSafety", 1); @@ -8982,6 +9091,8 @@ static void define_builtin_fns(CodeGen *g) { create_builtin_fn(g, BuiltinFnIdWasmMemoryGrow, "wasmMemoryGrow", 2); create_builtin_fn(g, BuiltinFnIdSrc, "src", 0); create_builtin_fn(g, BuiltinFnIdReduce, "reduce", 2); + create_builtin_fn(g, BuiltinFnIdMaximum, "maximum", 2); + create_builtin_fn(g, BuiltinFnIdMinimum, "minimum", 2); } static const char *bool_to_str(bool b) { diff --git a/src/stage1/ir.cpp b/src/stage1/ir.cpp index a6d1ff3007..b1583cc6b4 100644 --- a/src/stage1/ir.cpp +++ b/src/stage1/ir.cpp @@ -355,6 +355,8 @@ void destroy_instruction_gen(Stage1AirInst *inst) { return heap::c_allocator.destroy(reinterpret_cast(inst)); case Stage1AirInstIdShuffleVector: return heap::c_allocator.destroy(reinterpret_cast(inst)); + case Stage1AirInstIdSelect: + return heap::c_allocator.destroy(reinterpret_cast(inst)); case Stage1AirInstIdSplat: return heap::c_allocator.destroy(reinterpret_cast(inst)); case Stage1AirInstIdBoolNot: @@ -901,6 +903,10 @@ static constexpr Stage1AirInstId ir_inst_id(Stage1AirInstShuffleVector *) { return Stage1AirInstIdShuffleVector; } +static constexpr Stage1AirInstId ir_inst_id(Stage1AirInstSelect *) { + return Stage1AirInstIdSelect; +} + static constexpr Stage1AirInstId ir_inst_id(Stage1AirInstSplat *) { return Stage1AirInstIdSplat; } @@ -1756,6 +1762,22 @@ static Stage1AirInst *ir_build_shuffle_vector_gen(IrAnalyze *ira, Scope *scope, return &inst->base; } +static Stage1AirInst *ir_build_select_gen(IrAnalyze *ira, Scope *scope, AstNode *source_node, + ZigType *result_type, Stage1AirInst *pred, Stage1AirInst *a, Stage1AirInst *b) +{ + Stage1AirInstSelect *inst = ir_build_inst_gen(&ira->new_irb, scope, source_node); + inst->base.value->type = result_type; + inst->pred = pred; + inst->a = a; + inst->b = b; + + ir_ref_inst_gen(pred); + ir_ref_inst_gen(a); + ir_ref_inst_gen(b); + + return &inst->base; +} + static Stage1AirInst *ir_build_splat_gen(IrAnalyze *ira, Scope *scope, AstNode *source_node, ZigType *result_type, Stage1AirInst *scalar) { @@ -3289,6 +3311,108 @@ static void float_mod(ZigValue *out_val, ZigValue *op1, ZigValue *op2) { } } +static void float_max(ZigValue *out_val, ZigValue *op1, ZigValue *op2) { + assert(op1->type == op2->type); + out_val->type = op1->type; + if (op1->type->id == ZigTypeIdComptimeFloat) { + bigfloat_max(&out_val->data.x_bigfloat, &op1->data.x_bigfloat, &op2->data.x_bigfloat); + } else if (op1->type->id == ZigTypeIdFloat) { + switch (op1->type->data.floating.bit_count) { + case 16: + if (zig_f16_isNaN(op1->data.x_f16)) { + out_val->data.x_f16 = op2->data.x_f16; + } else if (zig_f16_isNaN(op2->data.x_f16)) { + out_val->data.x_f16 = op1->data.x_f16; + } else { + out_val->data.x_f16 = f16_lt(op1->data.x_f16, op2->data.x_f16) ? op2->data.x_f16 : op1->data.x_f16; + } + return; + case 32: + if (op1->data.x_f32 != op1->data.x_f32) { + out_val->data.x_f32 = op2->data.x_f32; + } else if (op2->data.x_f32 != op2->data.x_f32) { + out_val->data.x_f32 = op1->data.x_f32; + } else { + out_val->data.x_f32 = op1->data.x_f32 > op2->data.x_f32 ? op1->data.x_f32 : op2->data.x_f32; + } + return; + case 64: + if (op1->data.x_f64 != op1->data.x_f64) { + out_val->data.x_f64 = op2->data.x_f64; + } else if (op2->data.x_f64 != op2->data.x_f64) { + out_val->data.x_f64 = op1->data.x_f64; + } else { + out_val->data.x_f64 = op1->data.x_f64 > op2->data.x_f64 ? op1->data.x_f64 : op2->data.x_f64; + } + return; + case 128: + if (zig_f128_isNaN(&op1->data.x_f128)) { + out_val->data.x_f128 = op2->data.x_f128; + } else if (zig_f128_isNaN(&op2->data.x_f128)) { + out_val->data.x_f128 = op1->data.x_f128; + } else { + out_val->data.x_f128 = f128M_lt(&op1->data.x_f128, &op2->data.x_f128) ? op2->data.x_f128 : op1->data.x_f128; + } + return; + default: + zig_unreachable(); + } + } else { + zig_unreachable(); + } +} + +static void float_min(ZigValue *out_val, ZigValue *op1, ZigValue *op2) { + assert(op1->type == op2->type); + out_val->type = op1->type; + if (op1->type->id == ZigTypeIdComptimeFloat) { + bigfloat_min(&out_val->data.x_bigfloat, &op1->data.x_bigfloat, &op2->data.x_bigfloat); + } else if (op1->type->id == ZigTypeIdFloat) { + switch (op1->type->data.floating.bit_count) { + case 16: + if (zig_f16_isNaN(op1->data.x_f16)) { + out_val->data.x_f16 = op2->data.x_f16; + } else if (zig_f16_isNaN(op2->data.x_f16)) { + out_val->data.x_f16 = op1->data.x_f16; + } else { + out_val->data.x_f16 = f16_lt(op1->data.x_f16, op2->data.x_f16) ? op1->data.x_f16 : op2->data.x_f16; + } + return; + case 32: + if (op1->data.x_f32 != op1->data.x_f32) { + out_val->data.x_f32 = op2->data.x_f32; + } else if (op2->data.x_f32 != op2->data.x_f32) { + out_val->data.x_f32 = op1->data.x_f32; + } else { + out_val->data.x_f32 = op1->data.x_f32 < op2->data.x_f32 ? op1->data.x_f32 : op2->data.x_f32; + } + return; + case 64: + if (op1->data.x_f64 != op1->data.x_f64) { + out_val->data.x_f64 = op2->data.x_f64; + } else if (op2->data.x_f64 != op2->data.x_f64) { + out_val->data.x_f64 = op1->data.x_f64; + } else { + out_val->data.x_f64 = op1->data.x_f32 < op2->data.x_f64 ? op1->data.x_f64 : op2->data.x_f64; + } + return; + case 128: + if (zig_f128_isNaN(&op1->data.x_f128)) { + out_val->data.x_f128 = op2->data.x_f128; + } else if (zig_f128_isNaN(&op2->data.x_f128)) { + out_val->data.x_f128 = op1->data.x_f128; + } else { + out_val->data.x_f128 = f128M_lt(&op1->data.x_f128, &op2->data.x_f128) ? op1->data.x_f128 : op2->data.x_f128; + } + return; + default: + zig_unreachable(); + } + } else { + zig_unreachable(); + } +} + static void float_negate(ZigValue *out_val, ZigValue *op) { out_val->type = op->type; if (op->type->id == ZigTypeIdComptimeFloat) { @@ -9682,6 +9806,20 @@ static ErrorMsg *ir_eval_math_op_scalar(IrAnalyze *ira, Scope *scope, AstNode *s float_mod(out_val, op1_val, op2_val); } break; + case IrBinOpMaximum: + if (is_int) { + bigint_max(&out_val->data.x_bigint, &op1_val->data.x_bigint, &op2_val->data.x_bigint); + } else { + float_max(out_val, op1_val, op2_val); + } + break; + case IrBinOpMinimum: + if (is_int) { + bigint_min(&out_val->data.x_bigint, &op1_val->data.x_bigint, &op2_val->data.x_bigint); + } else { + float_min(out_val, op1_val, op2_val); + } + break; } if (type_entry->id == ZigTypeIdInt) { @@ -9882,6 +10020,8 @@ static bool ok_float_op(IrBinOp op) { case IrBinOpRemRem: case IrBinOpRemMod: case IrBinOpRemUnspecified: + case IrBinOpMaximum: + case IrBinOpMinimum: return true; case IrBinOpBoolOr: @@ -10283,7 +10423,7 @@ static Stage1AirInst *ir_analyze_tuple_cat(IrAnalyze *ira, Scope *scope, AstNode Buf *bare_name = buf_alloc(); Buf *name = get_anon_type_name(ira->codegen, nullptr, container_string(ContainerKindStruct), - scope, source_node, bare_name); + scope, source_node, bare_name, nullptr); ZigType *new_type = get_partial_container_type(ira->codegen, scope, ContainerKindStruct, source_node, buf_ptr(name), bare_name, ContainerLayoutAuto); new_type->data.structure.special = StructSpecialInferredTuple; @@ -10615,7 +10755,7 @@ static Stage1AirInst *ir_analyze_tuple_mult(IrAnalyze *ira, Scope *scope, AstNod Buf *bare_name = buf_alloc(); Buf *name = get_anon_type_name(ira->codegen, nullptr, container_string(ContainerKindStruct), - scope, source_node, bare_name); + scope, source_node, bare_name, nullptr); ZigType *new_type = get_partial_container_type(ira->codegen, scope, ContainerKindStruct, source_node, buf_ptr(name), bare_name, ContainerLayoutAuto); new_type->data.structure.special = StructSpecialInferredTuple; @@ -10872,6 +11012,8 @@ static Stage1AirInst *ir_analyze_instruction_bin_op(IrAnalyze *ira, Stage1ZirIns case IrBinOpRemUnspecified: case IrBinOpRemRem: case IrBinOpRemMod: + case IrBinOpMaximum: + case IrBinOpMinimum: return ir_analyze_bin_op_math(ira, bin_op_instruction); case IrBinOpArrayCat: return ir_analyze_array_cat(ira, bin_op_instruction); @@ -12135,7 +12277,7 @@ static Stage1AirInst *ir_analyze_instruction_resolve_result(IrAnalyze *ira, Stag if (implicit_elem_type == ira->codegen->builtin_types.entry_anytype) { Buf *bare_name = buf_alloc(); Buf *name = get_anon_type_name(ira->codegen, nullptr, container_string(ContainerKindStruct), - instruction->base.scope, instruction->base.source_node, bare_name); + instruction->base.scope, instruction->base.source_node, bare_name, nullptr); StructSpecial struct_special = StructSpecialInferredStruct; if (instruction->base.source_node->type == NodeTypeContainerInitExpr && @@ -18756,7 +18898,7 @@ static ZigType *type_info_to_type(IrAnalyze *ira, Scope *scope, AstNode *source_ Buf *bare_name = buf_alloc(); Buf *full_name = get_anon_type_name(ira->codegen, - ira->zir, "opaque", scope, source_node, bare_name); + ira->zir, "opaque", scope, source_node, bare_name, nullptr); return get_opaque_type(ira->codegen, scope, source_node, buf_ptr(full_name), bare_name); } @@ -18803,7 +18945,8 @@ static ZigType *type_info_to_type(IrAnalyze *ira, Scope *scope, AstNode *source_ assert(is_slice(slice->type)); ZigType *err_set_type = new_type_table_entry(ZigTypeIdErrorSet); Buf bare_name = BUF_INIT; - buf_init_from_buf(&err_set_type->name, get_anon_type_name(ira->codegen, ira->zir, "error", scope, source_node, &bare_name)); + buf_init_from_buf(&err_set_type->name, + get_anon_type_name(ira->codegen, ira->zir, "error", scope, source_node, &bare_name, nullptr)); err_set_type->size_in_bits = ira->codegen->builtin_types.entry_global_error_set->size_in_bits; err_set_type->abi_align = ira->codegen->builtin_types.entry_global_error_set->abi_align; err_set_type->abi_size = ira->codegen->builtin_types.entry_global_error_set->abi_size; @@ -18882,7 +19025,7 @@ static ZigType *type_info_to_type(IrAnalyze *ira, Scope *scope, AstNode *source_ ZigType *entry = new_type_table_entry(ZigTypeIdStruct); buf_init_from_buf(&entry->name, - get_anon_type_name(ira->codegen, ira->zir, "struct", scope, source_node, &entry->name)); + get_anon_type_name(ira->codegen, ira->zir, "struct", scope, source_node, &entry->name, nullptr)); entry->data.structure.decl_node = source_node; entry->data.structure.fields = alloc_type_struct_fields(fields_len); entry->data.structure.fields_by_name.init(fields_len); @@ -18992,7 +19135,7 @@ static ZigType *type_info_to_type(IrAnalyze *ira, Scope *scope, AstNode *source_ ZigType *entry = new_type_table_entry(ZigTypeIdEnum); buf_init_from_buf(&entry->name, - get_anon_type_name(ira->codegen, ira->zir, "enum", scope, source_node, &entry->name)); + get_anon_type_name(ira->codegen, ira->zir, "enum", scope, source_node, &entry->name, nullptr)); entry->data.enumeration.decl_node = source_node; entry->data.enumeration.tag_int_type = tag_type; entry->data.enumeration.decls_scope = create_decls_scope( @@ -19074,7 +19217,7 @@ static ZigType *type_info_to_type(IrAnalyze *ira, Scope *scope, AstNode *source_ ZigType *entry = new_type_table_entry(ZigTypeIdUnion); buf_init_from_buf(&entry->name, - get_anon_type_name(ira->codegen, ira->zir, "union", scope, source_node, &entry->name)); + get_anon_type_name(ira->codegen, ira->zir, "union", scope, source_node, &entry->name, nullptr)); entry->data.unionation.decl_node = source_node; entry->data.unionation.fields = heap::c_allocator.allocate(fields_len); entry->data.unionation.fields_by_name.init(fields_len); @@ -20318,6 +20461,100 @@ static Stage1AirInst *ir_analyze_instruction_shuffle_vector(IrAnalyze *ira, Stag return ir_analyze_shuffle_vector(ira, instruction->base.scope, instruction->base.source_node, scalar_type, a, b, mask); } +static Stage1AirInst *ir_analyze_instruction_select(IrAnalyze *ira, Stage1ZirInstSelect *instruction) { + Error err; + + ZigType *scalar_type = ir_resolve_vector_elem_type(ira, instruction->scalar_type->child); + if (type_is_invalid(scalar_type)) + return ira->codegen->invalid_inst_gen; + + if ((err = ir_validate_vector_elem_type(ira, instruction->base.source_node, scalar_type))) + return ira->codegen->invalid_inst_gen; + + Stage1AirInst *pred = instruction->pred->child; + if (type_is_invalid(pred->value->type)) + return ira->codegen->invalid_inst_gen; + + Stage1AirInst *a = instruction->a->child; + if (type_is_invalid(a->value->type)) + return ira->codegen->invalid_inst_gen; + + Stage1AirInst *b = instruction->b->child; + if (type_is_invalid(b->value->type)) + return ira->codegen->invalid_inst_gen; + + if (pred->value->type->id != ZigTypeIdVector) { + ir_add_error(ira, pred, + buf_sprintf("expected vector type, found '%s'", + buf_ptr(&pred->value->type->name))); + return ira->codegen->invalid_inst_gen; + } + + uint32_t pred_len = pred->value->type->data.vector.len; + pred = ir_implicit_cast(ira, pred, get_vector_type(ira->codegen, pred_len, + ira->codegen->builtin_types.entry_bool)); + if (type_is_invalid(pred->value->type)) + return ira->codegen->invalid_inst_gen; + + if (a->value->type->id != ZigTypeIdVector) { + ir_add_error(ira, a, + buf_sprintf("expected vector type, found '%s'", + buf_ptr(&a->value->type->name))); + return ira->codegen->invalid_inst_gen; + } + + if (b->value->type->id != ZigTypeIdVector) { + ir_add_error(ira, b, + buf_sprintf("expected vector type, found '%s'", + buf_ptr(&b->value->type->name))); + return ira->codegen->invalid_inst_gen; + } + + ZigType *result_type = get_vector_type(ira->codegen, pred_len, scalar_type); + + a = ir_implicit_cast(ira, a, result_type); + if (type_is_invalid(a->value->type)) + return ira->codegen->invalid_inst_gen; + + b = ir_implicit_cast(ira, b, result_type); + if (type_is_invalid(a->value->type)) + return ira->codegen->invalid_inst_gen; + + if (instr_is_comptime(pred) && instr_is_comptime(a) && instr_is_comptime(b)) { + ZigValue *pred_val = ir_resolve_const(ira, pred, UndefBad); + if (pred_val == nullptr) + return ira->codegen->invalid_inst_gen; + + ZigValue *a_val = ir_resolve_const(ira, a, UndefBad); + if (a_val == nullptr) + return ira->codegen->invalid_inst_gen; + + ZigValue *b_val = ir_resolve_const(ira, b, UndefBad); + if (b_val == nullptr) + return ira->codegen->invalid_inst_gen; + + expand_undef_array(ira->codegen, a_val); + expand_undef_array(ira->codegen, b_val); + + Stage1AirInst *result = ir_const(ira, instruction->base.scope, instruction->base.source_node, result_type); + result->value->data.x_array.data.s_none.elements = ira->codegen->pass1_arena->allocate(pred_len); + + for (uint64_t i = 0; i < pred_len; i += 1) { + ZigValue *dst_elem_val = &result->value->data.x_array.data.s_none.elements[i]; + ZigValue *pred_elem_val = &pred_val->data.x_array.data.s_none.elements[i]; + ZigValue *a_elem_val = &a_val->data.x_array.data.s_none.elements[i]; + ZigValue *b_elem_val = &b_val->data.x_array.data.s_none.elements[i]; + ZigValue *result_elem_val = pred_elem_val->data.x_bool ? a_elem_val : b_elem_val; + copy_const_val(ira->codegen, dst_elem_val, result_elem_val); + } + + result->value->special = ConstValSpecialStatic; + return result; + } + + return ir_build_select_gen(ira, instruction->base.scope, instruction->base.source_node, result_type, pred, a, b); +} + static Stage1AirInst *ir_analyze_instruction_splat(IrAnalyze *ira, Stage1ZirInstSplat *instruction) { Error err; @@ -24595,7 +24832,9 @@ static Stage1AirInst *ir_analyze_instruction_base(IrAnalyze *ira, Stage1ZirInst return ir_analyze_instruction_vector_type(ira, (Stage1ZirInstVectorType *)instruction); case Stage1ZirInstIdShuffleVector: return ir_analyze_instruction_shuffle_vector(ira, (Stage1ZirInstShuffleVector *)instruction); - case Stage1ZirInstIdSplat: + case Stage1ZirInstIdSelect: + return ir_analyze_instruction_select(ira, (Stage1ZirInstSelect *)instruction); + case Stage1ZirInstIdSplat: return ir_analyze_instruction_splat(ira, (Stage1ZirInstSplat *)instruction); case Stage1ZirInstIdBoolNot: return ir_analyze_instruction_bool_not(ira, (Stage1ZirInstBoolNot *)instruction); @@ -24931,6 +25170,7 @@ bool ir_inst_gen_has_side_effects(Stage1AirInst *instruction) { case Stage1AirInstIdUnionTag: case Stage1AirInstIdTruncate: case Stage1AirInstIdShuffleVector: + case Stage1AirInstIdSelect: case Stage1AirInstIdSplat: case Stage1AirInstIdBoolNot: case Stage1AirInstIdReturnAddress: @@ -25084,6 +25324,7 @@ bool ir_inst_src_has_side_effects(Stage1ZirInst *instruction) { case Stage1ZirInstIdTruncate: case Stage1ZirInstIdVectorType: case Stage1ZirInstIdShuffleVector: + case Stage1ZirInstIdSelect: case Stage1ZirInstIdSplat: case Stage1ZirInstIdBoolNot: case Stage1ZirInstIdSlice: @@ -25751,7 +25992,7 @@ static Error ir_resolve_lazy_recurse_array(AstNode *source_node, ZigValue *val, static Error ir_resolve_lazy_recurse(AstNode *source_node, ZigValue *val) { Error err; - if ((err = ir_resolve_lazy_raw(source_node, val))) + if ((err = ir_resolve_lazy_raw(source_node, val))) return err; assert(val->special != ConstValSpecialRuntime); assert(val->special != ConstValSpecialLazy); diff --git a/src/stage1/ir_print.cpp b/src/stage1/ir_print.cpp index bec9521bc2..96e924b768 100644 --- a/src/stage1/ir_print.cpp +++ b/src/stage1/ir_print.cpp @@ -93,6 +93,8 @@ const char* ir_inst_src_type_str(Stage1ZirInstId id) { return "SrcInvalid"; case Stage1ZirInstIdShuffleVector: return "SrcShuffle"; + case Stage1ZirInstIdSelect: + return "SrcSelect"; case Stage1ZirInstIdSplat: return "SrcSplat"; case Stage1ZirInstIdDeclVar: @@ -379,6 +381,8 @@ const char* ir_inst_gen_type_str(Stage1AirInstId id) { return "GenInvalid"; case Stage1AirInstIdShuffleVector: return "GenShuffle"; + case Stage1AirInstIdSelect: + return "GenSelect"; case Stage1AirInstIdSplat: return "GenSplat"; case Stage1AirInstIdDeclVar: @@ -729,6 +733,10 @@ static const char *ir_bin_op_id_str(IrBinOp op_id) { return "++"; case IrBinOpArrayMult: return "**"; + case IrBinOpMaximum: + return "@maximum"; + case IrBinOpMinimum: + return "@minimum"; } zig_unreachable(); } @@ -1722,6 +1730,28 @@ static void ir_print_shuffle_vector(IrPrintGen *irp, Stage1AirInstShuffleVector fprintf(irp->f, ")"); } +static void ir_print_select(IrPrintSrc *irp, Stage1ZirInstSelect *instruction) { + fprintf(irp->f, "@select("); + ir_print_other_inst_src(irp, instruction->scalar_type); + fprintf(irp->f, ", "); + ir_print_other_inst_src(irp, instruction->pred); + fprintf(irp->f, ", "); + ir_print_other_inst_src(irp, instruction->a); + fprintf(irp->f, ", "); + ir_print_other_inst_src(irp, instruction->b); + fprintf(irp->f, ")"); +} + +static void ir_print_select(IrPrintGen *irp, Stage1AirInstSelect *instruction) { + fprintf(irp->f, "@select("); + ir_print_other_inst_gen(irp, instruction->pred); + fprintf(irp->f, ", "); + ir_print_other_inst_gen(irp, instruction->a); + fprintf(irp->f, ", "); + ir_print_other_inst_gen(irp, instruction->b); + fprintf(irp->f, ")"); +} + static void ir_print_splat_src(IrPrintSrc *irp, Stage1ZirInstSplat *instruction) { fprintf(irp->f, "@splat("); ir_print_other_inst_src(irp, instruction->len); @@ -2836,6 +2866,9 @@ static void ir_print_inst_src(IrPrintSrc *irp, Stage1ZirInst *instruction, bool case Stage1ZirInstIdShuffleVector: ir_print_shuffle_vector(irp, (Stage1ZirInstShuffleVector *)instruction); break; + case Stage1ZirInstIdSelect: + ir_print_select(irp, (Stage1ZirInstSelect *)instruction); + break; case Stage1ZirInstIdSplat: ir_print_splat_src(irp, (Stage1ZirInstSplat *)instruction); break; @@ -3178,6 +3211,9 @@ static void ir_print_inst_gen(IrPrintGen *irp, Stage1AirInst *instruction, bool case Stage1AirInstIdShuffleVector: ir_print_shuffle_vector(irp, (Stage1AirInstShuffleVector *)instruction); break; + case Stage1AirInstIdSelect: + ir_print_select(irp, (Stage1AirInstSelect *)instruction); + break; case Stage1AirInstIdSplat: ir_print_splat_gen(irp, (Stage1AirInstSplat *)instruction); break; diff --git a/src/test.zig b/src/test.zig index af7b3a1736..960aac7bc7 100644 --- a/src/test.zig +++ b/src/test.zig @@ -228,7 +228,7 @@ pub const TestContext = struct { continue; } // example: "file.zig:1:2: error: bad thing happened" - var it = std.mem.split(err_msg_line, ":"); + var it = std.mem.split(u8, err_msg_line, ":"); const src_path = it.next() orelse @panic("missing colon"); const line_text = it.next() orelse @panic("missing line"); const col_text = it.next() orelse @panic("missing column"); @@ -779,7 +779,7 @@ pub const TestContext = struct { } var ok = true; if (case.expect_exact) { - var err_iter = std.mem.split(result.stderr, "\n"); + var err_iter = std.mem.split(u8, result.stderr, "\n"); var i: usize = 0; ok = while (err_iter.next()) |line| : (i += 1) { if (i >= case_error_list.len) break false; diff --git a/src/translate_c.zig b/src/translate_c.zig index 395a314f7c..e11fc5b736 100644 --- a/src/translate_c.zig +++ b/src/translate_c.zig @@ -1308,6 +1308,10 @@ fn transStmt( const shuffle_vec_node = try transShuffleVectorExpr(c, scope, shuffle_vec_expr); return maybeSuppressResult(c, scope, result_used, shuffle_vec_node); }, + .ChooseExprClass => { + const choose_expr = @ptrCast(*const clang.ChooseExpr, stmt); + return transExpr(c, scope, choose_expr.getChosenSubExpr(), result_used); + }, // When adding new cases here, see comment for maybeBlockify() .GCCAsmStmtClass, .GotoStmtClass, @@ -1969,7 +1973,7 @@ fn transBuiltinFnExpr(c: *Context, scope: *Scope, expr: *const clang.Expr, used: const node = try transExpr(c, scope, expr, used); if (node.castTag(.identifier)) |ident| { const name = ident.data; - if (!isBuiltinDefined(name)) return fail(c, error.UnsupportedTranslation, expr.getBeginLoc(), "TODO implement function '{s}' in std.c.builtins", .{name}); + if (!isBuiltinDefined(name)) return fail(c, error.UnsupportedTranslation, expr.getBeginLoc(), "TODO implement function '{s}' in std.zig.c_builtins", .{name}); } return node; } @@ -1981,10 +1985,11 @@ fn transBoolExpr( used: ResultUsed, ) TransError!Node { if (@ptrCast(*const clang.Stmt, expr).getStmtClass() == .IntegerLiteralClass) { - var is_zero: bool = undefined; - if (!(@ptrCast(*const clang.IntegerLiteral, expr).isZero(&is_zero, c.clang_context))) { + var signum: c_int = undefined; + if (!(@ptrCast(*const clang.IntegerLiteral, expr).getSignum(&signum, c.clang_context))) { return fail(c, error.UnsupportedTranslation, expr.getBeginLoc(), "invalid integer literal", .{}); } + const is_zero = signum == 0; return Node{ .tag_if_small_enough = @enumToInt(([2]Tag{ .true_literal, .false_literal })[@boolToInt(is_zero)]) }; } @@ -3269,30 +3274,114 @@ fn transMemberExpr(c: *Context, scope: *Scope, stmt: *const clang.MemberExpr, re return maybeSuppressResult(c, scope, result_used, node); } +/// ptr[subscr] (`subscr` is a signed integer expression, `ptr` a pointer) becomes: +/// (blk: { +/// const tmp = subscr; +/// if (tmp >= 0) break :blk ptr + @intCast(usize, tmp) else break :blk ptr - ~@bitCast(usize, @intCast(isize, tmp) +% -1); +/// }).* +/// Todo: rip this out once `[*]T + isize` becomes valid. +fn transSignedArrayAccess( + c: *Context, + scope: *Scope, + container_expr: *const clang.Expr, + subscr_expr: *const clang.Expr, + result_used: ResultUsed, +) TransError!Node { + var block_scope = try Scope.Block.init(c, scope, true); + defer block_scope.deinit(); + + const tmp = try block_scope.makeMangledName(c, "tmp"); + + const subscr_node = try transExpr(c, &block_scope.base, subscr_expr, .used); + const subscr_decl = try Tag.var_simple.create(c.arena, .{ .name = tmp, .init = subscr_node }); + try block_scope.statements.append(subscr_decl); + + const tmp_ref = try Tag.identifier.create(c.arena, tmp); + + const container_node = try transExpr(c, &block_scope.base, container_expr, .used); + + const cond_node = try Tag.greater_than_equal.create(c.arena, .{ .lhs = tmp_ref, .rhs = Tag.zero_literal.init() }); + + const then_value = try Tag.add.create(c.arena, .{ + .lhs = container_node, + .rhs = try Tag.int_cast.create(c.arena, .{ + .lhs = try Tag.identifier.create(c.arena, "usize"), + .rhs = tmp_ref, + }), + }); + + const then_body = try Tag.break_val.create(c.arena, .{ + .label = block_scope.label, + .val = then_value, + }); + + const minuend = container_node; + const signed_size = try Tag.int_cast.create(c.arena, .{ + .lhs = try Tag.identifier.create(c.arena, "isize"), + .rhs = tmp_ref, + }); + const to_cast = try Tag.add_wrap.create(c.arena, .{ + .lhs = signed_size, + .rhs = try Tag.negate.create(c.arena, Tag.one_literal.init()), + }); + const bitcast_node = try Tag.bit_cast.create(c.arena, .{ + .lhs = try Tag.identifier.create(c.arena, "usize"), + .rhs = to_cast, + }); + const subtrahend = try Tag.bit_not.create(c.arena, bitcast_node); + const difference = try Tag.sub.create(c.arena, .{ + .lhs = minuend, + .rhs = subtrahend, + }); + const else_body = try Tag.break_val.create(c.arena, .{ + .label = block_scope.label, + .val = difference, + }); + + const if_node = try Tag.@"if".create(c.arena, .{ + .cond = cond_node, + .then = then_body, + .@"else" = else_body, + }); + + try block_scope.statements.append(if_node); + const block_node = try block_scope.complete(c); + + const derefed = try Tag.deref.create(c.arena, block_node); + + return maybeSuppressResult(c, &block_scope.base, result_used, derefed); +} + fn transArrayAccess(c: *Context, scope: *Scope, stmt: *const clang.ArraySubscriptExpr, result_used: ResultUsed) TransError!Node { - var base_stmt = stmt.getBase(); + const base_stmt = stmt.getBase(); + const base_qt = getExprQualType(c, base_stmt); + const is_vector = cIsVector(base_qt); + + const subscr_expr = stmt.getIdx(); + const subscr_qt = getExprQualType(c, subscr_expr); + const is_longlong = cIsLongLongInteger(subscr_qt); + const is_signed = cIsSignedInteger(subscr_qt); + const is_nonnegative_int_literal = cIsNonNegativeIntLiteral(c, subscr_expr); // Unwrap the base statement if it's an array decayed to a bare pointer type // so that we index the array itself + var unwrapped_base = base_stmt; if (@ptrCast(*const clang.Stmt, base_stmt).getStmtClass() == .ImplicitCastExprClass) { const implicit_cast = @ptrCast(*const clang.ImplicitCastExpr, base_stmt); if (implicit_cast.getCastKind() == .ArrayToPointerDecay) { - base_stmt = implicit_cast.getSubExpr(); + unwrapped_base = implicit_cast.getSubExpr(); } } - const container_node = try transExpr(c, scope, base_stmt, .used); - - // cast if the index is long long or signed - const subscr_expr = stmt.getIdx(); - const qt = getExprQualType(c, subscr_expr); - const is_longlong = cIsLongLongInteger(qt); - const is_signed = cIsSignedInteger(qt); + // Special case: actual pointer (not decayed array) and signed integer subscript + // See discussion at https://github.com/ziglang/zig/pull/8589 + if (is_signed and (base_stmt == unwrapped_base) and !is_vector and !is_nonnegative_int_literal) return transSignedArrayAccess(c, scope, base_stmt, subscr_expr, result_used); + const container_node = try transExpr(c, scope, unwrapped_base, .used); const rhs = if (is_longlong or is_signed) blk: { // check if long long first so that signed long long doesn't just become unsigned long long - var typeid_node = if (is_longlong) try Tag.identifier.create(c.arena, "usize") else try transQualTypeIntWidthOf(c, qt, false); + const typeid_node = if (is_longlong) try Tag.identifier.create(c.arena, "usize") else try transQualTypeIntWidthOf(c, subscr_qt, false); break :blk try Tag.int_cast.create(c.arena, .{ .lhs = typeid_node, .rhs = try transExpr(c, scope, subscr_expr, .used) }); } else try transExpr(c, scope, subscr_expr, .used); @@ -4173,6 +4262,18 @@ fn cIntTypeCmp(a: clang.QualType, b: clang.QualType) math.Order { return math.order(a_index, b_index); } +/// Checks if expr is an integer literal >= 0 +fn cIsNonNegativeIntLiteral(c: *Context, expr: *const clang.Expr) bool { + if (@ptrCast(*const clang.Stmt, expr).getStmtClass() == .IntegerLiteralClass) { + var signum: c_int = undefined; + if (!(@ptrCast(*const clang.IntegerLiteral, expr).getSignum(&signum, c.clang_context))) { + return false; + } + return signum >= 0; + } + return false; +} + fn cIsSignedInteger(qt: clang.QualType) bool { const c_type = qualTypeCanon(qt); if (c_type.getTypeClass() != .Builtin) return false; @@ -4877,6 +4978,17 @@ const PatternList = struct { , "WL_CONTAINER_OF", }, + + [2][]const u8{ "IGNORE_ME(X) ((void)(X))", "DISCARD" }, + [2][]const u8{ "IGNORE_ME(X) (void)(X)", "DISCARD" }, + [2][]const u8{ "IGNORE_ME(X) ((const void)(X))", "DISCARD" }, + [2][]const u8{ "IGNORE_ME(X) (const void)(X)", "DISCARD" }, + [2][]const u8{ "IGNORE_ME(X) ((volatile void)(X))", "DISCARD" }, + [2][]const u8{ "IGNORE_ME(X) (volatile void)(X)", "DISCARD" }, + [2][]const u8{ "IGNORE_ME(X) ((const volatile void)(X))", "DISCARD" }, + [2][]const u8{ "IGNORE_ME(X) (const volatile void)(X)", "DISCARD" }, + [2][]const u8{ "IGNORE_ME(X) ((volatile const void)(X))", "DISCARD" }, + [2][]const u8{ "IGNORE_ME(X) (volatile const void)(X)", "DISCARD" }, }; /// Assumes that `ms` represents a tokenized function-like macro. @@ -5051,6 +5163,16 @@ test "Macro matching" { try helper.checkMacro(allocator, pattern_list, "NO_MATCH(X, Y) (X + Y)", null); try helper.checkMacro(allocator, pattern_list, "CAST_OR_CALL(X, Y) (X)(Y)", "CAST_OR_CALL"); + try helper.checkMacro(allocator, pattern_list, "IGNORE_ME(X) (void)(X)", "DISCARD"); + try helper.checkMacro(allocator, pattern_list, "IGNORE_ME(X) ((void)(X))", "DISCARD"); + try helper.checkMacro(allocator, pattern_list, "IGNORE_ME(X) (const void)(X)", "DISCARD"); + try helper.checkMacro(allocator, pattern_list, "IGNORE_ME(X) ((const void)(X))", "DISCARD"); + try helper.checkMacro(allocator, pattern_list, "IGNORE_ME(X) (volatile void)(X)", "DISCARD"); + try helper.checkMacro(allocator, pattern_list, "IGNORE_ME(X) ((volatile void)(X))", "DISCARD"); + try helper.checkMacro(allocator, pattern_list, "IGNORE_ME(X) (const volatile void)(X)", "DISCARD"); + try helper.checkMacro(allocator, pattern_list, "IGNORE_ME(X) ((const volatile void)(X))", "DISCARD"); + try helper.checkMacro(allocator, pattern_list, "IGNORE_ME(X) (volatile const void)(X)", "DISCARD"); + try helper.checkMacro(allocator, pattern_list, "IGNORE_ME(X) ((volatile const void)(X))", "DISCARD"); } const MacroCtx = struct { @@ -5574,7 +5696,7 @@ fn parseCPrimaryExprInner(c: *Context, m: *MacroCtx, scope: *Scope) ParseError!N .Identifier => { const mangled_name = scope.getAlias(slice); if (mem.startsWith(u8, mangled_name, "__builtin_") and !isBuiltinDefined(mangled_name)) { - try m.fail(c, "TODO implement function '{s}' in std.c.builtins", .{mangled_name}); + try m.fail(c, "TODO implement function '{s}' in std.zig.c_builtins", .{mangled_name}); return error.ParseError; } const identifier = try Tag.identifier.create(c.arena, builtin_typedef_map.get(mangled_name) orelse mangled_name); diff --git a/src/type.zig b/src/type.zig index 731c69b806..28b87a8afe 100644 --- a/src/type.zig +++ b/src/type.zig @@ -21,8 +21,15 @@ pub const Type = extern union { tag_if_small_enough: usize, ptr_otherwise: *Payload, - pub fn zigTypeTag(self: Type) std.builtin.TypeId { - switch (self.tag()) { + pub fn zigTypeTag(ty: Type) std.builtin.TypeId { + return ty.zigTypeTagOrPoison() catch unreachable; + } + + pub fn zigTypeTagOrPoison(ty: Type) error{GenericPoison}!std.builtin.TypeId { + switch (ty.tag()) { + .generic_poison => return error.GenericPoison, + + .u1, .u8, .i8, .u16, @@ -425,7 +432,7 @@ pub const Type = extern union { const sentinel_b = info_b.sentinel; if (sentinel_a) |sa| { if (sentinel_b) |sb| { - if (!sa.eql(sb)) + if (!sa.eql(sb, info_a.pointee_type)) return false; } else { return false; @@ -454,13 +461,14 @@ pub const Type = extern union { .Array, .Vector => { if (a.arrayLen() != b.arrayLen()) return false; - if (!a.elemType().eql(b.elemType())) + const elem_ty = a.elemType(); + if (!elem_ty.eql(b.elemType())) return false; const sentinel_a = a.sentinel(); const sentinel_b = b.sentinel(); if (sentinel_a) |sa| { if (sentinel_b) |sb| { - return sa.eql(sb); + return sa.eql(sb, elem_ty); } else { return false; } @@ -546,8 +554,13 @@ pub const Type = extern union { pub fn hash(self: Type) u64 { var hasher = std.hash.Wyhash.init(0); + self.hashWithHasher(&hasher); + return hasher.final(); + } + + pub fn hashWithHasher(self: Type, hasher: *std.hash.Wyhash) void { const zig_type_tag = self.zigTypeTag(); - std.hash.autoHash(&hasher, zig_type_tag); + std.hash.autoHash(hasher, zig_type_tag); switch (zig_type_tag) { .Type, .Void, @@ -565,34 +578,34 @@ pub const Type = extern union { .Int => { // Detect that e.g. u64 != usize, even if the bits match on a particular target. if (self.isNamedInt()) { - std.hash.autoHash(&hasher, self.tag()); + std.hash.autoHash(hasher, self.tag()); } else { // Remaining cases are arbitrary sized integers. // The target will not be branched upon, because we handled target-dependent cases above. const info = self.intInfo(@as(Target, undefined)); - std.hash.autoHash(&hasher, info.signedness); - std.hash.autoHash(&hasher, info.bits); + std.hash.autoHash(hasher, info.signedness); + std.hash.autoHash(hasher, info.bits); } }, .Array, .Vector => { - std.hash.autoHash(&hasher, self.arrayLen()); - std.hash.autoHash(&hasher, self.elemType().hash()); + std.hash.autoHash(hasher, self.arrayLen()); + std.hash.autoHash(hasher, self.elemType().hash()); // TODO hash array sentinel }, .Fn => { - std.hash.autoHash(&hasher, self.fnReturnType().hash()); - std.hash.autoHash(&hasher, self.fnCallingConvention()); + std.hash.autoHash(hasher, self.fnReturnType().hash()); + std.hash.autoHash(hasher, self.fnCallingConvention()); const params_len = self.fnParamLen(); - std.hash.autoHash(&hasher, params_len); + std.hash.autoHash(hasher, params_len); var i: usize = 0; while (i < params_len) : (i += 1) { - std.hash.autoHash(&hasher, self.fnParamType(i).hash()); + std.hash.autoHash(hasher, self.fnParamType(i).hash()); } - std.hash.autoHash(&hasher, self.fnIsVarArgs()); + std.hash.autoHash(hasher, self.fnIsVarArgs()); }, .Optional => { var buf: Payload.ElemType = undefined; - std.hash.autoHash(&hasher, self.optionalChild(&buf).hash()); + std.hash.autoHash(hasher, self.optionalChild(&buf).hash()); }, .Float, .Struct, @@ -609,7 +622,6 @@ pub const Type = extern union { // TODO implement more type hashing }, } - return hasher.final(); } pub const HashContext64 = struct { @@ -638,6 +650,7 @@ pub const Type = extern union { if (self.tag_if_small_enough < Tag.no_payload_count) { return Type{ .tag_if_small_enough = self.tag_if_small_enough }; } else switch (self.ptr_otherwise.tag) { + .u1, .u8, .i8, .u16, @@ -696,6 +709,7 @@ pub const Type = extern union { .export_options, .extern_options, .@"anyframe", + .generic_poison, => unreachable, .array_u8, @@ -756,11 +770,15 @@ pub const Type = extern union { for (payload.param_types) |param_type, i| { param_types[i] = try param_type.copy(allocator); } + const other_comptime_params = payload.comptime_params[0..payload.param_types.len]; + const comptime_params = try allocator.dupe(bool, other_comptime_params); return Tag.function.create(allocator, .{ .return_type = try payload.return_type.copy(allocator), .param_types = param_types, .cc = payload.cc, .is_var_args = payload.is_var_args, + .is_generic = payload.is_generic, + .comptime_params = comptime_params.ptr, }); }, .pointer => { @@ -819,6 +837,7 @@ pub const Type = extern union { while (true) { const t = ty.tag(); switch (t) { + .u1, .u8, .i8, .u16, @@ -1075,13 +1094,121 @@ pub const Type = extern union { }, .inferred_alloc_const => return writer.writeAll("(inferred_alloc_const)"), .inferred_alloc_mut => return writer.writeAll("(inferred_alloc_mut)"), + .generic_poison => return writer.writeAll("(generic poison)"), } unreachable; } } + /// Anything that reports hasCodeGenBits() false returns false here as well. + /// `generic_poison` will return false. + pub fn requiresComptime(ty: Type) bool { + return switch (ty.tag()) { + .u1, + .u8, + .i8, + .u16, + .i16, + .u32, + .i32, + .u64, + .i64, + .u128, + .i128, + .usize, + .isize, + .c_short, + .c_ushort, + .c_int, + .c_uint, + .c_long, + .c_ulong, + .c_longlong, + .c_ulonglong, + .c_longdouble, + .f16, + .f32, + .f64, + .f128, + .c_void, + .bool, + .void, + .anyerror, + .noreturn, + .@"anyframe", + .@"null", + .@"undefined", + .atomic_ordering, + .atomic_rmw_op, + .calling_convention, + .float_mode, + .reduce_op, + .call_options, + .export_options, + .extern_options, + .manyptr_u8, + .manyptr_const_u8, + .fn_noreturn_no_args, + .fn_void_no_args, + .fn_naked_noreturn_no_args, + .fn_ccc_void_no_args, + .single_const_pointer_to_comptime_int, + .const_slice_u8, + .anyerror_void_error_union, + .empty_struct_literal, + .function, + .empty_struct, + .error_set, + .error_set_single, + .error_set_inferred, + .@"opaque", + .generic_poison, + => false, + + .type, + .comptime_int, + .comptime_float, + .enum_literal, + => true, + + .var_args_param => unreachable, + .inferred_alloc_mut => unreachable, + .inferred_alloc_const => unreachable, + + .array_u8, + .array_u8_sentinel_0, + .array, + .array_sentinel, + .vector, + .pointer, + .single_const_pointer, + .single_mut_pointer, + .many_const_pointer, + .many_mut_pointer, + .c_const_pointer, + .c_mut_pointer, + .const_slice, + .mut_slice, + .int_signed, + .int_unsigned, + .optional, + .optional_single_mut_pointer, + .optional_single_const_pointer, + .error_union, + .anyframe_T, + .@"struct", + .@"union", + .union_tagged, + .enum_simple, + .enum_full, + .enum_nonexhaustive, + => false, // TODO some of these should be `true` depending on their child types + }; + } + pub fn toValue(self: Type, allocator: *Allocator) Allocator.Error!Value { switch (self.tag()) { + .u1 => return Value.initTag(.u1_type), .u8 => return Value.initTag(.u8_type), .i8 => return Value.initTag(.i8_type), .u16 => return Value.initTag(.u16_type), @@ -1141,6 +1268,7 @@ pub const Type = extern union { pub fn hasCodeGenBits(self: Type) bool { return switch (self.tag()) { + .u1, .u8, .i8, .u16, @@ -1172,7 +1300,6 @@ pub const Type = extern union { .fn_void_no_args, .fn_naked_noreturn_no_args, .fn_ccc_void_no_args, - .function, .single_const_pointer_to_comptime_int, .const_slice_u8, .array_u8_sentinel_0, @@ -1197,6 +1324,8 @@ pub const Type = extern union { .anyframe_T, => true, + .function => !self.castTag(.function).?.data.is_generic, + .@"struct" => { // TODO introduce lazy value mechanism const struct_obj = self.castTag(.@"struct").?.data; @@ -1276,6 +1405,7 @@ pub const Type = extern union { .inferred_alloc_const => unreachable, .inferred_alloc_mut => unreachable, .var_args_param => unreachable, + .generic_poison => unreachable, }; } @@ -1321,6 +1451,7 @@ pub const Type = extern union { /// Asserts that hasCodeGenBits() is true. pub fn abiAlignment(self: Type, target: Target) u32 { return switch (self.tag()) { + .u1, .u8, .i8, .bool, @@ -1497,6 +1628,8 @@ pub const Type = extern union { .@"opaque", .var_args_param, => unreachable, + + .generic_poison => unreachable, }; } @@ -1524,8 +1657,11 @@ pub const Type = extern union { .inferred_alloc_mut => unreachable, .@"opaque" => unreachable, .var_args_param => unreachable, + .generic_poison => unreachable, .@"struct" => { + const s = self.castTag(.@"struct").?.data; + assert(s.status == .have_layout); @panic("TODO abiSize struct"); }, .enum_simple, .enum_full, .enum_nonexhaustive => { @@ -1537,6 +1673,7 @@ pub const Type = extern union { @panic("TODO abiSize unions"); }, + .u1, .u8, .i8, .bool, @@ -1687,6 +1824,7 @@ pub const Type = extern union { .inferred_alloc_mut => unreachable, .@"opaque" => unreachable, .var_args_param => unreachable, + .generic_poison => unreachable, .@"struct" => { @panic("TODO bitSize struct"); @@ -1702,7 +1840,7 @@ pub const Type = extern union { .u8, .i8 => 8, - .bool => 1, + .bool, .u1 => 1, .vector => { const payload = self.castTag(.vector).?.data; @@ -2215,12 +2353,13 @@ pub const Type = extern union { pub fn isUnsignedInt(self: Type) bool { return switch (self.tag()) { .int_unsigned, - .u8, .usize, .c_ushort, .c_uint, .c_ulong, .c_ulonglong, + .u1, + .u8, .u16, .u32, .u64, @@ -2242,6 +2381,7 @@ pub const Type = extern union { .signedness = .signed, .bits = self.castTag(.int_signed).?.data, }, + .u1 => .{ .signedness = .unsigned, .bits = 1 }, .u8 => .{ .signedness = .unsigned, .bits = 8 }, .i8 => .{ .signedness = .signed, .bits = 8 }, .u16 => .{ .signedness = .unsigned, .bits = 16 }, @@ -2395,6 +2535,46 @@ pub const Type = extern union { }; } + pub fn fnInfo(ty: Type) Payload.Function.Data { + return switch (ty.tag()) { + .fn_noreturn_no_args => .{ + .param_types = &.{}, + .comptime_params = undefined, + .return_type = initTag(.noreturn), + .cc = .Unspecified, + .is_var_args = false, + .is_generic = false, + }, + .fn_void_no_args => .{ + .param_types = &.{}, + .comptime_params = undefined, + .return_type = initTag(.void), + .cc = .Unspecified, + .is_var_args = false, + .is_generic = false, + }, + .fn_naked_noreturn_no_args => .{ + .param_types = &.{}, + .comptime_params = undefined, + .return_type = initTag(.noreturn), + .cc = .Naked, + .is_var_args = false, + .is_generic = false, + }, + .fn_ccc_void_no_args => .{ + .param_types = &.{}, + .comptime_params = undefined, + .return_type = initTag(.void), + .cc = .C, + .is_var_args = false, + .is_generic = false, + }, + .function => ty.castTag(.function).?.data, + + else => unreachable, + }; + } + pub fn isNumeric(self: Type) bool { return switch (self.tag()) { .f16, @@ -2404,6 +2584,7 @@ pub const Type = extern union { .c_longdouble, .comptime_int, .comptime_float, + .u1, .u8, .i8, .u16, @@ -2444,6 +2625,7 @@ pub const Type = extern union { .c_longdouble, .comptime_int, .comptime_float, + .u1, .u8, .i8, .u16, @@ -2567,14 +2749,19 @@ pub const Type = extern union { .inferred_alloc_const => unreachable, .inferred_alloc_mut => unreachable, + .generic_poison => unreachable, }; } - pub fn isIndexable(self: Type) bool { - const zig_tag = self.zigTypeTag(); - // TODO tuples are indexable - return zig_tag == .Array or zig_tag == .Vector or self.isSlice() or - (self.isSinglePointer() and self.elemType().zigTypeTag() == .Array); + pub fn isIndexable(ty: Type) bool { + return switch (ty.zigTypeTag()) { + .Array, .Vector => true, + .Pointer => switch (ty.ptrSize()) { + .Slice, .Many, .C => true, + .One => ty.elemType().zigTypeTag() == .Array, + }, + else => false, // TODO tuples are indexable + }; } /// Returns null if the type has no namespace. @@ -2731,29 +2918,37 @@ pub const Type = extern union { return @as(usize, payload.data); } const S = struct { - fn fieldWithRange(int_val: Value, end: usize) ?usize { + fn fieldWithRange(int_ty: Type, int_val: Value, end: usize) ?usize { if (int_val.compareWithZero(.lt)) return null; var end_payload: Value.Payload.U64 = .{ .base = .{ .tag = .int_u64 }, .data = end, }; const end_val = Value.initPayload(&end_payload.base); - if (int_val.compare(.gte, end_val)) return null; + if (int_val.compare(.gte, end_val, int_ty)) return null; return @intCast(usize, int_val.toUnsignedInt()); } }; switch (ty.tag()) { .enum_full, .enum_nonexhaustive => { const enum_full = ty.cast(Payload.EnumFull).?.data; + const tag_ty = enum_full.tag_ty; if (enum_full.values.count() == 0) { - return S.fieldWithRange(enum_tag, enum_full.fields.count()); + return S.fieldWithRange(tag_ty, enum_tag, enum_full.fields.count()); } else { - return enum_full.values.getIndex(enum_tag); + return enum_full.values.getIndexContext(enum_tag, .{ .ty = tag_ty }); } }, .enum_simple => { const enum_simple = ty.castTag(.enum_simple).?.data; - return S.fieldWithRange(enum_tag, enum_simple.fields.count()); + const fields_len = enum_simple.fields.count(); + const bits = std.math.log2_int_ceil(usize, fields_len); + var buffer: Payload.Bits = .{ + .base = .{ .tag = .int_unsigned }, + .data = bits, + }; + const tag_ty = Type.initPayload(&buffer.base); + return S.fieldWithRange(tag_ty, enum_tag, fields_len); }, .atomic_ordering, .atomic_rmw_op, @@ -2768,6 +2963,26 @@ pub const Type = extern union { } } + pub fn structFieldCount(ty: Type) usize { + switch (ty.tag()) { + .@"struct" => { + const struct_obj = ty.castTag(.@"struct").?.data; + return struct_obj.fields.count(); + }, + else => unreachable, + } + } + + pub fn structFieldType(ty: Type, index: usize) Type { + switch (ty.tag()) { + .@"struct" => { + const struct_obj = ty.castTag(.@"struct").?.data; + return struct_obj.fields.values()[index].ty; + }, + else => unreachable, + } + } + pub fn declSrcLoc(ty: Type) Module.SrcLoc { switch (ty.tag()) { .enum_full, .enum_nonexhaustive => { @@ -2842,14 +3057,14 @@ pub const Type = extern union { /// Asserts the type is an enum. pub fn enumHasInt(ty: Type, int: Value, target: Target) bool { const S = struct { - fn intInRange(int_val: Value, end: usize) bool { + fn intInRange(tag_ty: Type, int_val: Value, end: usize) bool { if (int_val.compareWithZero(.lt)) return false; var end_payload: Value.Payload.U64 = .{ .base = .{ .tag = .int_u64 }, .data = end, }; const end_val = Value.initPayload(&end_payload.base); - if (int_val.compare(.gte, end_val)) return false; + if (int_val.compare(.gte, end_val, tag_ty)) return false; return true; } }; @@ -2857,15 +3072,23 @@ pub const Type = extern union { .enum_nonexhaustive => return int.intFitsInType(ty, target), .enum_full => { const enum_full = ty.castTag(.enum_full).?.data; + const tag_ty = enum_full.tag_ty; if (enum_full.values.count() == 0) { - return S.intInRange(int, enum_full.fields.count()); + return S.intInRange(tag_ty, int, enum_full.fields.count()); } else { - return enum_full.values.contains(int); + return enum_full.values.containsContext(int, .{ .ty = tag_ty }); } }, .enum_simple => { const enum_simple = ty.castTag(.enum_simple).?.data; - return S.intInRange(int, enum_simple.fields.count()); + const fields_len = enum_simple.fields.count(); + const bits = std.math.log2_int_ceil(usize, fields_len); + var buffer: Payload.Bits = .{ + .base = .{ .tag = .int_unsigned }, + .data = bits, + }; + const tag_ty = Type.initPayload(&buffer.base); + return S.intInRange(tag_ty, int, fields_len); }, .atomic_ordering, .atomic_rmw_op, @@ -2889,6 +3112,7 @@ pub const Type = extern union { /// See `zigTypeTag` for the function that corresponds to `std.builtin.TypeId`. pub const Tag = enum { // The first section of this enum are tags that require no payload. + u1, u8, i8, u16, @@ -2943,6 +3167,7 @@ pub const Type = extern union { single_const_pointer_to_comptime_int, const_slice_u8, anyerror_void_error_union, + generic_poison, /// This is a special type for variadic parameters of a function call. /// Casts to it will validate that the type can be passed to a c calling convetion function. var_args_param, @@ -2996,6 +3221,7 @@ pub const Type = extern union { pub fn Type(comptime t: Tag) type { return switch (t) { + .u1, .u8, .i8, .u16, @@ -3039,6 +3265,7 @@ pub const Type = extern union { .single_const_pointer_to_comptime_int, .anyerror_void_error_union, .const_slice_u8, + .generic_poison, .inferred_alloc_const, .inferred_alloc_mut, .var_args_param, @@ -3157,12 +3384,23 @@ pub const Type = extern union { pub const base_tag = Tag.function; base: Payload = Payload{ .tag = base_tag }, - data: struct { + data: Data, + + // TODO look into optimizing this memory to take fewer bytes + pub const Data = struct { param_types: []Type, + comptime_params: [*]bool, return_type: Type, cc: std.builtin.CallingConvention, is_var_args: bool, - }, + is_generic: bool, + + pub fn paramIsComptime(self: @This(), i: usize) bool { + if (!self.is_generic) return false; + assert(i < self.param_types.len); + return self.comptime_params[i]; + } + }; }; pub const ErrorSet = struct { diff --git a/src/value.zig b/src/value.zig index abb2ea7b1e..562d7171e8 100644 --- a/src/value.zig +++ b/src/value.zig @@ -22,6 +22,7 @@ pub const Value = extern union { pub const Tag = enum { // The first section of this enum are tags that require no payload. + u1_type, u8_type, i8_type, u16_type, @@ -75,6 +76,8 @@ pub const Value = extern union { fn_ccc_void_no_args_type, single_const_pointer_to_comptime_int_type, const_slice_u8_type, + anyerror_void_error_union_type, + generic_poison_type, undef, zero, @@ -84,6 +87,7 @@ pub const Value = extern union { null_value, bool_true, bool_false, + generic_poison, abi_align_default, empty_struct_value, @@ -99,12 +103,13 @@ pub const Value = extern union { function, extern_fn, variable, - /// Represents a pointer to another immutable value. - ref_val, - /// Represents a comptime variables storage. - comptime_alloc, - /// Represents a pointer to a decl, not the value of the decl. + /// Represents a pointer to a Decl. + /// When machine codegen backend sees this, it must set the Decl's `alive` field to true. decl_ref, + /// Pointer to a Decl, but allows comptime code to mutate the Decl's Value. + /// This Tag will never be seen by machine codegen backends. It is changed into a + /// `decl_ref` when a comptime variable goes out of scope. + decl_ref_mut, elem_ptr, field_ptr, /// A slice of u8 whose memory is managed externally. @@ -112,6 +117,10 @@ pub const Value = extern union { /// This value is repeated some number of times. The amount of times to repeat /// is stored externally. repeated, + /// Each element stored as a `Value`. + array, + /// Pointer and length as sub `Value` objects. + slice, float_16, float_32, float_64, @@ -120,7 +129,15 @@ pub const Value = extern union { /// A specific enum tag, indicated by the field index (declaration order). enum_field_index, @"error", - error_union, + /// When the type is error union: + /// * If the tag is `.@"error"`, the error union is an error. + /// * If the tag is `.eu_payload`, the error union is a payload. + /// * A nested error such as `((anyerror!T1)!T2)` in which the the outer error union + /// is non-error, but the inner error union is an error, is represented as + /// a tag of `.eu_payload`, with a sub-tag of `.@"error"`. + eu_payload, + /// A pointer to the payload of an error union, based on a pointer to an error union. + eu_payload_ptr, /// An instance of a struct. @"struct", /// An instance of a union. @@ -128,12 +145,16 @@ pub const Value = extern union { /// This is a special value that tracks a set of types that have been stored /// to an inferred allocation. It does not support any of the normal value queries. inferred_alloc, + /// Used to coordinate alloc_inferred, store_to_inferred_ptr, and resolve_inferred_alloc + /// instructions for comptime code. + inferred_alloc_comptime, pub const last_no_payload_tag = Tag.empty_array; pub const no_payload_count = @enumToInt(last_no_payload_tag) + 1; pub fn Type(comptime t: Tag) type { return switch (t) { + .u1_type, .u8_type, .i8_type, .u16_type, @@ -176,6 +197,8 @@ pub const Value = extern union { .single_const_pointer_to_comptime_int_type, .anyframe_type, .const_slice_u8_type, + .anyerror_void_error_union_type, + .generic_poison_type, .enum_literal_type, .undef, .zero, @@ -198,6 +221,7 @@ pub const Value = extern union { .call_options_type, .export_options_type, .extern_options_type, + .generic_poison, => @compileError("Value Tag " ++ @tagName(t) ++ " has no payload"), .int_big_positive, @@ -206,17 +230,21 @@ pub const Value = extern union { .extern_fn, .decl_ref, + .inferred_alloc_comptime, => Payload.Decl, - .ref_val, .repeated, - .error_union, + .eu_payload, + .eu_payload_ptr, => Payload.SubValue, .bytes, .enum_literal, => Payload.Bytes, + .array => Payload.Array, + .slice => Payload.Slice, + .enum_field_index => Payload.U32, .ty => Payload.Ty, @@ -225,7 +253,7 @@ pub const Value = extern union { .int_i64 => Payload.I64, .function => Payload.Function, .variable => Payload.Variable, - .comptime_alloc => Payload.ComptimeAlloc, + .decl_ref_mut => Payload.DeclRefMut, .elem_ptr => Payload.ElemPtr, .field_ptr => Payload.FieldPtr, .float_16 => Payload.Float_16, @@ -307,6 +335,7 @@ pub const Value = extern union { if (self.tag_if_small_enough < Tag.no_payload_count) { return Value{ .tag_if_small_enough = self.tag_if_small_enough }; } else switch (self.ptr_otherwise.tag) { + .u1_type, .u8_type, .i8_type, .u16_type, @@ -349,6 +378,8 @@ pub const Value = extern union { .single_const_pointer_to_comptime_int_type, .anyframe_type, .const_slice_u8_type, + .anyerror_void_error_union_type, + .generic_poison_type, .enum_literal_type, .undef, .zero, @@ -371,6 +402,7 @@ pub const Value = extern union { .call_options_type, .export_options_type, .extern_options_type, + .generic_poison, => unreachable, .ty => { @@ -397,17 +429,8 @@ pub const Value = extern union { .function => return self.copyPayloadShallow(allocator, Payload.Function), .extern_fn => return self.copyPayloadShallow(allocator, Payload.Decl), .variable => return self.copyPayloadShallow(allocator, Payload.Variable), - .ref_val => { - const payload = self.castTag(.ref_val).?; - const new_payload = try allocator.create(Payload.SubValue); - new_payload.* = .{ - .base = payload.base, - .data = try payload.data.copy(allocator), - }; - return Value{ .ptr_otherwise = &new_payload.base }; - }, - .comptime_alloc => return self.copyPayloadShallow(allocator, Payload.ComptimeAlloc), .decl_ref => return self.copyPayloadShallow(allocator, Payload.Decl), + .decl_ref_mut => return self.copyPayloadShallow(allocator, Payload.DeclRefMut), .elem_ptr => { const payload = self.castTag(.elem_ptr).?; const new_payload = try allocator.create(Payload.ElemPtr); @@ -433,8 +456,8 @@ pub const Value = extern union { return Value{ .ptr_otherwise = &new_payload.base }; }, .bytes => return self.copyPayloadShallow(allocator, Payload.Bytes), - .repeated => { - const payload = self.castTag(.repeated).?; + .repeated, .eu_payload, .eu_payload_ptr => { + const payload = self.cast(Payload.SubValue).?; const new_payload = try allocator.create(Payload.SubValue); new_payload.* = .{ .base = payload.base, @@ -442,6 +465,28 @@ pub const Value = extern union { }; return Value{ .ptr_otherwise = &new_payload.base }; }, + .array => { + const payload = self.castTag(.array).?; + const new_payload = try allocator.create(Payload.Array); + new_payload.* = .{ + .base = payload.base, + .data = try allocator.alloc(Value, payload.data.len), + }; + std.mem.copy(Value, new_payload.data, payload.data); + return Value{ .ptr_otherwise = &new_payload.base }; + }, + .slice => { + const payload = self.castTag(.slice).?; + const new_payload = try allocator.create(Payload.Slice); + new_payload.* = .{ + .base = payload.base, + .data = .{ + .ptr = try payload.data.ptr.copy(allocator), + .len = try payload.data.len.copy(allocator), + }, + }; + return Value{ .ptr_otherwise = &new_payload.base }; + }, .float_16 => return self.copyPayloadShallow(allocator, Payload.Float_16), .float_32 => return self.copyPayloadShallow(allocator, Payload.Float_32), .float_64 => return self.copyPayloadShallow(allocator, Payload.Float_64), @@ -457,19 +502,11 @@ pub const Value = extern union { }, .enum_field_index => return self.copyPayloadShallow(allocator, Payload.U32), .@"error" => return self.copyPayloadShallow(allocator, Payload.Error), - .error_union => { - const payload = self.castTag(.error_union).?; - const new_payload = try allocator.create(Payload.SubValue); - new_payload.* = .{ - .base = payload.base, - .data = try payload.data.copy(allocator), - }; - return Value{ .ptr_otherwise = &new_payload.base }; - }, .@"struct" => @panic("TODO can't copy struct value without knowing the type"), .@"union" => @panic("TODO can't copy union value without knowing the type"), .inferred_alloc => unreachable, + .inferred_alloc_comptime => unreachable, } } @@ -491,6 +528,7 @@ pub const Value = extern union { comptime assert(fmt.len == 0); var val = start_val; while (true) switch (val.tag()) { + .u1_type => return out_stream.writeAll("u1"), .u8_type => return out_stream.writeAll("u8"), .i8_type => return out_stream.writeAll("i8"), .u16_type => return out_stream.writeAll("u16"), @@ -533,6 +571,9 @@ pub const Value = extern union { .single_const_pointer_to_comptime_int_type => return out_stream.writeAll("*const comptime_int"), .anyframe_type => return out_stream.writeAll("anyframe"), .const_slice_u8_type => return out_stream.writeAll("[]const u8"), + .anyerror_void_error_union_type => return out_stream.writeAll("anyerror!void"), + .generic_poison_type => return out_stream.writeAll("(generic poison type)"), + .generic_poison => return out_stream.writeAll("(generic poison)"), .enum_literal_type => return out_stream.writeAll("@Type(.EnumLiteral)"), .manyptr_u8_type => return out_stream.writeAll("[*]u8"), .manyptr_const_u8_type => return out_stream.writeAll("[*]const u8"), @@ -576,15 +617,9 @@ pub const Value = extern union { .function => return out_stream.print("(function '{s}')", .{val.castTag(.function).?.data.owner_decl.name}), .extern_fn => return out_stream.writeAll("(extern function)"), .variable => return out_stream.writeAll("(variable)"), - .ref_val => { - const ref_val = val.castTag(.ref_val).?.data; - try out_stream.writeAll("&const "); - val = ref_val; - }, - .comptime_alloc => { - const ref_val = val.castTag(.comptime_alloc).?.data.val; - try out_stream.writeAll("&"); - val = ref_val; + .decl_ref_mut => { + const decl = val.castTag(.decl_ref_mut).?.data.decl; + return out_stream.print("(decl_ref_mut '{s}')", .{decl.name}); }, .decl_ref => return out_stream.writeAll("(decl ref)"), .elem_ptr => { @@ -605,14 +640,24 @@ pub const Value = extern union { try out_stream.writeAll("(repeated) "); val = val.castTag(.repeated).?.data; }, + .array => return out_stream.writeAll("(array)"), + .slice => return out_stream.writeAll("(slice)"), .float_16 => return out_stream.print("{}", .{val.castTag(.float_16).?.data}), .float_32 => return out_stream.print("{}", .{val.castTag(.float_32).?.data}), .float_64 => return out_stream.print("{}", .{val.castTag(.float_64).?.data}), .float_128 => return out_stream.print("{}", .{val.castTag(.float_128).?.data}), .@"error" => return out_stream.print("error.{s}", .{val.castTag(.@"error").?.data.name}), // TODO to print this it should be error{ Set, Items }!T(val), but we need the type for that - .error_union => return out_stream.print("error_union_val({})", .{val.castTag(.error_union).?.data}), + .eu_payload => { + try out_stream.writeAll("(eu_payload) "); + val = val.castTag(.eu_payload).?.data; + }, .inferred_alloc => return out_stream.writeAll("(inferred allocation value)"), + .inferred_alloc_comptime => return out_stream.writeAll("(inferred comptime allocation value)"), + .eu_payload_ptr => { + try out_stream.writeAll("(eu_payload_ptr)"); + val = val.castTag(.eu_payload_ptr).?.data; + }, }; } @@ -636,10 +681,13 @@ pub const Value = extern union { unreachable; } + pub const ToTypeBuffer = Type.Payload.Bits; + /// Asserts that the value is representable as a type. - pub fn toType(self: Value, allocator: *Allocator) !Type { + pub fn toType(self: Value, buffer: *ToTypeBuffer) Type { return switch (self.tag()) { .ty => self.castTag(.ty).?.data, + .u1_type => Type.initTag(.u1), .u8_type => Type.initTag(.u8), .i8_type => Type.initTag(.i8), .u16_type => Type.initTag(.u16), @@ -682,6 +730,8 @@ pub const Value = extern union { .single_const_pointer_to_comptime_int_type => Type.initTag(.single_const_pointer_to_comptime_int), .anyframe_type => Type.initTag(.@"anyframe"), .const_slice_u8_type => Type.initTag(.const_slice_u8), + .anyerror_void_error_union_type => Type.initTag(.anyerror_void_error_union), + .generic_poison_type => Type.initTag(.generic_poison), .enum_literal_type => Type.initTag(.enum_literal), .manyptr_u8_type => Type.initTag(.manyptr_u8), .manyptr_const_u8_type => Type.initTag(.manyptr_const_u8), @@ -696,64 +746,29 @@ pub const Value = extern union { .int_type => { const payload = self.castTag(.int_type).?.data; - const new = try allocator.create(Type.Payload.Bits); - new.* = .{ + buffer.* = .{ .base = .{ .tag = if (payload.signed) .int_signed else .int_unsigned, }, .data = payload.bits, }; - return Type.initPayload(&new.base); + return Type.initPayload(&buffer.base); }, - .undef, - .zero, - .one, - .void_value, - .unreachable_value, - .empty_array, - .bool_true, - .bool_false, - .null_value, - .int_u64, - .int_i64, - .int_big_positive, - .int_big_negative, - .function, - .extern_fn, - .variable, - .ref_val, - .comptime_alloc, - .decl_ref, - .elem_ptr, - .field_ptr, - .bytes, - .repeated, - .float_16, - .float_32, - .float_64, - .float_128, - .enum_literal, - .enum_field_index, - .@"error", - .error_union, - .empty_struct_value, - .@"struct", - .@"union", - .inferred_alloc, - .abi_align_default, - => unreachable, + else => unreachable, }; } /// Asserts the type is an enum type. - pub fn toEnum(val: Value, enum_ty: Type, comptime E: type) E { - _ = enum_ty; - // TODO this needs to resolve other kinds of Value tags rather than - // assuming the tag will be .enum_field_index. - const field_index = val.castTag(.enum_field_index).?.data; - // TODO should `@intToEnum` do this `@intCast` for you? - return @intToEnum(E, @intCast(@typeInfo(E).Enum.tag_type, field_index)); + pub fn toEnum(val: Value, comptime E: type) E { + switch (val.tag()) { + .enum_field_index => { + const field_index = val.castTag(.enum_field_index).?.data; + // TODO should `@intToEnum` do this `@intCast` for you? + return @intToEnum(E, @intCast(@typeInfo(E).Enum.tag_type, field_index)); + }, + else => unreachable, + } } /// Asserts the value is an integer. @@ -936,9 +951,8 @@ pub const Value = extern union { /// Converts an integer or a float to a float. /// Returns `error.Overflow` if the value does not fit in the new type. - pub fn floatCast(self: Value, allocator: *Allocator, ty: Type, target: Target) !Value { - _ = target; - switch (ty.tag()) { + pub fn floatCast(self: Value, allocator: *Allocator, dest_ty: Type) !Value { + switch (dest_ty.tag()) { .f16 => { @panic("TODO add __trunctfhf2 to compiler-rt"); //const res = try Value.Tag.float_16.create(allocator, self.toFloat(f16)); @@ -948,13 +962,13 @@ pub const Value = extern union { }, .f32 => { const res = try Value.Tag.float_32.create(allocator, self.toFloat(f32)); - if (!self.eql(res)) + if (!self.eql(res, dest_ty)) return error.Overflow; return res; }, .f64 => { const res = try Value.Tag.float_64.create(allocator, self.toFloat(f64)); - if (!self.eql(res)) + if (!self.eql(res, dest_ty)) return error.Overflow; return res; }, @@ -1061,12 +1075,18 @@ pub const Value = extern union { return lhs_bigint.order(rhs_bigint); } - /// Asserts the value is comparable. - pub fn compare(lhs: Value, op: std.math.CompareOperator, rhs: Value) bool { + /// Asserts the value is comparable. Does not take a type parameter because it supports + /// comparisons between heterogeneous types. + pub fn compareHetero(lhs: Value, op: std.math.CompareOperator, rhs: Value) bool { + return order(lhs, rhs).compare(op); + } + + /// Asserts the value is comparable. Both operands have type `ty`. + pub fn compare(lhs: Value, op: std.math.CompareOperator, rhs: Value, ty: Type) bool { return switch (op) { - .eq => lhs.eql(rhs), - .neq => !lhs.eql(rhs), - else => order(lhs, rhs).compare(op), + .eq => lhs.eql(rhs, ty), + .neq => !lhs.eql(rhs, ty), + else => compareHetero(lhs, op, rhs), }; } @@ -1075,9 +1095,11 @@ pub const Value = extern union { return orderAgainstZero(lhs).compare(op); } - pub fn eql(a: Value, b: Value) bool { + pub fn eql(a: Value, b: Value, ty: Type) bool { const a_tag = a.tag(); const b_tag = b.tag(); + assert(a_tag != .undef); + assert(b_tag != .undef); if (a_tag == b_tag) { switch (a_tag) { .void_value, .null_value => return true, @@ -1094,253 +1116,170 @@ pub const Value = extern union { else => {}, } } - if (a.isType() and b.isType()) { - // 128 bytes should be enough to hold both types - var buf: [128]u8 = undefined; - var fib = std.heap.FixedBufferAllocator.init(&buf); - const a_type = a.toType(&fib.allocator) catch unreachable; - const b_type = b.toType(&fib.allocator) catch unreachable; + if (ty.zigTypeTag() == .Type) { + var buf_a: ToTypeBuffer = undefined; + var buf_b: ToTypeBuffer = undefined; + const a_type = a.toType(&buf_a); + const b_type = b.toType(&buf_b); return a_type.eql(b_type); } return order(a, b).compare(.eq); } - pub fn hash_u32(self: Value) u32 { - return @truncate(u32, self.hash()); - } + pub fn hash(val: Value, ty: Type, hasher: *std.hash.Wyhash) void { + switch (ty.zigTypeTag()) { + .BoundFn => unreachable, // TODO remove this from the language - pub fn hash(self: Value) u64 { - var hasher = std.hash.Wyhash.init(0); - - switch (self.tag()) { - .u8_type, - .i8_type, - .u16_type, - .i16_type, - .u32_type, - .i32_type, - .u64_type, - .i64_type, - .u128_type, - .i128_type, - .usize_type, - .isize_type, - .c_short_type, - .c_ushort_type, - .c_int_type, - .c_uint_type, - .c_long_type, - .c_ulong_type, - .c_longlong_type, - .c_ulonglong_type, - .c_longdouble_type, - .f16_type, - .f32_type, - .f64_type, - .f128_type, - .c_void_type, - .bool_type, - .void_type, - .type_type, - .anyerror_type, - .comptime_int_type, - .comptime_float_type, - .noreturn_type, - .null_type, - .undefined_type, - .fn_noreturn_no_args_type, - .fn_void_no_args_type, - .fn_naked_noreturn_no_args_type, - .fn_ccc_void_no_args_type, - .single_const_pointer_to_comptime_int_type, - .anyframe_type, - .const_slice_u8_type, - .enum_literal_type, - .ty, - .abi_align_default, - => { - // Directly return Type.hash, toType can only fail for .int_type. - var allocator = std.heap.FixedBufferAllocator.init(&[_]u8{}); - return (self.toType(&allocator.allocator) catch unreachable).hash(); - }, - .int_type => { - const payload = self.castTag(.int_type).?.data; - var int_payload = Type.Payload.Bits{ - .base = .{ - .tag = if (payload.signed) .int_signed else .int_unsigned, - }, - .data = payload.bits, - }; - return Type.initPayload(&int_payload.base).hash(); - }, - - .empty_struct_value, - .empty_array, + .Void, + .NoReturn, + .Undefined, + .Null, => {}, - .undef, - .null_value, - .void_value, - .unreachable_value, - => std.hash.autoHash(&hasher, self.tag()), - - .zero, .bool_false => std.hash.autoHash(&hasher, @as(u64, 0)), - .one, .bool_true => std.hash.autoHash(&hasher, @as(u64, 1)), - - .float_16, .float_32, .float_64, .float_128 => { - @panic("TODO implement Value.hash for floats"); + .Type => { + var buf: ToTypeBuffer = undefined; + return val.toType(&buf).hashWithHasher(hasher); }, - - .enum_literal => { - const payload = self.castTag(.enum_literal).?; - hasher.update(payload.data); + .Bool => { + std.hash.autoHash(hasher, val.toBool()); }, - .enum_field_index => { - const payload = self.castTag(.enum_field_index).?; - std.hash.autoHash(&hasher, payload.data); - }, - .bytes => { - const payload = self.castTag(.bytes).?; - hasher.update(payload.data); - }, - .int_u64 => { - const payload = self.castTag(.int_u64).?; - std.hash.autoHash(&hasher, payload.data); - }, - .int_i64 => { - const payload = self.castTag(.int_i64).?; - std.hash.autoHash(&hasher, payload.data); - }, - .repeated => { - const payload = self.castTag(.repeated).?; - std.hash.autoHash(&hasher, payload.data.hash()); - }, - .ref_val => { - const payload = self.castTag(.ref_val).?; - std.hash.autoHash(&hasher, payload.data.hash()); - }, - .comptime_alloc => { - const payload = self.castTag(.comptime_alloc).?; - std.hash.autoHash(&hasher, payload.data.val.hash()); - }, - .int_big_positive, .int_big_negative => { + .Int, .ComptimeInt => { var space: BigIntSpace = undefined; - const big = self.toBigInt(&space); - if (big.limbs.len == 1) { - // handle like {u,i}64 to ensure same hash as with Int{i,u}64 - if (big.positive) { - std.hash.autoHash(&hasher, @as(u64, big.limbs[0])); - } else { - std.hash.autoHash(&hasher, @as(u64, @bitCast(usize, -@bitCast(isize, big.limbs[0])))); - } - } else { - std.hash.autoHash(&hasher, big.positive); - for (big.limbs) |limb| { - std.hash.autoHash(&hasher, limb); - } + const big = val.toBigInt(&space); + std.hash.autoHash(hasher, big.positive); + for (big.limbs) |limb| { + std.hash.autoHash(hasher, limb); } }, - .elem_ptr => { - const payload = self.castTag(.elem_ptr).?.data; - std.hash.autoHash(&hasher, payload.array_ptr.hash()); - std.hash.autoHash(&hasher, payload.index); + .Float, .ComptimeFloat => { + @panic("TODO implement hashing float values"); }, - .field_ptr => { - const payload = self.castTag(.field_ptr).?.data; - std.hash.autoHash(&hasher, payload.container_ptr.hash()); - std.hash.autoHash(&hasher, payload.field_index); + .Pointer => { + @panic("TODO implement hashing pointer values"); }, - .decl_ref => { - const decl = self.castTag(.decl_ref).?.data; - std.hash.autoHash(&hasher, decl); + .Array, .Vector => { + @panic("TODO implement hashing array/vector values"); }, - .function => { - const func = self.castTag(.function).?.data; - std.hash.autoHash(&hasher, func); + .Struct => { + @panic("TODO implement hashing struct values"); }, - .extern_fn => { - const decl = self.castTag(.extern_fn).?.data; - std.hash.autoHash(&hasher, decl); + .Optional => { + @panic("TODO implement hashing optional values"); }, - .variable => { - const variable = self.castTag(.variable).?.data; - std.hash.autoHash(&hasher, variable); + .ErrorUnion => { + @panic("TODO implement hashing error union values"); }, - .@"error" => { - const payload = self.castTag(.@"error").?.data; - hasher.update(payload.name); + .ErrorSet => { + @panic("TODO implement hashing error set values"); }, - .error_union => { - const payload = self.castTag(.error_union).?.data; - std.hash.autoHash(&hasher, payload.hash()); + .Enum => { + @panic("TODO implement hashing enum values"); + }, + .Union => { + @panic("TODO implement hashing union values"); + }, + .Fn => { + @panic("TODO implement hashing function values"); + }, + .Opaque => { + @panic("TODO implement hashing opaque values"); + }, + .Frame => { + @panic("TODO implement hashing frame values"); + }, + .AnyFrame => { + @panic("TODO implement hashing anyframe values"); + }, + .EnumLiteral => { + @panic("TODO implement hashing enum literal values"); }, - .inferred_alloc => unreachable, - - .manyptr_u8_type, - .manyptr_const_u8_type, - .atomic_ordering_type, - .atomic_rmw_op_type, - .calling_convention_type, - .float_mode_type, - .reduce_op_type, - .call_options_type, - .export_options_type, - .extern_options_type, - .@"struct", - .@"union", - => @panic("TODO this hash function looks pretty broken. audit it"), } - return hasher.final(); } pub const ArrayHashContext = struct { - pub fn hash(self: @This(), v: Value) u32 { - _ = self; - return v.hash_u32(); + ty: Type, + + pub fn hash(self: @This(), val: Value) u32 { + const other_context: HashContext = .{ .ty = self.ty }; + return @truncate(u32, other_context.hash(val)); } pub fn eql(self: @This(), a: Value, b: Value) bool { - _ = self; - return a.eql(b); + return a.eql(b, self.ty); } }; + pub const HashContext = struct { - pub fn hash(self: @This(), v: Value) u64 { - _ = self; - return v.hash(); + ty: Type, + + pub fn hash(self: @This(), val: Value) u64 { + var hasher = std.hash.Wyhash.init(0); + val.hash(self.ty, &hasher); + return hasher.final(); } + pub fn eql(self: @This(), a: Value, b: Value) bool { - _ = self; - return a.eql(b); + return a.eql(b, self.ty); } }; /// Asserts the value is a pointer and dereferences it. /// Returns error.AnalysisFail if the pointer points to a Decl that failed semantic analysis. - pub fn pointerDeref(self: Value, allocator: *Allocator) error{ AnalysisFail, OutOfMemory }!Value { - return switch (self.tag()) { - .comptime_alloc => self.castTag(.comptime_alloc).?.data.val, - .ref_val => self.castTag(.ref_val).?.data, - .decl_ref => self.castTag(.decl_ref).?.data.value(), - .elem_ptr => { + pub fn pointerDeref( + self: Value, + allocator: *Allocator, + ) error{ AnalysisFail, OutOfMemory }!?Value { + const sub_val: Value = switch (self.tag()) { + .decl_ref_mut => val: { + // The decl whose value we are obtaining here may be overwritten with + // a different value, which would invalidate this memory. So we must + // copy here. + const val = try self.castTag(.decl_ref_mut).?.data.decl.value(); + break :val try val.copy(allocator); + }, + .decl_ref => try self.castTag(.decl_ref).?.data.value(), + .elem_ptr => blk: { const elem_ptr = self.castTag(.elem_ptr).?.data; - const array_val = try elem_ptr.array_ptr.pointerDeref(allocator); - return array_val.elemValue(allocator, elem_ptr.index); + const array_val = (try elem_ptr.array_ptr.pointerDeref(allocator)) orelse return null; + break :blk try array_val.elemValue(allocator, elem_ptr.index); }, - .field_ptr => { + .field_ptr => blk: { const field_ptr = self.castTag(.field_ptr).?.data; - const container_val = try field_ptr.container_ptr.pointerDeref(allocator); - return container_val.fieldValue(allocator, field_ptr.field_index); + const container_val = (try field_ptr.container_ptr.pointerDeref(allocator)) orelse return null; + break :blk try container_val.fieldValue(allocator, field_ptr.field_index); }, + .eu_payload_ptr => blk: { + const err_union_ptr = self.castTag(.eu_payload_ptr).?.data; + const err_union_val = (try err_union_ptr.pointerDeref(allocator)) orelse return null; + break :blk err_union_val.castTag(.eu_payload).?.data; + }, + + .zero, + .one, + .int_u64, + .int_i64, + .int_big_positive, + .int_big_negative, + .variable, + .extern_fn, + .function, + => return null, else => unreachable, }; + if (sub_val.tag() == .variable) { + // This would be loading a runtime value at compile-time so we return + // the indicator that this pointer dereference requires being done at runtime. + return null; + } + return sub_val; } pub fn sliceLen(val: Value) u64 { return switch (val.tag()) { .empty_array => 0, .bytes => val.castTag(.bytes).?.data.len, - .ref_val => sliceLen(val.castTag(.ref_val).?.data), + .array => val.castTag(.array).?.data.len, + .slice => val.castTag(.slice).?.data.len.toUnsignedInt(), .decl_ref => { const decl = val.castTag(.decl_ref).?.data; if (decl.ty.zigTypeTag() == .Array) { @@ -1364,6 +1303,9 @@ pub const Value = extern union { // No matter the index; all the elements are the same! .repeated => return self.castTag(.repeated).?.data, + .array => return self.castTag(.array).?.data[index], + .slice => return self.castTag(.slice).?.data.ptr.elemValue(allocator, index), + else => unreachable, } } @@ -1410,6 +1352,7 @@ pub const Value = extern union { .undef => unreachable, .unreachable_value => unreachable, .inferred_alloc => unreachable, + .inferred_alloc_comptime => unreachable, .null_value => true, else => false, @@ -1417,28 +1360,40 @@ pub const Value = extern union { } /// Valid for all types. Asserts the value is not undefined and not unreachable. + /// Prefer `errorUnionIsPayload` to find out whether something is an error or not + /// because it works without having to figure out the string. pub fn getError(self: Value) ?[]const u8 { return switch (self.tag()) { - .error_union => { - const data = self.castTag(.error_union).?.data; - return if (data.tag() == .@"error") - data.castTag(.@"error").?.data.name - else - null; - }, .@"error" => self.castTag(.@"error").?.data.name, + .int_u64 => @panic("TODO"), + .int_i64 => @panic("TODO"), + .int_big_positive => @panic("TODO"), + .int_big_negative => @panic("TODO"), + .one => @panic("TODO"), .undef => unreachable, .unreachable_value => unreachable, .inferred_alloc => unreachable, + .inferred_alloc_comptime => unreachable, else => null, }; } + + /// Assumes the type is an error union. Returns true if and only if the value is + /// the error union payload, not an error. + pub fn errorUnionIsPayload(val: Value) bool { + return switch (val.tag()) { + .eu_payload => true, + else => false, + }; + } + /// Valid for all types. Asserts the value is not undefined. pub fn isFloat(self: Value) bool { return switch (self.tag()) { .undef => unreachable, .inferred_alloc => unreachable, + .inferred_alloc_comptime => unreachable, .float_16, .float_32, @@ -1449,105 +1404,242 @@ pub const Value = extern union { }; } - /// Valid for all types. Asserts the value is not undefined. - pub fn isType(self: Value) bool { - return switch (self.tag()) { - .ty, - .int_type, - .u8_type, - .i8_type, - .u16_type, - .i16_type, - .u32_type, - .i32_type, - .u64_type, - .i64_type, - .u128_type, - .i128_type, - .usize_type, - .isize_type, - .c_short_type, - .c_ushort_type, - .c_int_type, - .c_uint_type, - .c_long_type, - .c_ulong_type, - .c_longlong_type, - .c_ulonglong_type, - .c_longdouble_type, - .f16_type, - .f32_type, - .f64_type, - .f128_type, - .c_void_type, - .bool_type, - .void_type, - .type_type, - .anyerror_type, - .comptime_int_type, - .comptime_float_type, - .noreturn_type, - .null_type, - .undefined_type, - .fn_noreturn_no_args_type, - .fn_void_no_args_type, - .fn_naked_noreturn_no_args_type, - .fn_ccc_void_no_args_type, - .single_const_pointer_to_comptime_int_type, - .anyframe_type, - .const_slice_u8_type, - .enum_literal_type, - .manyptr_u8_type, - .manyptr_const_u8_type, - .atomic_ordering_type, - .atomic_rmw_op_type, - .calling_convention_type, - .float_mode_type, - .reduce_op_type, - .call_options_type, - .export_options_type, - .extern_options_type, - => true, + pub fn intAdd(lhs: Value, rhs: Value, allocator: *Allocator) !Value { + // TODO is this a performance issue? maybe we should try the operation without + // resorting to BigInt first. + var lhs_space: Value.BigIntSpace = undefined; + var rhs_space: Value.BigIntSpace = undefined; + const lhs_bigint = lhs.toBigInt(&lhs_space); + const rhs_bigint = rhs.toBigInt(&rhs_space); + const limbs = try allocator.alloc( + std.math.big.Limb, + std.math.max(lhs_bigint.limbs.len, rhs_bigint.limbs.len) + 1, + ); + var result_bigint = BigIntMutable{ .limbs = limbs, .positive = undefined, .len = undefined }; + result_bigint.add(lhs_bigint, rhs_bigint); + const result_limbs = result_bigint.limbs[0..result_bigint.len]; - .zero, - .one, - .empty_array, - .bool_true, - .bool_false, - .function, - .extern_fn, - .variable, - .int_u64, - .int_i64, - .int_big_positive, - .int_big_negative, - .ref_val, - .comptime_alloc, - .decl_ref, - .elem_ptr, - .field_ptr, - .bytes, - .repeated, - .float_16, - .float_32, - .float_64, - .float_128, - .void_value, - .enum_literal, - .enum_field_index, - .@"error", - .error_union, - .empty_struct_value, - .@"struct", - .@"union", - .null_value, - .abi_align_default, - => false, + if (result_bigint.positive) { + return Value.Tag.int_big_positive.create(allocator, result_limbs); + } else { + return Value.Tag.int_big_negative.create(allocator, result_limbs); + } + } - .undef => unreachable, - .unreachable_value => unreachable, - .inferred_alloc => unreachable, - }; + pub fn intSub(lhs: Value, rhs: Value, allocator: *Allocator) !Value { + // TODO is this a performance issue? maybe we should try the operation without + // resorting to BigInt first. + var lhs_space: Value.BigIntSpace = undefined; + var rhs_space: Value.BigIntSpace = undefined; + const lhs_bigint = lhs.toBigInt(&lhs_space); + const rhs_bigint = rhs.toBigInt(&rhs_space); + const limbs = try allocator.alloc( + std.math.big.Limb, + std.math.max(lhs_bigint.limbs.len, rhs_bigint.limbs.len) + 1, + ); + var result_bigint = BigIntMutable{ .limbs = limbs, .positive = undefined, .len = undefined }; + result_bigint.sub(lhs_bigint, rhs_bigint); + const result_limbs = result_bigint.limbs[0..result_bigint.len]; + + if (result_bigint.positive) { + return Value.Tag.int_big_positive.create(allocator, result_limbs); + } else { + return Value.Tag.int_big_negative.create(allocator, result_limbs); + } + } + + pub fn intDiv(lhs: Value, rhs: Value, allocator: *Allocator) !Value { + // TODO is this a performance issue? maybe we should try the operation without + // resorting to BigInt first. + var lhs_space: Value.BigIntSpace = undefined; + var rhs_space: Value.BigIntSpace = undefined; + const lhs_bigint = lhs.toBigInt(&lhs_space); + const rhs_bigint = rhs.toBigInt(&rhs_space); + const limbs_q = try allocator.alloc( + std.math.big.Limb, + lhs_bigint.limbs.len + rhs_bigint.limbs.len + 1, + ); + const limbs_r = try allocator.alloc( + std.math.big.Limb, + lhs_bigint.limbs.len, + ); + const limbs_buffer = try allocator.alloc( + std.math.big.Limb, + std.math.big.int.calcDivLimbsBufferLen(lhs_bigint.limbs.len, rhs_bigint.limbs.len), + ); + var result_q = BigIntMutable{ .limbs = limbs_q, .positive = undefined, .len = undefined }; + var result_r = BigIntMutable{ .limbs = limbs_r, .positive = undefined, .len = undefined }; + result_q.divTrunc(&result_r, lhs_bigint, rhs_bigint, limbs_buffer, null); + const result_limbs = result_q.limbs[0..result_q.len]; + + if (result_q.positive) { + return Value.Tag.int_big_positive.create(allocator, result_limbs); + } else { + return Value.Tag.int_big_negative.create(allocator, result_limbs); + } + } + + pub fn intMul(lhs: Value, rhs: Value, allocator: *Allocator) !Value { + // TODO is this a performance issue? maybe we should try the operation without + // resorting to BigInt first. + var lhs_space: Value.BigIntSpace = undefined; + var rhs_space: Value.BigIntSpace = undefined; + const lhs_bigint = lhs.toBigInt(&lhs_space); + const rhs_bigint = rhs.toBigInt(&rhs_space); + const limbs = try allocator.alloc( + std.math.big.Limb, + lhs_bigint.limbs.len + rhs_bigint.limbs.len + 1, + ); + var result_bigint = BigIntMutable{ .limbs = limbs, .positive = undefined, .len = undefined }; + var limbs_buffer = try allocator.alloc( + std.math.big.Limb, + std.math.big.int.calcMulLimbsBufferLen(lhs_bigint.limbs.len, rhs_bigint.limbs.len, 1), + ); + defer allocator.free(limbs_buffer); + result_bigint.mul(lhs_bigint, rhs_bigint, limbs_buffer, allocator); + const result_limbs = result_bigint.limbs[0..result_bigint.len]; + + if (result_bigint.positive) { + return Value.Tag.int_big_positive.create(allocator, result_limbs); + } else { + return Value.Tag.int_big_negative.create(allocator, result_limbs); + } + } + + pub fn intTrunc(val: Value, arena: *Allocator, bits: u16) !Value { + const x = val.toUnsignedInt(); // TODO: implement comptime truncate on big ints + if (bits == 64) return val; + const mask = (@as(u64, 1) << @intCast(u6, bits)) - 1; + const truncated = x & mask; + return Tag.int_u64.create(arena, truncated); + } + + pub fn floatAdd( + lhs: Value, + rhs: Value, + float_type: Type, + arena: *Allocator, + ) !Value { + switch (float_type.tag()) { + .f16 => { + @panic("TODO add __trunctfhf2 to compiler-rt"); + //const lhs_val = lhs.toFloat(f16); + //const rhs_val = rhs.toFloat(f16); + //return Value.Tag.float_16.create(arena, lhs_val + rhs_val); + }, + .f32 => { + const lhs_val = lhs.toFloat(f32); + const rhs_val = rhs.toFloat(f32); + return Value.Tag.float_32.create(arena, lhs_val + rhs_val); + }, + .f64 => { + const lhs_val = lhs.toFloat(f64); + const rhs_val = rhs.toFloat(f64); + return Value.Tag.float_64.create(arena, lhs_val + rhs_val); + }, + .f128, .comptime_float, .c_longdouble => { + const lhs_val = lhs.toFloat(f128); + const rhs_val = rhs.toFloat(f128); + return Value.Tag.float_128.create(arena, lhs_val + rhs_val); + }, + else => unreachable, + } + } + + pub fn floatSub( + lhs: Value, + rhs: Value, + float_type: Type, + arena: *Allocator, + ) !Value { + switch (float_type.tag()) { + .f16 => { + @panic("TODO add __trunctfhf2 to compiler-rt"); + //const lhs_val = lhs.toFloat(f16); + //const rhs_val = rhs.toFloat(f16); + //return Value.Tag.float_16.create(arena, lhs_val - rhs_val); + }, + .f32 => { + const lhs_val = lhs.toFloat(f32); + const rhs_val = rhs.toFloat(f32); + return Value.Tag.float_32.create(arena, lhs_val - rhs_val); + }, + .f64 => { + const lhs_val = lhs.toFloat(f64); + const rhs_val = rhs.toFloat(f64); + return Value.Tag.float_64.create(arena, lhs_val - rhs_val); + }, + .f128, .comptime_float, .c_longdouble => { + const lhs_val = lhs.toFloat(f128); + const rhs_val = rhs.toFloat(f128); + return Value.Tag.float_128.create(arena, lhs_val - rhs_val); + }, + else => unreachable, + } + } + + pub fn floatDiv( + lhs: Value, + rhs: Value, + float_type: Type, + arena: *Allocator, + ) !Value { + switch (float_type.tag()) { + .f16 => { + @panic("TODO add __trunctfhf2 to compiler-rt"); + //const lhs_val = lhs.toFloat(f16); + //const rhs_val = rhs.toFloat(f16); + //return Value.Tag.float_16.create(arena, lhs_val / rhs_val); + }, + .f32 => { + const lhs_val = lhs.toFloat(f32); + const rhs_val = rhs.toFloat(f32); + return Value.Tag.float_32.create(arena, lhs_val / rhs_val); + }, + .f64 => { + const lhs_val = lhs.toFloat(f64); + const rhs_val = rhs.toFloat(f64); + return Value.Tag.float_64.create(arena, lhs_val / rhs_val); + }, + .f128, .comptime_float, .c_longdouble => { + const lhs_val = lhs.toFloat(f128); + const rhs_val = rhs.toFloat(f128); + return Value.Tag.float_128.create(arena, lhs_val / rhs_val); + }, + else => unreachable, + } + } + + pub fn floatMul( + lhs: Value, + rhs: Value, + float_type: Type, + arena: *Allocator, + ) !Value { + switch (float_type.tag()) { + .f16 => { + @panic("TODO add __trunctfhf2 to compiler-rt"); + //const lhs_val = lhs.toFloat(f16); + //const rhs_val = rhs.toFloat(f16); + //return Value.Tag.float_16.create(arena, lhs_val * rhs_val); + }, + .f32 => { + const lhs_val = lhs.toFloat(f32); + const rhs_val = rhs.toFloat(f32); + return Value.Tag.float_32.create(arena, lhs_val * rhs_val); + }, + .f64 => { + const lhs_val = lhs.toFloat(f64); + const rhs_val = rhs.toFloat(f64); + return Value.Tag.float_64.create(arena, lhs_val * rhs_val); + }, + .f128, .comptime_float, .c_longdouble => { + const lhs_val = lhs.toFloat(f128); + const rhs_val = rhs.toFloat(f128); + return Value.Tag.float_128.create(arena, lhs_val * rhs_val); + }, + else => unreachable, + } } /// This type is not copyable since it may contain pointers to its inner data. @@ -1603,12 +1695,12 @@ pub const Value = extern union { data: Value, }; - pub const ComptimeAlloc = struct { - pub const base_tag = Tag.comptime_alloc; + pub const DeclRefMut = struct { + pub const base_tag = Tag.decl_ref_mut; base: Payload = Payload{ .tag = base_tag }, data: struct { - val: Value, + decl: *Module.Decl, runtime_index: u32, }, }; @@ -1638,6 +1730,19 @@ pub const Value = extern union { data: []const u8, }; + pub const Array = struct { + base: Payload, + data: []Value, + }; + + pub const Slice = struct { + base: Payload, + data: struct { + ptr: Value, + len: Value, + }, + }; + pub const Ty = struct { base: Payload, data: Type, @@ -1730,27 +1835,3 @@ pub const Value = extern union { limbs: [(@sizeOf(u64) / @sizeOf(std.math.big.Limb)) + 1]std.math.big.Limb, }; }; - -test "hash same value different representation" { - const zero_1 = Value.initTag(.zero); - var payload_1 = Value.Payload.U64{ - .base = .{ .tag = .int_u64 }, - .data = 0, - }; - const zero_2 = Value.initPayload(&payload_1.base); - try std.testing.expectEqual(zero_1.hash(), zero_2.hash()); - - var payload_2 = Value.Payload.I64{ - .base = .{ .tag = .int_i64 }, - .data = 0, - }; - const zero_3 = Value.initPayload(&payload_2.base); - try std.testing.expectEqual(zero_2.hash(), zero_3.hash()); - - var payload_3 = Value.Payload.BigInt{ - .base = .{ .tag = .int_big_negative }, - .data = &[_]std.math.big.Limb{0}, - }; - const zero_4 = Value.initPayload(&payload_3.base); - try std.testing.expectEqual(zero_3.hash(), zero_4.hash()); -} diff --git a/src/zig_clang.cpp b/src/zig_clang.cpp index 7c923021d8..6611585f68 100644 --- a/src/zig_clang.cpp +++ b/src/zig_clang.cpp @@ -2754,7 +2754,7 @@ struct ZigClangSourceLocation ZigClangIntegerLiteral_getBeginLoc(const struct Zi return bitcast(casted->getBeginLoc()); } -bool ZigClangIntegerLiteral_isZero(const struct ZigClangIntegerLiteral *self, bool *result, const struct ZigClangASTContext *ctx) { +bool ZigClangIntegerLiteral_getSignum(const struct ZigClangIntegerLiteral *self, int *result, const struct ZigClangASTContext *ctx) { auto casted_self = reinterpret_cast(self); auto casted_ctx = reinterpret_cast(ctx); clang::Expr::EvalResult eval_result; @@ -2763,7 +2763,17 @@ bool ZigClangIntegerLiteral_isZero(const struct ZigClangIntegerLiteral *self, bo } const llvm::APSInt result_int = eval_result.Val.getInt(); const llvm::APSInt zero(result_int.getBitWidth(), result_int.isUnsigned()); - *result = zero == result_int; + + if (zero == result_int) { + *result = 0; + } else if (result_int < zero) { + *result = -1; + } else if (result_int > zero) { + *result = 1; + } else { + return false; + } + return true; } @@ -2832,6 +2842,11 @@ unsigned ZigClangCharacterLiteral_getValue(const struct ZigClangCharacterLiteral return casted->getValue(); } +const struct ZigClangExpr *ZigClangChooseExpr_getChosenSubExpr(const struct ZigClangChooseExpr *self) { + auto casted = reinterpret_cast(self); + return reinterpret_cast(casted->getChosenSubExpr()); +} + const struct ZigClangExpr *ZigClangAbstractConditionalOperator_getCond(const struct ZigClangAbstractConditionalOperator *self) { auto casted = reinterpret_cast(self); return reinterpret_cast(casted->getCond()); diff --git a/src/zig_clang.h b/src/zig_clang.h index 634534dfb4..0e7a8b2990 100644 --- a/src/zig_clang.h +++ b/src/zig_clang.h @@ -104,6 +104,7 @@ struct ZigClangCStyleCastExpr; struct ZigClangCallExpr; struct ZigClangCaseStmt; struct ZigClangCharacterLiteral; +struct ZigClangChooseExpr; struct ZigClangCompoundAssignOperator; struct ZigClangCompoundStmt; struct ZigClangConditionalOperator; @@ -1221,7 +1222,7 @@ ZIG_EXTERN_C struct ZigClangQualType ZigClangCStyleCastExpr_getType(const struct ZIG_EXTERN_C bool ZigClangIntegerLiteral_EvaluateAsInt(const struct ZigClangIntegerLiteral *, struct ZigClangExprEvalResult *, const struct ZigClangASTContext *); ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangIntegerLiteral_getBeginLoc(const struct ZigClangIntegerLiteral *); -ZIG_EXTERN_C bool ZigClangIntegerLiteral_isZero(const struct ZigClangIntegerLiteral *, bool *, const struct ZigClangASTContext *); +ZIG_EXTERN_C bool ZigClangIntegerLiteral_getSignum(const struct ZigClangIntegerLiteral *, int *, const struct ZigClangASTContext *); ZIG_EXTERN_C const struct ZigClangExpr *ZigClangReturnStmt_getRetValue(const struct ZigClangReturnStmt *); @@ -1242,6 +1243,8 @@ ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangCharacterLiteral_getBeginLoc( ZIG_EXTERN_C enum ZigClangCharacterLiteral_CharacterKind ZigClangCharacterLiteral_getKind(const struct ZigClangCharacterLiteral *); ZIG_EXTERN_C unsigned ZigClangCharacterLiteral_getValue(const struct ZigClangCharacterLiteral *); +ZIG_EXTERN_C const struct ZigClangExpr *ZigClangChooseExpr_getChosenSubExpr(const struct ZigClangChooseExpr *); + ZIG_EXTERN_C const struct ZigClangExpr *ZigClangAbstractConditionalOperator_getCond(const struct ZigClangAbstractConditionalOperator *); ZIG_EXTERN_C const struct ZigClangExpr *ZigClangAbstractConditionalOperator_getTrueExpr(const struct ZigClangAbstractConditionalOperator *); ZIG_EXTERN_C const struct ZigClangExpr *ZigClangAbstractConditionalOperator_getFalseExpr(const struct ZigClangAbstractConditionalOperator *); diff --git a/src/zig_llvm.cpp b/src/zig_llvm.cpp index d5d6f9f670..d0bc24ed1b 100644 --- a/src/zig_llvm.cpp +++ b/src/zig_llvm.cpp @@ -458,6 +458,36 @@ LLVMValueRef ZigLLVMBuildMemSet(LLVMBuilderRef B, LLVMValueRef Ptr, LLVMValueRef return wrap(call_inst); } +LLVMValueRef ZigLLVMBuildMaxNum(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, const char *name) { + CallInst *call_inst = unwrap(B)->CreateMaxNum(unwrap(LHS), unwrap(RHS), name); + return wrap(call_inst); +} + +LLVMValueRef ZigLLVMBuildMinNum(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, const char *name) { + CallInst *call_inst = unwrap(B)->CreateMinNum(unwrap(LHS), unwrap(RHS), name); + return wrap(call_inst); +} + +LLVMValueRef ZigLLVMBuildUMax(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, const char *name) { + CallInst *call_inst = unwrap(B)->CreateBinaryIntrinsic(Intrinsic::umax, unwrap(LHS), unwrap(RHS), nullptr, name); + return wrap(call_inst); +} + +LLVMValueRef ZigLLVMBuildUMin(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, const char *name) { + CallInst *call_inst = unwrap(B)->CreateBinaryIntrinsic(Intrinsic::umin, unwrap(LHS), unwrap(RHS), nullptr, name); + return wrap(call_inst); +} + +LLVMValueRef ZigLLVMBuildSMax(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, const char *name) { + CallInst *call_inst = unwrap(B)->CreateBinaryIntrinsic(Intrinsic::smax, unwrap(LHS), unwrap(RHS), nullptr, name); + return wrap(call_inst); +} + +LLVMValueRef ZigLLVMBuildSMin(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, const char *name) { + CallInst *call_inst = unwrap(B)->CreateBinaryIntrinsic(Intrinsic::smin, unwrap(LHS), unwrap(RHS), nullptr, name); + return wrap(call_inst); +} + void ZigLLVMFnSetSubprogram(LLVMValueRef fn, ZigLLVMDISubprogram *subprogram) { assert( isa(unwrap(fn)) ); Function *unwrapped_function = reinterpret_cast(unwrap(fn)); diff --git a/src/zig_llvm.h b/src/zig_llvm.h index a771491138..f49c2662c6 100644 --- a/src/zig_llvm.h +++ b/src/zig_llvm.h @@ -129,6 +129,14 @@ ZIG_EXTERN_C LLVMValueRef ZigLLVMBuildMemCpy(LLVMBuilderRef B, LLVMValueRef Dst, ZIG_EXTERN_C LLVMValueRef ZigLLVMBuildMemSet(LLVMBuilderRef B, LLVMValueRef Ptr, LLVMValueRef Val, LLVMValueRef Size, unsigned Align, bool isVolatile); +ZIG_EXTERN_C LLVMValueRef ZigLLVMBuildMaxNum(LLVMBuilderRef builder, LLVMValueRef LHS, LLVMValueRef RHS, const char* name); +ZIG_EXTERN_C LLVMValueRef ZigLLVMBuildMinNum(LLVMBuilderRef builder, LLVMValueRef LHS, LLVMValueRef RHS, const char* name); + +ZIG_EXTERN_C LLVMValueRef ZigLLVMBuildUMax(LLVMBuilderRef builder, LLVMValueRef LHS, LLVMValueRef RHS, const char* name); +ZIG_EXTERN_C LLVMValueRef ZigLLVMBuildUMin(LLVMBuilderRef builder, LLVMValueRef LHS, LLVMValueRef RHS, const char* name); +ZIG_EXTERN_C LLVMValueRef ZigLLVMBuildSMax(LLVMBuilderRef builder, LLVMValueRef LHS, LLVMValueRef RHS, const char* name); +ZIG_EXTERN_C LLVMValueRef ZigLLVMBuildSMin(LLVMBuilderRef builder, LLVMValueRef LHS, LLVMValueRef RHS, const char* name); + ZIG_EXTERN_C LLVMValueRef ZigLLVMBuildCmpXchg(LLVMBuilderRef builder, LLVMValueRef ptr, LLVMValueRef cmp, LLVMValueRef new_val, LLVMAtomicOrdering success_ordering, LLVMAtomicOrdering failure_ordering, bool is_weak); @@ -142,6 +150,7 @@ ZIG_EXTERN_C LLVMValueRef ZigLLVMBuildLShrExact(LLVMBuilderRef builder, LLVMValu ZIG_EXTERN_C LLVMValueRef ZigLLVMBuildAShrExact(LLVMBuilderRef builder, LLVMValueRef LHS, LLVMValueRef RHS, const char *name); + ZIG_EXTERN_C struct ZigLLVMDIType *ZigLLVMCreateDebugPointerType(struct ZigLLVMDIBuilder *dibuilder, struct ZigLLVMDIType *pointee_type, uint64_t size_in_bits, uint64_t align_in_bits, const char *name); diff --git a/test/behavior.zig b/test/behavior.zig index 0055638335..a800b38458 100644 --- a/test/behavior.zig +++ b/test/behavior.zig @@ -2,11 +2,14 @@ const builtin = @import("builtin"); test { // Tests that pass for both. - {} + _ = @import("behavior/bool.zig"); + _ = @import("behavior/basic.zig"); + _ = @import("behavior/generics.zig"); + _ = @import("behavior/eval.zig"); + _ = @import("behavior/pointers.zig"); + _ = @import("behavior/if.zig"); - if (builtin.zig_is_stage2) { - // Tests that only pass for stage2. - } else { + if (!builtin.zig_is_stage2) { // Tests that only pass for stage1. _ = @import("behavior/align.zig"); _ = @import("behavior/alignof.zig"); @@ -20,7 +23,6 @@ test { _ = @import("behavior/bit_shifting.zig"); _ = @import("behavior/bitcast.zig"); _ = @import("behavior/bitreverse.zig"); - _ = @import("behavior/bool.zig"); _ = @import("behavior/bugs/1025.zig"); _ = @import("behavior/bugs/1076.zig"); _ = @import("behavior/bugs/1111.zig"); @@ -89,35 +91,37 @@ test { _ = @import("behavior/enum.zig"); _ = @import("behavior/enum_with_members.zig"); _ = @import("behavior/error.zig"); - _ = @import("behavior/eval.zig"); + _ = @import("behavior/eval_stage1.zig"); _ = @import("behavior/field_parent_ptr.zig"); _ = @import("behavior/floatop.zig"); _ = @import("behavior/fn.zig"); _ = @import("behavior/fn_in_struct_in_comptime.zig"); _ = @import("behavior/fn_delegation.zig"); _ = @import("behavior/for.zig"); - _ = @import("behavior/generics.zig"); + _ = @import("behavior/generics_stage1.zig"); _ = @import("behavior/hasdecl.zig"); _ = @import("behavior/hasfield.zig"); - _ = @import("behavior/if.zig"); + _ = @import("behavior/if_stage1.zig"); _ = @import("behavior/import.zig"); _ = @import("behavior/incomplete_struct_param_tld.zig"); _ = @import("behavior/inttoptr.zig"); _ = @import("behavior/ir_block_deps.zig"); _ = @import("behavior/math.zig"); + _ = @import("behavior/maximum_minimum.zig"); _ = @import("behavior/merge_error_sets.zig"); _ = @import("behavior/misc.zig"); _ = @import("behavior/muladd.zig"); _ = @import("behavior/namespace_depends_on_compile_var.zig"); _ = @import("behavior/null.zig"); _ = @import("behavior/optional.zig"); - _ = @import("behavior/pointers.zig"); + _ = @import("behavior/pointers_stage1.zig"); _ = @import("behavior/popcount.zig"); _ = @import("behavior/ptrcast.zig"); _ = @import("behavior/pub_enum.zig"); _ = @import("behavior/ref_var_in_if_after_if_2nd_switch_prong.zig"); _ = @import("behavior/reflection.zig"); _ = @import("behavior/shuffle.zig"); + _ = @import("behavior/select.zig"); _ = @import("behavior/sizeof_and_typeof.zig"); _ = @import("behavior/slice.zig"); _ = @import("behavior/slice_sentinel_comptime.zig"); diff --git a/test/behavior/basic.zig b/test/behavior/basic.zig new file mode 100644 index 0000000000..1372dfaeeb --- /dev/null +++ b/test/behavior/basic.zig @@ -0,0 +1,164 @@ +const std = @import("std"); +const mem = std.mem; +const expect = std.testing.expect; + +// normal comment + +/// this is a documentation comment +/// doc comment line 2 +fn emptyFunctionWithComments() void {} + +test "empty function with comments" { + emptyFunctionWithComments(); +} + +test "truncate" { + try expect(testTruncate(0x10fd) == 0xfd); + comptime try expect(testTruncate(0x10fd) == 0xfd); +} +fn testTruncate(x: u32) u8 { + return @truncate(u8, x); +} + +const g1: i32 = 1233 + 1; +var g2: i32 = 0; + +test "global variables" { + try expect(g2 == 0); + g2 = g1; + try expect(g2 == 1234); +} + +test "comptime keyword on expressions" { + const x: i32 = comptime x: { + break :x 1 + 2 + 3; + }; + try expect(x == comptime 6); +} + +test "type equality" { + try expect(*const u8 != *u8); +} + +test "pointer dereferencing" { + var x = @as(i32, 3); + const y = &x; + + y.* += 1; + + try expect(x == 4); + try expect(y.* == 4); +} + +test "const expression eval handling of variables" { + var x = true; + while (x) { + x = false; + } +} + +test "character literals" { + try expect('\'' == single_quote); +} +const single_quote = '\''; + +test "non const ptr to aliased type" { + const int = i32; + try expect(?*int == ?*i32); +} + +test "cold function" { + thisIsAColdFn(); + comptime thisIsAColdFn(); +} + +fn thisIsAColdFn() void { + @setCold(true); +} + +test "unicode escape in character literal" { + var a: u24 = '\u{01f4a9}'; + try expect(a == 128169); +} + +test "unicode character in character literal" { + try expect('💩' == 128169); +} + +fn first4KeysOfHomeRow() []const u8 { + return "aoeu"; +} + +test "return string from function" { + try expect(mem.eql(u8, first4KeysOfHomeRow(), "aoeu")); +} + +test "hex escape" { + try expect(mem.eql(u8, "\x68\x65\x6c\x6c\x6f", "hello")); +} + +test "multiline string" { + const s1 = + \\one + \\two) + \\three + ; + const s2 = "one\ntwo)\nthree"; + try expect(mem.eql(u8, s1, s2)); +} + +test "multiline string comments at start" { + const s1 = + //\\one + \\two) + \\three + ; + const s2 = "two)\nthree"; + try expect(mem.eql(u8, s1, s2)); +} + +test "multiline string comments at end" { + const s1 = + \\one + \\two) + //\\three + ; + const s2 = "one\ntwo)"; + try expect(mem.eql(u8, s1, s2)); +} + +test "multiline string comments in middle" { + const s1 = + \\one + //\\two) + \\three + ; + const s2 = "one\nthree"; + try expect(mem.eql(u8, s1, s2)); +} + +test "multiline string comments at multiple places" { + const s1 = + \\one + //\\two + \\three + //\\four + \\five + ; + const s2 = "one\nthree\nfive"; + try expect(mem.eql(u8, s1, s2)); +} + +test "call result of if else expression" { + try expect(mem.eql(u8, f2(true), "a")); + try expect(mem.eql(u8, f2(false), "b")); +} +fn f2(x: bool) []const u8 { + return (if (x) fA else fB)(); +} +fn fA() []const u8 { + return "a"; +} +fn fB() []const u8 { + return "b"; +} diff --git a/test/behavior/bool.zig b/test/behavior/bool.zig index dfa02a6bfd..447f9e02e6 100644 --- a/test/behavior/bool.zig +++ b/test/behavior/bool.zig @@ -33,3 +33,47 @@ test "compile time bool not" { try expect(not_global_f); try expect(!not_global_t); } + +test "short circuit" { + try testShortCircuit(false, true); + comptime try testShortCircuit(false, true); +} + +fn testShortCircuit(f: bool, t: bool) !void { + var hit_1 = f; + var hit_2 = f; + var hit_3 = f; + var hit_4 = f; + + if (t or x: { + try expect(f); + break :x f; + }) { + hit_1 = t; + } + if (f or x: { + hit_2 = t; + break :x f; + }) { + try expect(f); + } + + if (t and x: { + hit_3 = t; + break :x f; + }) { + try expect(f); + } + if (f and x: { + try expect(f); + break :x f; + }) { + try expect(f); + } else { + hit_4 = t; + } + try expect(hit_1); + try expect(hit_2); + try expect(hit_3); + try expect(hit_4); +} diff --git a/test/behavior/bugs/6456.zig b/test/behavior/bugs/6456.zig index 8078ab147f..44fdfd69ba 100644 --- a/test/behavior/bugs/6456.zig +++ b/test/behavior/bugs/6456.zig @@ -13,7 +13,7 @@ test "issue 6456" { comptime { var fields: []const StructField = &[0]StructField{}; - var it = std.mem.tokenize(text, "\n"); + var it = std.mem.tokenize(u8, text, "\n"); while (it.next()) |name| { fields = fields ++ &[_]StructField{StructField{ .alignment = 0, diff --git a/test/behavior/eval.zig b/test/behavior/eval.zig index 566ed74e2d..a97aab7bb3 100644 --- a/test/behavior/eval.zig +++ b/test/behavior/eval.zig @@ -63,146 +63,12 @@ fn constExprEvalOnSingleExprBlocksFn(x: i32, b: bool) i32 { return result; } -test "statically initialized list" { - try expect(static_point_list[0].x == 1); - try expect(static_point_list[0].y == 2); - try expect(static_point_list[1].x == 3); - try expect(static_point_list[1].y == 4); -} -const Point = struct { - x: i32, - y: i32, -}; -const static_point_list = [_]Point{ - makePoint(1, 2), - makePoint(3, 4), -}; -fn makePoint(x: i32, y: i32) Point { - return Point{ - .x = x, - .y = y, - }; -} - -test "static eval list init" { - try expect(static_vec3.data[2] == 1.0); - try expect(vec3(0.0, 0.0, 3.0).data[2] == 3.0); -} -const static_vec3 = vec3(0.0, 0.0, 1.0); -pub const Vec3 = struct { - data: [3]f32, -}; -pub fn vec3(x: f32, y: f32, z: f32) Vec3 { - return Vec3{ - .data = [_]f32{ - x, - y, - z, - }, - }; -} - test "constant expressions" { var array: [array_size]u8 = undefined; try expect(@sizeOf(@TypeOf(array)) == 20); } const array_size: u8 = 20; -test "constant struct with negation" { - try expect(vertices[0].x == -0.6); -} -const Vertex = struct { - x: f32, - y: f32, - r: f32, - g: f32, - b: f32, -}; -const vertices = [_]Vertex{ - Vertex{ - .x = -0.6, - .y = -0.4, - .r = 1.0, - .g = 0.0, - .b = 0.0, - }, - Vertex{ - .x = 0.6, - .y = -0.4, - .r = 0.0, - .g = 1.0, - .b = 0.0, - }, - Vertex{ - .x = 0.0, - .y = 0.6, - .r = 0.0, - .g = 0.0, - .b = 1.0, - }, -}; - -test "statically initialized struct" { - st_init_str_foo.x += 1; - try expect(st_init_str_foo.x == 14); -} -const StInitStrFoo = struct { - x: i32, - y: bool, -}; -var st_init_str_foo = StInitStrFoo{ - .x = 13, - .y = true, -}; - -test "statically initalized array literal" { - const y: [4]u8 = st_init_arr_lit_x; - try expect(y[3] == 4); -} -const st_init_arr_lit_x = [_]u8{ - 1, - 2, - 3, - 4, -}; - -test "const slice" { - comptime { - const a = "1234567890"; - try expect(a.len == 10); - const b = a[1..2]; - try expect(b.len == 1); - try expect(b[0] == '2'); - } -} - -test "try to trick eval with runtime if" { - try expect(testTryToTrickEvalWithRuntimeIf(true) == 10); -} - -fn testTryToTrickEvalWithRuntimeIf(b: bool) usize { - comptime var i: usize = 0; - inline while (i < 10) : (i += 1) { - const result = if (b) false else true; - _ = result; - } - comptime { - return i; - } -} - -test "inlined loop has array literal with elided runtime scope on first iteration but not second iteration" { - var runtime = [1]i32{3}; - comptime var i: usize = 0; - inline while (i < 2) : (i += 1) { - const result = if (i == 0) [1]i32{2} else runtime; - _ = result; - } - comptime { - try expect(i == 2); - } -} - fn max(comptime T: type, a: T, b: T) T { if (T == bool) { return a or b; @@ -229,52 +95,6 @@ test "inlined block and runtime block phi" { } } -const CmdFn = struct { - name: []const u8, - func: fn (i32) i32, -}; - -const cmd_fns = [_]CmdFn{ - CmdFn{ - .name = "one", - .func = one, - }, - CmdFn{ - .name = "two", - .func = two, - }, - CmdFn{ - .name = "three", - .func = three, - }, -}; -fn one(value: i32) i32 { - return value + 1; -} -fn two(value: i32) i32 { - return value + 2; -} -fn three(value: i32) i32 { - return value + 3; -} - -fn performFn(comptime prefix_char: u8, start_value: i32) i32 { - var result: i32 = start_value; - comptime var i = 0; - inline while (i < cmd_fns.len) : (i += 1) { - if (cmd_fns[i].name[0] == prefix_char) { - result = cmd_fns[i].func(result); - } - } - return result; -} - -test "comptime iterate over fn ptr list" { - try expect(performFn('t', 1) == 6); - try expect(performFn('o', 0) == 1); - try expect(performFn('w', 99) == 99); -} - test "eval @setRuntimeSafety at compile-time" { const result = comptime fnWithSetRuntimeSafety(); try expect(result == 1234); @@ -285,90 +105,6 @@ fn fnWithSetRuntimeSafety() i32 { return 1234; } -test "eval @setFloatMode at compile-time" { - const result = comptime fnWithFloatMode(); - try expect(result == 1234.0); -} - -fn fnWithFloatMode() f32 { - @setFloatMode(std.builtin.FloatMode.Strict); - return 1234.0; -} - -const SimpleStruct = struct { - field: i32, - - fn method(self: *const SimpleStruct) i32 { - return self.field + 3; - } -}; - -var simple_struct = SimpleStruct{ .field = 1234 }; - -const bound_fn = simple_struct.method; - -test "call method on bound fn referring to var instance" { - try expect(bound_fn() == 1237); -} - -test "ptr to local array argument at comptime" { - comptime { - var bytes: [10]u8 = undefined; - modifySomeBytes(bytes[0..]); - try expect(bytes[0] == 'a'); - try expect(bytes[9] == 'b'); - } -} - -fn modifySomeBytes(bytes: []u8) void { - bytes[0] = 'a'; - bytes[9] = 'b'; -} - -test "comparisons 0 <= uint and 0 > uint should be comptime" { - testCompTimeUIntComparisons(1234); -} -fn testCompTimeUIntComparisons(x: u32) void { - if (!(0 <= x)) { - @compileError("this condition should be comptime known"); - } - if (0 > x) { - @compileError("this condition should be comptime known"); - } - if (!(x >= 0)) { - @compileError("this condition should be comptime known"); - } - if (x < 0) { - @compileError("this condition should be comptime known"); - } -} - -test "const ptr to variable data changes at runtime" { - try expect(foo_ref.name[0] == 'a'); - foo_ref.name = "b"; - try expect(foo_ref.name[0] == 'b'); -} - -const Foo = struct { - name: []const u8, -}; - -var foo_contents = Foo{ .name = "a" }; -const foo_ref = &foo_contents; - -test "create global array with for loop" { - try expect(global_array[5] == 5 * 5); - try expect(global_array[9] == 9 * 9); -} - -const global_array = x: { - var result: [10]usize = undefined; - for (result) |*item, index| { - item.* = index * index; - } - break :x result; -}; - test "compile-time downcast when the bits fit" { comptime { const spartan_count: u16 = 255; @@ -377,231 +113,6 @@ test "compile-time downcast when the bits fit" { } } -const hi1 = "hi"; -const hi2 = hi1; -test "const global shares pointer with other same one" { - try assertEqualPtrs(&hi1[0], &hi2[0]); - comptime try expect(&hi1[0] == &hi2[0]); -} -fn assertEqualPtrs(ptr1: *const u8, ptr2: *const u8) !void { - try expect(ptr1 == ptr2); -} - -test "@setEvalBranchQuota" { - comptime { - // 1001 for the loop and then 1 more for the expect fn call - @setEvalBranchQuota(1002); - var i = 0; - var sum = 0; - while (i < 1001) : (i += 1) { - sum += i; - } - try expect(sum == 500500); - } -} - -test "float literal at compile time not lossy" { - try expect(16777216.0 + 1.0 == 16777217.0); - try expect(9007199254740992.0 + 1.0 == 9007199254740993.0); -} - -test "f32 at compile time is lossy" { - try expect(@as(f32, 1 << 24) + 1 == 1 << 24); -} - -test "f64 at compile time is lossy" { - try expect(@as(f64, 1 << 53) + 1 == 1 << 53); -} - -test "f128 at compile time is lossy" { - try expect(@as(f128, 10384593717069655257060992658440192.0) + 1 == 10384593717069655257060992658440192.0); -} - -test { - comptime try expect(@as(f128, 1 << 113) == 10384593717069655257060992658440192); -} - -pub fn TypeWithCompTimeSlice(comptime field_name: []const u8) type { - _ = field_name; - return struct { - pub const Node = struct {}; - }; -} - -test "string literal used as comptime slice is memoized" { - const a = "link"; - const b = "link"; - comptime try expect(TypeWithCompTimeSlice(a).Node == TypeWithCompTimeSlice(b).Node); - comptime try expect(TypeWithCompTimeSlice("link").Node == TypeWithCompTimeSlice("link").Node); -} - -test "comptime slice of undefined pointer of length 0" { - const slice1 = @as([*]i32, undefined)[0..0]; - try expect(slice1.len == 0); - const slice2 = @as([*]i32, undefined)[100..100]; - try expect(slice2.len == 0); -} - -fn copyWithPartialInline(s: []u32, b: []u8) void { - comptime var i: usize = 0; - inline while (i < 4) : (i += 1) { - s[i] = 0; - s[i] |= @as(u32, b[i * 4 + 0]) << 24; - s[i] |= @as(u32, b[i * 4 + 1]) << 16; - s[i] |= @as(u32, b[i * 4 + 2]) << 8; - s[i] |= @as(u32, b[i * 4 + 3]) << 0; - } -} - -test "binary math operator in partially inlined function" { - var s: [4]u32 = undefined; - var b: [16]u8 = undefined; - - for (b) |*r, i| - r.* = @intCast(u8, i + 1); - - copyWithPartialInline(s[0..], b[0..]); - try expect(s[0] == 0x1020304); - try expect(s[1] == 0x5060708); - try expect(s[2] == 0x90a0b0c); - try expect(s[3] == 0xd0e0f10); -} - -test "comptime function with the same args is memoized" { - comptime { - try expect(MakeType(i32) == MakeType(i32)); - try expect(MakeType(i32) != MakeType(f64)); - } -} - -fn MakeType(comptime T: type) type { - return struct { - field: T, - }; -} - -test "comptime function with mutable pointer is not memoized" { - comptime { - var x: i32 = 1; - const ptr = &x; - increment(ptr); - increment(ptr); - try expect(x == 3); - } -} - -fn increment(value: *i32) void { - value.* += 1; -} - -fn generateTable(comptime T: type) [1010]T { - var res: [1010]T = undefined; - var i: usize = 0; - while (i < 1010) : (i += 1) { - res[i] = @intCast(T, i); - } - return res; -} - -fn doesAlotT(comptime T: type, value: usize) T { - @setEvalBranchQuota(5000); - const table = comptime blk: { - break :blk generateTable(T); - }; - return table[value]; -} - -test "@setEvalBranchQuota at same scope as generic function call" { - try expect(doesAlotT(u32, 2) == 2); -} - -test "comptime slice of slice preserves comptime var" { - comptime { - var buff: [10]u8 = undefined; - buff[0..][0..][0] = 1; - try expect(buff[0..][0..][0] == 1); - } -} - -test "comptime slice of pointer preserves comptime var" { - comptime { - var buff: [10]u8 = undefined; - var a = @ptrCast([*]u8, &buff); - a[0..1][0] = 1; - try expect(buff[0..][0..][0] == 1); - } -} - -const SingleFieldStruct = struct { - x: i32, - - fn read_x(self: *const SingleFieldStruct) i32 { - return self.x; - } -}; -test "const ptr to comptime mutable data is not memoized" { - comptime { - var foo = SingleFieldStruct{ .x = 1 }; - try expect(foo.read_x() == 1); - foo.x = 2; - try expect(foo.read_x() == 2); - } -} - -test "array concat of slices gives slice" { - comptime { - var a: []const u8 = "aoeu"; - var b: []const u8 = "asdf"; - const c = a ++ b; - try expect(std.mem.eql(u8, c, "aoeuasdf")); - } -} - -test "comptime shlWithOverflow" { - const ct_shifted: u64 = comptime amt: { - var amt = @as(u64, 0); - _ = @shlWithOverflow(u64, ~@as(u64, 0), 16, &amt); - break :amt amt; - }; - - const rt_shifted: u64 = amt: { - var amt = @as(u64, 0); - _ = @shlWithOverflow(u64, ~@as(u64, 0), 16, &amt); - break :amt amt; - }; - - try expect(ct_shifted == rt_shifted); -} - -test "comptime shl" { - var a: u128 = 3; - var b: u7 = 63; - var c: u128 = 3 << 63; - try expectEqual(a << b, c); -} - -test "runtime 128 bit integer division" { - var a: u128 = 152313999999999991610955792383; - var b: u128 = 10000000000000000000; - var c = a / b; - try expect(c == 15231399999); -} - -pub const Info = struct { - version: u8, -}; - -pub const diamond_info = Info{ .version = 0 }; - -test "comptime modification of const struct field" { - comptime { - var res = diamond_info; - res.version = 1; - try expect(diamond_info.version == 0); - try expect(res.version == 1); - } -} - test "pointer to type" { comptime { var T: type = i32; @@ -614,233 +125,8 @@ test "pointer to type" { } } -test "slice of type" { - comptime { - var types_array = [_]type{ i32, f64, type }; - for (types_array) |T, i| { - switch (i) { - 0 => try expect(T == i32), - 1 => try expect(T == f64), - 2 => try expect(T == type), - else => unreachable, - } - } - for (types_array[0..]) |T, i| { - switch (i) { - 0 => try expect(T == i32), - 1 => try expect(T == f64), - 2 => try expect(T == type), - else => unreachable, - } - } - } -} - -const Wrapper = struct { - T: type, -}; - -fn wrap(comptime T: type) Wrapper { - return Wrapper{ .T = T }; -} - -test "function which returns struct with type field causes implicit comptime" { - const ty = wrap(i32).T; - try expect(ty == i32); -} - -test "call method with comptime pass-by-non-copying-value self parameter" { - const S = struct { - a: u8, - - fn b(comptime s: @This()) u8 { - return s.a; - } - }; - - const s = S{ .a = 2 }; - var b = s.b(); - try expect(b == 2); -} - -test "@tagName of @typeInfo" { - const str = @tagName(@typeInfo(u8)); - try expect(std.mem.eql(u8, str, "Int")); -} - -test "setting backward branch quota just before a generic fn call" { - @setEvalBranchQuota(1001); - loopNTimes(1001); -} - -fn loopNTimes(comptime n: usize) void { - comptime var i = 0; - inline while (i < n) : (i += 1) {} -} - -test "variable inside inline loop that has different types on different iterations" { - try testVarInsideInlineLoop(.{ true, @as(u32, 42) }); -} - -fn testVarInsideInlineLoop(args: anytype) !void { - comptime var i = 0; - inline while (i < args.len) : (i += 1) { - const x = args[i]; - if (i == 0) try expect(x); - if (i == 1) try expect(x == 42); - } -} - -test "inline for with same type but different values" { - var res: usize = 0; - inline for ([_]type{ [2]u8, [1]u8, [2]u8 }) |T| { - var a: T = undefined; - res += a.len; - } - try expect(res == 5); -} - -test "refer to the type of a generic function" { - const Func = fn (type) void; - const f: Func = doNothingWithType; - f(i32); -} - -fn doNothingWithType(comptime T: type) void { - _ = T; -} - -test "zero extend from u0 to u1" { - var zero_u0: u0 = 0; - var zero_u1: u1 = zero_u0; - try expect(zero_u1 == 0); -} - -test "bit shift a u1" { - var x: u1 = 1; - var y = x << 0; - try expect(y == 1); -} - -test "comptime pointer cast array and then slice" { - const array = [_]u8{ 1, 2, 3, 4, 5, 6, 7, 8 }; - - const ptrA: [*]const u8 = @ptrCast([*]const u8, &array); - const sliceA: []const u8 = ptrA[0..2]; - - const ptrB: [*]const u8 = &array; - const sliceB: []const u8 = ptrB[0..2]; - - try expect(sliceA[1] == 2); - try expect(sliceB[1] == 2); -} - -test "slice bounds in comptime concatenation" { - const bs = comptime blk: { - const b = "........1........"; - break :blk b[8..9]; - }; - const str = "" ++ bs; - try expect(str.len == 1); - try expect(std.mem.eql(u8, str, "1")); - - const str2 = bs ++ ""; - try expect(str2.len == 1); - try expect(std.mem.eql(u8, str2, "1")); -} - -test "comptime bitwise operators" { - comptime { - try expect(3 & 1 == 1); - try expect(3 & -1 == 3); - try expect(-3 & -1 == -3); - try expect(3 | -1 == -1); - try expect(-3 | -1 == -1); - try expect(3 ^ -1 == -4); - try expect(-3 ^ -1 == 2); - try expect(~@as(i8, -1) == 0); - try expect(~@as(i128, -1) == 0); - try expect(18446744073709551615 & 18446744073709551611 == 18446744073709551611); - try expect(-18446744073709551615 & -18446744073709551611 == -18446744073709551615); - try expect(~@as(u128, 0) == 0xffffffffffffffffffffffffffffffff); - } -} - -test "*align(1) u16 is the same as *align(1:0:2) u16" { - comptime { - try expect(*align(1:0:2) u16 == *align(1) u16); - try expect(*align(2:0:2) u16 == *u16); - } -} - -test "array concatenation forces comptime" { - var a = oneItem(3) ++ oneItem(4); - try expect(std.mem.eql(i32, &a, &[_]i32{ 3, 4 })); -} - -test "array multiplication forces comptime" { - var a = oneItem(3) ** scalar(2); - try expect(std.mem.eql(i32, &a, &[_]i32{ 3, 3 })); -} - -fn oneItem(x: i32) [1]i32 { - return [_]i32{x}; -} - -fn scalar(x: u32) u32 { - return x; -} - test "no undeclared identifier error in unanalyzed branches" { if (false) { lol_this_doesnt_exist = nonsense; } } - -test "comptime assign int to optional int" { - comptime { - var x: ?i32 = null; - x = 2; - x.? *= 10; - try expectEqual(20, x.?); - } -} - -test "return 0 from function that has u0 return type" { - const S = struct { - fn foo_zero() u0 { - return 0; - } - }; - comptime { - if (S.foo_zero() != 0) { - @compileError("test failed"); - } - } -} - -test "two comptime calls with array default initialized to undefined" { - const S = struct { - const CrossTarget = struct { - dynamic_linker: DynamicLinker = DynamicLinker{}, - - pub fn parse() void { - var result: CrossTarget = .{}; - result.getCpuArch(); - } - - pub fn getCpuArch(self: CrossTarget) void { - _ = self; - } - }; - - const DynamicLinker = struct { - buffer: [255]u8 = undefined, - }; - }; - - comptime { - S.CrossTarget.parse(); - S.CrossTarget.parse(); - } -} diff --git a/test/behavior/eval_stage1.zig b/test/behavior/eval_stage1.zig new file mode 100644 index 0000000000..3599d5a477 --- /dev/null +++ b/test/behavior/eval_stage1.zig @@ -0,0 +1,717 @@ +const std = @import("std"); +const expect = std.testing.expect; +const expectEqual = std.testing.expectEqual; + +test "statically initialized list" { + try expect(static_point_list[0].x == 1); + try expect(static_point_list[0].y == 2); + try expect(static_point_list[1].x == 3); + try expect(static_point_list[1].y == 4); +} +const Point = struct { + x: i32, + y: i32, +}; +const static_point_list = [_]Point{ + makePoint(1, 2), + makePoint(3, 4), +}; +fn makePoint(x: i32, y: i32) Point { + return Point{ + .x = x, + .y = y, + }; +} + +test "static eval list init" { + try expect(static_vec3.data[2] == 1.0); + try expect(vec3(0.0, 0.0, 3.0).data[2] == 3.0); +} +const static_vec3 = vec3(0.0, 0.0, 1.0); +pub const Vec3 = struct { + data: [3]f32, +}; +pub fn vec3(x: f32, y: f32, z: f32) Vec3 { + return Vec3{ + .data = [_]f32{ + x, + y, + z, + }, + }; +} + +test "constant struct with negation" { + try expect(vertices[0].x == -0.6); +} +const Vertex = struct { + x: f32, + y: f32, + r: f32, + g: f32, + b: f32, +}; +const vertices = [_]Vertex{ + Vertex{ + .x = -0.6, + .y = -0.4, + .r = 1.0, + .g = 0.0, + .b = 0.0, + }, + Vertex{ + .x = 0.6, + .y = -0.4, + .r = 0.0, + .g = 1.0, + .b = 0.0, + }, + Vertex{ + .x = 0.0, + .y = 0.6, + .r = 0.0, + .g = 0.0, + .b = 1.0, + }, +}; + +test "statically initialized struct" { + st_init_str_foo.x += 1; + try expect(st_init_str_foo.x == 14); +} +const StInitStrFoo = struct { + x: i32, + y: bool, +}; +var st_init_str_foo = StInitStrFoo{ + .x = 13, + .y = true, +}; + +test "statically initalized array literal" { + const y: [4]u8 = st_init_arr_lit_x; + try expect(y[3] == 4); +} +const st_init_arr_lit_x = [_]u8{ + 1, + 2, + 3, + 4, +}; + +test "const slice" { + comptime { + const a = "1234567890"; + try expect(a.len == 10); + const b = a[1..2]; + try expect(b.len == 1); + try expect(b[0] == '2'); + } +} + +test "try to trick eval with runtime if" { + try expect(testTryToTrickEvalWithRuntimeIf(true) == 10); +} + +fn testTryToTrickEvalWithRuntimeIf(b: bool) usize { + comptime var i: usize = 0; + inline while (i < 10) : (i += 1) { + const result = if (b) false else true; + _ = result; + } + comptime { + return i; + } +} + +test "inlined loop has array literal with elided runtime scope on first iteration but not second iteration" { + var runtime = [1]i32{3}; + comptime var i: usize = 0; + inline while (i < 2) : (i += 1) { + const result = if (i == 0) [1]i32{2} else runtime; + _ = result; + } + comptime { + try expect(i == 2); + } +} + +const CmdFn = struct { + name: []const u8, + func: fn (i32) i32, +}; + +const cmd_fns = [_]CmdFn{ + CmdFn{ + .name = "one", + .func = one, + }, + CmdFn{ + .name = "two", + .func = two, + }, + CmdFn{ + .name = "three", + .func = three, + }, +}; +fn one(value: i32) i32 { + return value + 1; +} +fn two(value: i32) i32 { + return value + 2; +} +fn three(value: i32) i32 { + return value + 3; +} + +fn performFn(comptime prefix_char: u8, start_value: i32) i32 { + var result: i32 = start_value; + comptime var i = 0; + inline while (i < cmd_fns.len) : (i += 1) { + if (cmd_fns[i].name[0] == prefix_char) { + result = cmd_fns[i].func(result); + } + } + return result; +} + +test "comptime iterate over fn ptr list" { + try expect(performFn('t', 1) == 6); + try expect(performFn('o', 0) == 1); + try expect(performFn('w', 99) == 99); +} + +test "eval @setFloatMode at compile-time" { + const result = comptime fnWithFloatMode(); + try expect(result == 1234.0); +} + +fn fnWithFloatMode() f32 { + @setFloatMode(std.builtin.FloatMode.Strict); + return 1234.0; +} + +const SimpleStruct = struct { + field: i32, + + fn method(self: *const SimpleStruct) i32 { + return self.field + 3; + } +}; + +var simple_struct = SimpleStruct{ .field = 1234 }; + +const bound_fn = simple_struct.method; + +test "call method on bound fn referring to var instance" { + try expect(bound_fn() == 1237); +} + +test "ptr to local array argument at comptime" { + comptime { + var bytes: [10]u8 = undefined; + modifySomeBytes(bytes[0..]); + try expect(bytes[0] == 'a'); + try expect(bytes[9] == 'b'); + } +} + +fn modifySomeBytes(bytes: []u8) void { + bytes[0] = 'a'; + bytes[9] = 'b'; +} + +test "comparisons 0 <= uint and 0 > uint should be comptime" { + testCompTimeUIntComparisons(1234); +} +fn testCompTimeUIntComparisons(x: u32) void { + if (!(0 <= x)) { + @compileError("this condition should be comptime known"); + } + if (0 > x) { + @compileError("this condition should be comptime known"); + } + if (!(x >= 0)) { + @compileError("this condition should be comptime known"); + } + if (x < 0) { + @compileError("this condition should be comptime known"); + } +} + +test "const ptr to variable data changes at runtime" { + try expect(foo_ref.name[0] == 'a'); + foo_ref.name = "b"; + try expect(foo_ref.name[0] == 'b'); +} + +const Foo = struct { + name: []const u8, +}; + +var foo_contents = Foo{ .name = "a" }; +const foo_ref = &foo_contents; + +test "create global array with for loop" { + try expect(global_array[5] == 5 * 5); + try expect(global_array[9] == 9 * 9); +} + +const global_array = x: { + var result: [10]usize = undefined; + for (result) |*item, index| { + item.* = index * index; + } + break :x result; +}; + +const hi1 = "hi"; +const hi2 = hi1; +test "const global shares pointer with other same one" { + try assertEqualPtrs(&hi1[0], &hi2[0]); + comptime try expect(&hi1[0] == &hi2[0]); +} +fn assertEqualPtrs(ptr1: *const u8, ptr2: *const u8) !void { + try expect(ptr1 == ptr2); +} + +test "@setEvalBranchQuota" { + comptime { + // 1001 for the loop and then 1 more for the expect fn call + @setEvalBranchQuota(1002); + var i = 0; + var sum = 0; + while (i < 1001) : (i += 1) { + sum += i; + } + try expect(sum == 500500); + } +} + +test "float literal at compile time not lossy" { + try expect(16777216.0 + 1.0 == 16777217.0); + try expect(9007199254740992.0 + 1.0 == 9007199254740993.0); +} + +test "f32 at compile time is lossy" { + try expect(@as(f32, 1 << 24) + 1 == 1 << 24); +} + +test "f64 at compile time is lossy" { + try expect(@as(f64, 1 << 53) + 1 == 1 << 53); +} + +test "f128 at compile time is lossy" { + try expect(@as(f128, 10384593717069655257060992658440192.0) + 1 == 10384593717069655257060992658440192.0); +} + +test { + comptime try expect(@as(f128, 1 << 113) == 10384593717069655257060992658440192); +} + +pub fn TypeWithCompTimeSlice(comptime field_name: []const u8) type { + _ = field_name; + return struct { + pub const Node = struct {}; + }; +} + +test "string literal used as comptime slice is memoized" { + const a = "link"; + const b = "link"; + comptime try expect(TypeWithCompTimeSlice(a).Node == TypeWithCompTimeSlice(b).Node); + comptime try expect(TypeWithCompTimeSlice("link").Node == TypeWithCompTimeSlice("link").Node); +} + +test "comptime slice of undefined pointer of length 0" { + const slice1 = @as([*]i32, undefined)[0..0]; + try expect(slice1.len == 0); + const slice2 = @as([*]i32, undefined)[100..100]; + try expect(slice2.len == 0); +} + +fn copyWithPartialInline(s: []u32, b: []u8) void { + comptime var i: usize = 0; + inline while (i < 4) : (i += 1) { + s[i] = 0; + s[i] |= @as(u32, b[i * 4 + 0]) << 24; + s[i] |= @as(u32, b[i * 4 + 1]) << 16; + s[i] |= @as(u32, b[i * 4 + 2]) << 8; + s[i] |= @as(u32, b[i * 4 + 3]) << 0; + } +} + +test "binary math operator in partially inlined function" { + var s: [4]u32 = undefined; + var b: [16]u8 = undefined; + + for (b) |*r, i| + r.* = @intCast(u8, i + 1); + + copyWithPartialInline(s[0..], b[0..]); + try expect(s[0] == 0x1020304); + try expect(s[1] == 0x5060708); + try expect(s[2] == 0x90a0b0c); + try expect(s[3] == 0xd0e0f10); +} + +test "comptime function with the same args is memoized" { + comptime { + try expect(MakeType(i32) == MakeType(i32)); + try expect(MakeType(i32) != MakeType(f64)); + } +} + +fn MakeType(comptime T: type) type { + return struct { + field: T, + }; +} + +test "comptime function with mutable pointer is not memoized" { + comptime { + var x: i32 = 1; + const ptr = &x; + increment(ptr); + increment(ptr); + try expect(x == 3); + } +} + +fn increment(value: *i32) void { + value.* += 1; +} + +fn generateTable(comptime T: type) [1010]T { + var res: [1010]T = undefined; + var i: usize = 0; + while (i < 1010) : (i += 1) { + res[i] = @intCast(T, i); + } + return res; +} + +fn doesAlotT(comptime T: type, value: usize) T { + @setEvalBranchQuota(5000); + const table = comptime blk: { + break :blk generateTable(T); + }; + return table[value]; +} + +test "@setEvalBranchQuota at same scope as generic function call" { + try expect(doesAlotT(u32, 2) == 2); +} + +test "comptime slice of slice preserves comptime var" { + comptime { + var buff: [10]u8 = undefined; + buff[0..][0..][0] = 1; + try expect(buff[0..][0..][0] == 1); + } +} + +test "comptime slice of pointer preserves comptime var" { + comptime { + var buff: [10]u8 = undefined; + var a = @ptrCast([*]u8, &buff); + a[0..1][0] = 1; + try expect(buff[0..][0..][0] == 1); + } +} + +const SingleFieldStruct = struct { + x: i32, + + fn read_x(self: *const SingleFieldStruct) i32 { + return self.x; + } +}; +test "const ptr to comptime mutable data is not memoized" { + comptime { + var foo = SingleFieldStruct{ .x = 1 }; + try expect(foo.read_x() == 1); + foo.x = 2; + try expect(foo.read_x() == 2); + } +} + +test "array concat of slices gives slice" { + comptime { + var a: []const u8 = "aoeu"; + var b: []const u8 = "asdf"; + const c = a ++ b; + try expect(std.mem.eql(u8, c, "aoeuasdf")); + } +} + +test "comptime shlWithOverflow" { + const ct_shifted: u64 = comptime amt: { + var amt = @as(u64, 0); + _ = @shlWithOverflow(u64, ~@as(u64, 0), 16, &amt); + break :amt amt; + }; + + const rt_shifted: u64 = amt: { + var amt = @as(u64, 0); + _ = @shlWithOverflow(u64, ~@as(u64, 0), 16, &amt); + break :amt amt; + }; + + try expect(ct_shifted == rt_shifted); +} + +test "comptime shl" { + var a: u128 = 3; + var b: u7 = 63; + var c: u128 = 3 << 63; + try expectEqual(a << b, c); +} + +test "runtime 128 bit integer division" { + var a: u128 = 152313999999999991610955792383; + var b: u128 = 10000000000000000000; + var c = a / b; + try expect(c == 15231399999); +} + +pub const Info = struct { + version: u8, +}; + +pub const diamond_info = Info{ .version = 0 }; + +test "comptime modification of const struct field" { + comptime { + var res = diamond_info; + res.version = 1; + try expect(diamond_info.version == 0); + try expect(res.version == 1); + } +} + +test "slice of type" { + comptime { + var types_array = [_]type{ i32, f64, type }; + for (types_array) |T, i| { + switch (i) { + 0 => try expect(T == i32), + 1 => try expect(T == f64), + 2 => try expect(T == type), + else => unreachable, + } + } + for (types_array[0..]) |T, i| { + switch (i) { + 0 => try expect(T == i32), + 1 => try expect(T == f64), + 2 => try expect(T == type), + else => unreachable, + } + } + } +} + +const Wrapper = struct { + T: type, +}; + +fn wrap(comptime T: type) Wrapper { + return Wrapper{ .T = T }; +} + +test "function which returns struct with type field causes implicit comptime" { + const ty = wrap(i32).T; + try expect(ty == i32); +} + +test "call method with comptime pass-by-non-copying-value self parameter" { + const S = struct { + a: u8, + + fn b(comptime s: @This()) u8 { + return s.a; + } + }; + + const s = S{ .a = 2 }; + var b = s.b(); + try expect(b == 2); +} + +test "@tagName of @typeInfo" { + const str = @tagName(@typeInfo(u8)); + try expect(std.mem.eql(u8, str, "Int")); +} + +test "setting backward branch quota just before a generic fn call" { + @setEvalBranchQuota(1001); + loopNTimes(1001); +} + +fn loopNTimes(comptime n: usize) void { + comptime var i = 0; + inline while (i < n) : (i += 1) {} +} + +test "variable inside inline loop that has different types on different iterations" { + try testVarInsideInlineLoop(.{ true, @as(u32, 42) }); +} + +fn testVarInsideInlineLoop(args: anytype) !void { + comptime var i = 0; + inline while (i < args.len) : (i += 1) { + const x = args[i]; + if (i == 0) try expect(x); + if (i == 1) try expect(x == 42); + } +} + +test "inline for with same type but different values" { + var res: usize = 0; + inline for ([_]type{ [2]u8, [1]u8, [2]u8 }) |T| { + var a: T = undefined; + res += a.len; + } + try expect(res == 5); +} + +test "refer to the type of a generic function" { + const Func = fn (type) void; + const f: Func = doNothingWithType; + f(i32); +} + +fn doNothingWithType(comptime T: type) void { + _ = T; +} + +test "zero extend from u0 to u1" { + var zero_u0: u0 = 0; + var zero_u1: u1 = zero_u0; + try expect(zero_u1 == 0); +} + +test "bit shift a u1" { + var x: u1 = 1; + var y = x << 0; + try expect(y == 1); +} + +test "comptime pointer cast array and then slice" { + const array = [_]u8{ 1, 2, 3, 4, 5, 6, 7, 8 }; + + const ptrA: [*]const u8 = @ptrCast([*]const u8, &array); + const sliceA: []const u8 = ptrA[0..2]; + + const ptrB: [*]const u8 = &array; + const sliceB: []const u8 = ptrB[0..2]; + + try expect(sliceA[1] == 2); + try expect(sliceB[1] == 2); +} + +test "slice bounds in comptime concatenation" { + const bs = comptime blk: { + const b = "........1........"; + break :blk b[8..9]; + }; + const str = "" ++ bs; + try expect(str.len == 1); + try expect(std.mem.eql(u8, str, "1")); + + const str2 = bs ++ ""; + try expect(str2.len == 1); + try expect(std.mem.eql(u8, str2, "1")); +} + +test "comptime bitwise operators" { + comptime { + try expect(3 & 1 == 1); + try expect(3 & -1 == 3); + try expect(-3 & -1 == -3); + try expect(3 | -1 == -1); + try expect(-3 | -1 == -1); + try expect(3 ^ -1 == -4); + try expect(-3 ^ -1 == 2); + try expect(~@as(i8, -1) == 0); + try expect(~@as(i128, -1) == 0); + try expect(18446744073709551615 & 18446744073709551611 == 18446744073709551611); + try expect(-18446744073709551615 & -18446744073709551611 == -18446744073709551615); + try expect(~@as(u128, 0) == 0xffffffffffffffffffffffffffffffff); + } +} + +test "*align(1) u16 is the same as *align(1:0:2) u16" { + comptime { + try expect(*align(1:0:2) u16 == *align(1) u16); + try expect(*align(2:0:2) u16 == *u16); + } +} + +test "array concatenation forces comptime" { + var a = oneItem(3) ++ oneItem(4); + try expect(std.mem.eql(i32, &a, &[_]i32{ 3, 4 })); +} + +test "array multiplication forces comptime" { + var a = oneItem(3) ** scalar(2); + try expect(std.mem.eql(i32, &a, &[_]i32{ 3, 3 })); +} + +fn oneItem(x: i32) [1]i32 { + return [_]i32{x}; +} + +fn scalar(x: u32) u32 { + return x; +} + +test "comptime assign int to optional int" { + comptime { + var x: ?i32 = null; + x = 2; + x.? *= 10; + try expectEqual(20, x.?); + } +} + +test "return 0 from function that has u0 return type" { + const S = struct { + fn foo_zero() u0 { + return 0; + } + }; + comptime { + if (S.foo_zero() != 0) { + @compileError("test failed"); + } + } +} + +test "two comptime calls with array default initialized to undefined" { + const S = struct { + const CrossTarget = struct { + dynamic_linker: DynamicLinker = DynamicLinker{}, + + pub fn parse() void { + var result: CrossTarget = .{}; + result.getCpuArch(); + } + + pub fn getCpuArch(self: CrossTarget) void { + _ = self; + } + }; + + const DynamicLinker = struct { + buffer: [255]u8 = undefined, + }; + }; + + comptime { + S.CrossTarget.parse(); + S.CrossTarget.parse(); + } +} diff --git a/test/behavior/generics.zig b/test/behavior/generics.zig index 104752607a..67fb1def8b 100644 --- a/test/behavior/generics.zig +++ b/test/behavior/generics.zig @@ -1,11 +1,29 @@ const std = @import("std"); +const builtin = @import("builtin"); const testing = std.testing; const expect = testing.expect; const expectEqual = testing.expectEqual; +test "one param, explicit comptime" { + var x: usize = 0; + x += checkSize(i32); + x += checkSize(bool); + x += checkSize(bool); + try expect(x == 6); +} + +fn checkSize(comptime T: type) usize { + return @sizeOf(T); +} + test "simple generic fn" { try expect(max(i32, 3, -1) == 3); - try expect(max(f32, 0.123, 0.456) == 0.456); + try expect(max(u8, 1, 100) == 100); + if (!builtin.zig_is_stage2) { + // TODO: stage2 is incorrectly emitting the following: + // error: cast of value 1.23e-01 to type 'f32' loses information + try expect(max(f32, 0.123, 0.456) == 0.456); + } try expect(add(2, 3) == 5); } @@ -40,130 +58,23 @@ test "fn with comptime args" { try expect(sameButWithFloats(0.43, 0.49) == 0.49); } -test "var params" { +test "anytype params" { try expect(max_i32(12, 34) == 34); try expect(max_f64(1.2, 3.4) == 3.4); + comptime { + try expect(max_i32(12, 34) == 34); + try expect(max_f64(1.2, 3.4) == 3.4); + } } -test { - comptime try expect(max_i32(12, 34) == 34); - comptime try expect(max_f64(1.2, 3.4) == 3.4); -} - -fn max_var(a: anytype, b: anytype) @TypeOf(a + b) { +fn max_anytype(a: anytype, b: anytype) @TypeOf(a, b) { return if (a > b) a else b; } fn max_i32(a: i32, b: i32) i32 { - return max_var(a, b); + return max_anytype(a, b); } fn max_f64(a: f64, b: f64) f64 { - return max_var(a, b); -} - -pub fn List(comptime T: type) type { - return SmallList(T, 8); -} - -pub fn SmallList(comptime T: type, comptime STATIC_SIZE: usize) type { - return struct { - items: []T, - length: usize, - prealloc_items: [STATIC_SIZE]T, - }; -} - -test "function with return type type" { - var list: List(i32) = undefined; - var list2: List(i32) = undefined; - list.length = 10; - list2.length = 10; - try expect(list.prealloc_items.len == 8); - try expect(list2.prealloc_items.len == 8); -} - -test "generic struct" { - var a1 = GenNode(i32){ - .value = 13, - .next = null, - }; - var b1 = GenNode(bool){ - .value = true, - .next = null, - }; - try expect(a1.value == 13); - try expect(a1.value == a1.getVal()); - try expect(b1.getVal()); -} -fn GenNode(comptime T: type) type { - return struct { - value: T, - next: ?*GenNode(T), - fn getVal(n: *const GenNode(T)) T { - return n.value; - } - }; -} - -test "const decls in struct" { - try expect(GenericDataThing(3).count_plus_one == 4); -} -fn GenericDataThing(comptime count: isize) type { - return struct { - const count_plus_one = count + 1; - }; -} - -test "use generic param in generic param" { - try expect(aGenericFn(i32, 3, 4) == 7); -} -fn aGenericFn(comptime T: type, comptime a: T, b: T) T { - return a + b; -} - -test "generic fn with implicit cast" { - try expect(getFirstByte(u8, &[_]u8{13}) == 13); - try expect(getFirstByte(u16, &[_]u16{ - 0, - 13, - }) == 0); -} -fn getByte(ptr: ?*const u8) u8 { - return ptr.?.*; -} -fn getFirstByte(comptime T: type, mem: []const T) u8 { - return getByte(@ptrCast(*const u8, &mem[0])); -} - -const foos = [_]fn (anytype) bool{ - foo1, - foo2, -}; - -fn foo1(arg: anytype) bool { - return arg; -} -fn foo2(arg: anytype) bool { - return !arg; -} - -test "array of generic fns" { - try expect(foos[0](true)); - try expect(!foos[1](true)); -} - -test "generic fn keeps non-generic parameter types" { - const A = 128; - - const S = struct { - fn f(comptime T: type, s: []T) !void { - try expect(A != @typeInfo(@TypeOf(s)).Pointer.alignment); - } - }; - - // The compiler monomorphizes `S.f` for `T=u8` on its first use, check that - // `x` type not affect `s` parameter type. - var x: [16]u8 align(A) = undefined; - try S.f(u8, &x); + return max_anytype(a, b); } diff --git a/test/behavior/generics_stage1.zig b/test/behavior/generics_stage1.zig new file mode 100644 index 0000000000..4b768a5b4f --- /dev/null +++ b/test/behavior/generics_stage1.zig @@ -0,0 +1,110 @@ +const std = @import("std"); +const testing = std.testing; +const expect = testing.expect; +const expectEqual = testing.expectEqual; + +pub fn List(comptime T: type) type { + return SmallList(T, 8); +} + +pub fn SmallList(comptime T: type, comptime STATIC_SIZE: usize) type { + return struct { + items: []T, + length: usize, + prealloc_items: [STATIC_SIZE]T, + }; +} + +test "function with return type type" { + var list: List(i32) = undefined; + var list2: List(i32) = undefined; + list.length = 10; + list2.length = 10; + try expect(list.prealloc_items.len == 8); + try expect(list2.prealloc_items.len == 8); +} + +test "generic struct" { + var a1 = GenNode(i32){ + .value = 13, + .next = null, + }; + var b1 = GenNode(bool){ + .value = true, + .next = null, + }; + try expect(a1.value == 13); + try expect(a1.value == a1.getVal()); + try expect(b1.getVal()); +} +fn GenNode(comptime T: type) type { + return struct { + value: T, + next: ?*GenNode(T), + fn getVal(n: *const GenNode(T)) T { + return n.value; + } + }; +} + +test "const decls in struct" { + try expect(GenericDataThing(3).count_plus_one == 4); +} +fn GenericDataThing(comptime count: isize) type { + return struct { + const count_plus_one = count + 1; + }; +} + +test "use generic param in generic param" { + try expect(aGenericFn(i32, 3, 4) == 7); +} +fn aGenericFn(comptime T: type, comptime a: T, b: T) T { + return a + b; +} + +test "generic fn with implicit cast" { + try expect(getFirstByte(u8, &[_]u8{13}) == 13); + try expect(getFirstByte(u16, &[_]u16{ + 0, + 13, + }) == 0); +} +fn getByte(ptr: ?*const u8) u8 { + return ptr.?.*; +} +fn getFirstByte(comptime T: type, mem: []const T) u8 { + return getByte(@ptrCast(*const u8, &mem[0])); +} + +const foos = [_]fn (anytype) bool{ + foo1, + foo2, +}; + +fn foo1(arg: anytype) bool { + return arg; +} +fn foo2(arg: anytype) bool { + return !arg; +} + +test "array of generic fns" { + try expect(foos[0](true)); + try expect(!foos[1](true)); +} + +test "generic fn keeps non-generic parameter types" { + const A = 128; + + const S = struct { + fn f(comptime T: type, s: []T) !void { + try expect(A != @typeInfo(@TypeOf(s)).Pointer.alignment); + } + }; + + // The compiler monomorphizes `S.f` for `T=u8` on its first use, check that + // `x` type not affect `s` parameter type. + var x: [16]u8 align(A) = undefined; + try S.f(u8, &x); +} diff --git a/test/behavior/if.zig b/test/behavior/if.zig index e8c84f4570..191d4817df 100644 --- a/test/behavior/if.zig +++ b/test/behavior/if.zig @@ -65,45 +65,3 @@ test "labeled break inside comptime if inside runtime if" { } try expect(answer == 42); } - -test "const result loc, runtime if cond, else unreachable" { - const Num = enum { - One, - Two, - }; - - var t = true; - const x = if (t) Num.Two else unreachable; - try expect(x == .Two); -} - -test "if prongs cast to expected type instead of peer type resolution" { - const S = struct { - fn doTheTest(f: bool) !void { - var x: i32 = 0; - x = if (f) 1 else 2; - try expect(x == 2); - - var b = true; - const y: i32 = if (b) 1 else 2; - try expect(y == 1); - } - }; - try S.doTheTest(false); - comptime try S.doTheTest(false); -} - -test "while copies its payload" { - const S = struct { - fn doTheTest() !void { - var tmp: ?i32 = 10; - if (tmp) |value| { - // Modify the original variable - tmp = null; - try expectEqual(@as(i32, 10), value); - } else unreachable; - } - }; - try S.doTheTest(); - comptime try S.doTheTest(); -} diff --git a/test/behavior/if_stage1.zig b/test/behavior/if_stage1.zig new file mode 100644 index 0000000000..36500fbaee --- /dev/null +++ b/test/behavior/if_stage1.zig @@ -0,0 +1,45 @@ +const std = @import("std"); +const expect = std.testing.expect; +const expectEqual = std.testing.expectEqual; + +test "const result loc, runtime if cond, else unreachable" { + const Num = enum { + One, + Two, + }; + + var t = true; + const x = if (t) Num.Two else unreachable; + try expect(x == .Two); +} + +test "if prongs cast to expected type instead of peer type resolution" { + const S = struct { + fn doTheTest(f: bool) !void { + var x: i32 = 0; + x = if (f) 1 else 2; + try expect(x == 2); + + var b = true; + const y: i32 = if (b) 1 else 2; + try expect(y == 1); + } + }; + try S.doTheTest(false); + comptime try S.doTheTest(false); +} + +test "while copies its payload" { + const S = struct { + fn doTheTest() !void { + var tmp: ?i32 = 10; + if (tmp) |value| { + // Modify the original variable + tmp = null; + try expectEqual(@as(i32, 10), value); + } else unreachable; + } + }; + try S.doTheTest(); + comptime try S.doTheTest(); +} diff --git a/test/behavior/maximum_minimum.zig b/test/behavior/maximum_minimum.zig new file mode 100644 index 0000000000..5fef818f2b --- /dev/null +++ b/test/behavior/maximum_minimum.zig @@ -0,0 +1,58 @@ +const std = @import("std"); +const builtin = @import("builtin"); +const mem = std.mem; +const expect = std.testing.expect; +const expectEqual = std.testing.expectEqual; +const Vector = std.meta.Vector; + +test "@maximum" { + const S = struct { + fn doTheTest() !void { + try expectEqual(@as(i32, 10), @maximum(@as(i32, -3), @as(i32, 10))); + try expectEqual(@as(f32, 3.2), @maximum(@as(f32, 3.2), @as(f32, 0.68))); + + var a: Vector(4, i32) = [4]i32{ 2147483647, -2, 30, 40 }; + var b: Vector(4, i32) = [4]i32{ 1, 2147483647, 3, 4 }; + var x = @maximum(a, b); + try expect(mem.eql(i32, &@as([4]i32, x), &[4]i32{ 2147483647, 2147483647, 30, 40 })); + + var c: Vector(4, f32) = [4]f32{ 0, 0.4, -2.4, 7.8 }; + var d: Vector(4, f32) = [4]f32{ -0.23, 0.42, -0.64, 0.9 }; + var y = @maximum(c, d); + try expect(mem.eql(f32, &@as([4]f32, y), &[4]f32{ 0, 0.42, -0.64, 7.8 })); + + var e: Vector(2, f32) = [2]f32{ 0, std.math.qnan_f32 }; + var f: Vector(2, f32) = [2]f32{ std.math.qnan_f32, 0 }; + var z = @maximum(e, f); + try expect(mem.eql(f32, &@as([2]f32, z), &[2]f32{ 0, 0 })); + } + }; + try S.doTheTest(); + comptime try S.doTheTest(); +} + +test "@minimum" { + const S = struct { + fn doTheTest() !void { + try expectEqual(@as(i32, -3), @minimum(@as(i32, -3), @as(i32, 10))); + try expectEqual(@as(f32, 0.68), @minimum(@as(f32, 3.2), @as(f32, 0.68))); + + var a: Vector(4, i32) = [4]i32{ 2147483647, -2, 30, 40 }; + var b: Vector(4, i32) = [4]i32{ 1, 2147483647, 3, 4 }; + var x = @minimum(a, b); + try expect(mem.eql(i32, &@as([4]i32, x), &[4]i32{ 1, -2, 3, 4 })); + + var c: Vector(4, f32) = [4]f32{ 0, 0.4, -2.4, 7.8 }; + var d: Vector(4, f32) = [4]f32{ -0.23, 0.42, -0.64, 0.9 }; + var y = @minimum(c, d); + try expect(mem.eql(f32, &@as([4]f32, y), &[4]f32{ -0.23, 0.4, -2.4, 0.9 })); + + var e: Vector(2, f32) = [2]f32{ 0, std.math.qnan_f32 }; + var f: Vector(2, f32) = [2]f32{ std.math.qnan_f32, 0 }; + var z = @maximum(e, f); + try expect(mem.eql(f32, &@as([2]f32, z), &[2]f32{ 0, 0 })); + } + }; + try S.doTheTest(); + comptime try S.doTheTest(); +} diff --git a/test/behavior/misc.zig b/test/behavior/misc.zig index 6fabbf487b..466be00bd3 100644 --- a/test/behavior/misc.zig +++ b/test/behavior/misc.zig @@ -5,94 +5,6 @@ const expectEqualStrings = std.testing.expectEqualStrings; const mem = std.mem; const builtin = @import("builtin"); -// normal comment - -/// this is a documentation comment -/// doc comment line 2 -fn emptyFunctionWithComments() void {} - -test "empty function with comments" { - emptyFunctionWithComments(); -} - -comptime { - @export(disabledExternFn, .{ .name = "disabledExternFn", .linkage = .Internal }); -} - -fn disabledExternFn() callconv(.C) void {} - -test "call disabled extern fn" { - disabledExternFn(); -} - -test "short circuit" { - try testShortCircuit(false, true); - comptime try testShortCircuit(false, true); -} - -fn testShortCircuit(f: bool, t: bool) !void { - var hit_1 = f; - var hit_2 = f; - var hit_3 = f; - var hit_4 = f; - - if (t or x: { - try expect(f); - break :x f; - }) { - hit_1 = t; - } - if (f or x: { - hit_2 = t; - break :x f; - }) { - try expect(f); - } - - if (t and x: { - hit_3 = t; - break :x f; - }) { - try expect(f); - } - if (f and x: { - try expect(f); - break :x f; - }) { - try expect(f); - } else { - hit_4 = t; - } - try expect(hit_1); - try expect(hit_2); - try expect(hit_3); - try expect(hit_4); -} - -test "truncate" { - try expect(testTruncate(0x10fd) == 0xfd); -} -fn testTruncate(x: u32) u8 { - return @truncate(u8, x); -} - -fn first4KeysOfHomeRow() []const u8 { - return "aoeu"; -} - -test "return string from function" { - try expect(mem.eql(u8, first4KeysOfHomeRow(), "aoeu")); -} - -const g1: i32 = 1233 + 1; -var g2: i32 = 0; - -test "global variables" { - try expect(g2 == 0); - g2 = g1; - try expect(g2 == 1234); -} - test "memcpy and memset intrinsics" { var foo: [20]u8 = undefined; var bar: [20]u8 = undefined; @@ -103,13 +15,6 @@ test "memcpy and memset intrinsics" { if (bar[11] != 'A') unreachable; } -test "builtin static eval" { - const x: i32 = comptime x: { - break :x 1 + 2 + 3; - }; - try expect(x == comptime 6); -} - test "slicing" { var array: [20]i32 = undefined; @@ -135,10 +40,6 @@ test "constant equal function pointers" { fn emptyFn() void {} -test "hex escape" { - try expect(mem.eql(u8, "\x68\x65\x6c\x6c\x6f", "hello")); -} - test "string concatenation" { try expect(mem.eql(u8, "OK" ++ " IT " ++ "WORKED", "OK IT WORKED")); } @@ -157,59 +58,7 @@ test "string escapes" { try expectEqualStrings("\u{1234}\u{069}\u{1}", "\xe1\x88\xb4\x69\x01"); } -test "multiline string" { - const s1 = - \\one - \\two) - \\three - ; - const s2 = "one\ntwo)\nthree"; - try expect(mem.eql(u8, s1, s2)); -} - -test "multiline string comments at start" { - const s1 = - //\\one - \\two) - \\three - ; - const s2 = "two)\nthree"; - try expect(mem.eql(u8, s1, s2)); -} - -test "multiline string comments at end" { - const s1 = - \\one - \\two) - //\\three - ; - const s2 = "one\ntwo)"; - try expect(mem.eql(u8, s1, s2)); -} - -test "multiline string comments in middle" { - const s1 = - \\one - //\\two) - \\three - ; - const s2 = "one\nthree"; - try expect(mem.eql(u8, s1, s2)); -} - -test "multiline string comments at multiple places" { - const s1 = - \\one - //\\two - \\three - //\\four - \\five - ; - const s2 = "one\nthree\nfive"; - try expect(mem.eql(u8, s1, s2)); -} - -test "multiline C string" { +test "multiline string literal is null terminated" { const s1 = \\one \\two) @@ -219,10 +68,6 @@ test "multiline C string" { try expect(std.cstr.cmp(s1, s2) == 0); } -test "type equality" { - try expect(*const u8 != *u8); -} - const global_a: i32 = 1234; const global_b: *const i32 = &global_a; const global_c: *const f32 = @ptrCast(*const f32, global_b); @@ -258,17 +103,6 @@ fn testCastUndefined(x: []const u8) void { _ = x; } -test "cast small unsigned to larger signed" { - try expect(castSmallUnsignedToLargerSigned1(200) == @as(i16, 200)); - try expect(castSmallUnsignedToLargerSigned2(9999) == @as(i64, 9999)); -} -fn castSmallUnsignedToLargerSigned1(x: u8) i16 { - return x; -} -fn castSmallUnsignedToLargerSigned2(x: u16) i64 { - return x; -} - test "implicit cast after unreachable" { try expect(outer() == 1234); } @@ -279,37 +113,6 @@ fn outer() i64 { return inner(); } -test "pointer dereferencing" { - var x = @as(i32, 3); - const y = &x; - - y.* += 1; - - try expect(x == 4); - try expect(y.* == 4); -} - -test "call result of if else expression" { - try expect(mem.eql(u8, f2(true), "a")); - try expect(mem.eql(u8, f2(false), "b")); -} -fn f2(x: bool) []const u8 { - return (if (x) fA else fB)(); -} -fn fA() []const u8 { - return "a"; -} -fn fB() []const u8 { - return "b"; -} - -test "const expression eval handling of variables" { - var x = true; - while (x) { - x = false; - } -} - test "constant enum initialization with differing sizes" { try test3_1(test3_foo); try test3_2(test3_bar); @@ -348,11 +151,6 @@ fn test3_2(f: Test3Foo) !void { } } -test "character literals" { - try expect('\'' == single_quote); -} -const single_quote = '\''; - test "take address of parameter" { try testTakeAddressOfParameter(12.34); } @@ -401,11 +199,6 @@ fn testPointerToVoidReturnType2() *const void { return &test_pointer_to_void_return_type_x; } -test "non const ptr to aliased type" { - const int = i32; - try expect(?*int == ?*i32); -} - test "array 2D const double ptr" { const rect_2d_vertexes = [_][1]f32{ [_]f32{1.0}, @@ -420,46 +213,6 @@ fn testArray2DConstDoublePtr(ptr: *const f32) !void { try expect(ptr2[1] == 2.0); } -const AStruct = struct { - x: i32, -}; -const AnEnum = enum { - One, - Two, -}; -const AUnionEnum = union(enum) { - One: i32, - Two: void, -}; -const AUnion = union { - One: void, - Two: void, -}; - -test "@typeName" { - const Struct = struct {}; - const Union = union { - unused: u8, - }; - const Enum = enum { - Unused, - }; - comptime { - try expect(mem.eql(u8, @typeName(i64), "i64")); - try expect(mem.eql(u8, @typeName(*usize), "*usize")); - // https://github.com/ziglang/zig/issues/675 - try expect(mem.eql(u8, "behavior.misc.TypeFromFn(u8)", @typeName(TypeFromFn(u8)))); - try expect(mem.eql(u8, @typeName(Struct), "Struct")); - try expect(mem.eql(u8, @typeName(Union), "Union")); - try expect(mem.eql(u8, @typeName(Enum), "Enum")); - } -} - -fn TypeFromFn(comptime T: type) type { - _ = T; - return struct {}; -} - test "double implicit cast in same expression" { var x = @as(i32, @as(u16, nine())); try expect(x == 9); @@ -535,15 +288,6 @@ test "function closes over local const" { try expect(x == 1); } -test "cold function" { - thisIsAColdFn(); - comptime thisIsAColdFn(); -} - -fn thisIsAColdFn() void { - @setCold(true); -} - const PackedStruct = packed struct { a: u8, b: u8, @@ -657,15 +401,6 @@ test "thread local variable" { try expect(S.t == 1235); } -test "unicode escape in character literal" { - var a: u24 = '\u{01f4a9}'; - try expect(a == 128169); -} - -test "unicode character in character literal" { - try expect('💩' == 128169); -} - test "result location zero sized array inside struct field implicit cast to slice" { const E = struct { entries: []u32, diff --git a/test/behavior/pointers.zig b/test/behavior/pointers.zig index bb95d3c219..4fcd78b1d6 100644 --- a/test/behavior/pointers.zig +++ b/test/behavior/pointers.zig @@ -15,22 +15,6 @@ fn testDerefPtr() !void { try expect(x == 1235); } -const Foo1 = struct { - x: void, -}; - -test "dereference pointer again" { - try testDerefPtrOneVal(); - comptime try testDerefPtrOneVal(); -} - -fn testDerefPtrOneVal() !void { - // Foo1 satisfies the OnePossibleValueYes criteria - const x = &Foo1{ .x = {} }; - const y = x.*; - try expect(@TypeOf(y.x) == void); -} - test "pointer arithmetic" { var ptr: [*]const u8 = "abcd"; @@ -60,288 +44,3 @@ test "double pointer parsing" { fn PtrOf(comptime T: type) type { return *T; } - -test "assigning integer to C pointer" { - var x: i32 = 0; - var ptr: [*c]u8 = 0; - var ptr2: [*c]u8 = x; - if (false) { - ptr; - ptr2; - } -} - -test "implicit cast single item pointer to C pointer and back" { - var y: u8 = 11; - var x: [*c]u8 = &y; - var z: *u8 = x; - z.* += 1; - try expect(y == 12); -} - -test "C pointer comparison and arithmetic" { - const S = struct { - fn doTheTest() !void { - var ptr1: [*c]u32 = 0; - var ptr2 = ptr1 + 10; - try expect(ptr1 == 0); - try expect(ptr1 >= 0); - try expect(ptr1 <= 0); - // expect(ptr1 < 1); - // expect(ptr1 < one); - // expect(1 > ptr1); - // expect(one > ptr1); - try expect(ptr1 < ptr2); - try expect(ptr2 > ptr1); - try expect(ptr2 >= 40); - try expect(ptr2 == 40); - try expect(ptr2 <= 40); - ptr2 -= 10; - try expect(ptr1 == ptr2); - } - }; - try S.doTheTest(); - comptime try S.doTheTest(); -} - -test "peer type resolution with C pointers" { - var ptr_one: *u8 = undefined; - var ptr_many: [*]u8 = undefined; - var ptr_c: [*c]u8 = undefined; - var t = true; - var x1 = if (t) ptr_one else ptr_c; - var x2 = if (t) ptr_many else ptr_c; - var x3 = if (t) ptr_c else ptr_one; - var x4 = if (t) ptr_c else ptr_many; - try expect(@TypeOf(x1) == [*c]u8); - try expect(@TypeOf(x2) == [*c]u8); - try expect(@TypeOf(x3) == [*c]u8); - try expect(@TypeOf(x4) == [*c]u8); -} - -test "implicit casting between C pointer and optional non-C pointer" { - var slice: []const u8 = "aoeu"; - const opt_many_ptr: ?[*]const u8 = slice.ptr; - var ptr_opt_many_ptr = &opt_many_ptr; - var c_ptr: [*c]const [*c]const u8 = ptr_opt_many_ptr; - try expect(c_ptr.*.* == 'a'); - ptr_opt_many_ptr = c_ptr; - try expect(ptr_opt_many_ptr.*.?[1] == 'o'); -} - -test "implicit cast error unions with non-optional to optional pointer" { - const S = struct { - fn doTheTest() !void { - try expectError(error.Fail, foo()); - } - fn foo() anyerror!?*u8 { - return bar() orelse error.Fail; - } - fn bar() ?*u8 { - return null; - } - }; - try S.doTheTest(); - comptime try S.doTheTest(); -} - -test "initialize const optional C pointer to null" { - const a: ?[*c]i32 = null; - try expect(a == null); - comptime try expect(a == null); -} - -test "compare equality of optional and non-optional pointer" { - const a = @intToPtr(*const usize, 0x12345678); - const b = @intToPtr(?*usize, 0x12345678); - try expect(a == b); - try expect(b == a); -} - -test "allowzero pointer and slice" { - var ptr = @intToPtr([*]allowzero i32, 0); - var opt_ptr: ?[*]allowzero i32 = ptr; - try expect(opt_ptr != null); - try expect(@ptrToInt(ptr) == 0); - var runtime_zero: usize = 0; - var slice = ptr[runtime_zero..10]; - comptime try expect(@TypeOf(slice) == []allowzero i32); - try expect(@ptrToInt(&slice[5]) == 20); - - comptime try expect(@typeInfo(@TypeOf(ptr)).Pointer.is_allowzero); - comptime try expect(@typeInfo(@TypeOf(slice)).Pointer.is_allowzero); -} - -test "assign null directly to C pointer and test null equality" { - var x: [*c]i32 = null; - try expect(x == null); - try expect(null == x); - try expect(!(x != null)); - try expect(!(null != x)); - if (x) |same_x| { - _ = same_x; - @panic("fail"); - } - var otherx: i32 = undefined; - try expect((x orelse &otherx) == &otherx); - - const y: [*c]i32 = null; - comptime try expect(y == null); - comptime try expect(null == y); - comptime try expect(!(y != null)); - comptime try expect(!(null != y)); - if (y) |same_y| { - _ = same_y; - @panic("fail"); - } - const othery: i32 = undefined; - comptime try expect((y orelse &othery) == &othery); - - var n: i32 = 1234; - var x1: [*c]i32 = &n; - try expect(!(x1 == null)); - try expect(!(null == x1)); - try expect(x1 != null); - try expect(null != x1); - try expect(x1.?.* == 1234); - if (x1) |same_x1| { - try expect(same_x1.* == 1234); - } else { - @panic("fail"); - } - try expect((x1 orelse &otherx) == x1); - - const nc: i32 = 1234; - const y1: [*c]const i32 = &nc; - comptime try expect(!(y1 == null)); - comptime try expect(!(null == y1)); - comptime try expect(y1 != null); - comptime try expect(null != y1); - comptime try expect(y1.?.* == 1234); - if (y1) |same_y1| { - try expect(same_y1.* == 1234); - } else { - @compileError("fail"); - } - comptime try expect((y1 orelse &othery) == y1); -} - -test "null terminated pointer" { - const S = struct { - fn doTheTest() !void { - var array_with_zero = [_:0]u8{ 'h', 'e', 'l', 'l', 'o' }; - var zero_ptr: [*:0]const u8 = @ptrCast([*:0]const u8, &array_with_zero); - var no_zero_ptr: [*]const u8 = zero_ptr; - var zero_ptr_again = @ptrCast([*:0]const u8, no_zero_ptr); - try expect(std.mem.eql(u8, std.mem.spanZ(zero_ptr_again), "hello")); - } - }; - try S.doTheTest(); - comptime try S.doTheTest(); -} - -test "allow any sentinel" { - const S = struct { - fn doTheTest() !void { - var array = [_:std.math.minInt(i32)]i32{ 1, 2, 3, 4 }; - var ptr: [*:std.math.minInt(i32)]i32 = &array; - try expect(ptr[4] == std.math.minInt(i32)); - } - }; - try S.doTheTest(); - comptime try S.doTheTest(); -} - -test "pointer sentinel with enums" { - const S = struct { - const Number = enum { - one, - two, - sentinel, - }; - - fn doTheTest() !void { - var ptr: [*:.sentinel]const Number = &[_:.sentinel]Number{ .one, .two, .two, .one }; - try expect(ptr[4] == .sentinel); // TODO this should be comptime try expect, see #3731 - } - }; - try S.doTheTest(); - comptime try S.doTheTest(); -} - -test "pointer sentinel with optional element" { - const S = struct { - fn doTheTest() !void { - var ptr: [*:null]const ?i32 = &[_:null]?i32{ 1, 2, 3, 4 }; - try expect(ptr[4] == null); // TODO this should be comptime try expect, see #3731 - } - }; - try S.doTheTest(); - comptime try S.doTheTest(); -} - -test "pointer sentinel with +inf" { - const S = struct { - fn doTheTest() !void { - const inf = std.math.inf_f32; - var ptr: [*:inf]const f32 = &[_:inf]f32{ 1.1, 2.2, 3.3, 4.4 }; - try expect(ptr[4] == inf); // TODO this should be comptime try expect, see #3731 - } - }; - try S.doTheTest(); - comptime try S.doTheTest(); -} - -test "pointer to array at fixed address" { - const array = @intToPtr(*volatile [1]u32, 0x10); - // Silly check just to reference `array` - try expect(@ptrToInt(&array[0]) == 0x10); -} - -test "pointer arithmetic affects the alignment" { - { - var ptr: [*]align(8) u32 = undefined; - var x: usize = 1; - - try expect(@typeInfo(@TypeOf(ptr)).Pointer.alignment == 8); - const ptr1 = ptr + 1; // 1 * 4 = 4 -> lcd(4,8) = 4 - try expect(@typeInfo(@TypeOf(ptr1)).Pointer.alignment == 4); - const ptr2 = ptr + 4; // 4 * 4 = 16 -> lcd(16,8) = 8 - try expect(@typeInfo(@TypeOf(ptr2)).Pointer.alignment == 8); - const ptr3 = ptr + 0; // no-op - try expect(@typeInfo(@TypeOf(ptr3)).Pointer.alignment == 8); - const ptr4 = ptr + x; // runtime-known addend - try expect(@typeInfo(@TypeOf(ptr4)).Pointer.alignment == 4); - } - { - var ptr: [*]align(8) [3]u8 = undefined; - var x: usize = 1; - - const ptr1 = ptr + 17; // 3 * 17 = 51 - try expect(@typeInfo(@TypeOf(ptr1)).Pointer.alignment == 1); - const ptr2 = ptr + x; // runtime-known addend - try expect(@typeInfo(@TypeOf(ptr2)).Pointer.alignment == 1); - const ptr3 = ptr + 8; // 3 * 8 = 24 -> lcd(8,24) = 8 - try expect(@typeInfo(@TypeOf(ptr3)).Pointer.alignment == 8); - const ptr4 = ptr + 4; // 3 * 4 = 12 -> lcd(8,12) = 4 - try expect(@typeInfo(@TypeOf(ptr4)).Pointer.alignment == 4); - } -} - -test "@ptrToInt on null optional at comptime" { - { - const pointer = @intToPtr(?*u8, 0x000); - const x = @ptrToInt(pointer); - _ = x; - comptime try expect(0 == @ptrToInt(pointer)); - } - { - const pointer = @intToPtr(?*u8, 0xf00); - comptime try expect(0xf00 == @ptrToInt(pointer)); - } -} - -test "indexing array with sentinel returns correct type" { - var s: [:0]const u8 = "abc"; - try testing.expectEqualSlices(u8, "*const u8", @typeName(@TypeOf(&s[0]))); -} diff --git a/test/behavior/pointers_stage1.zig b/test/behavior/pointers_stage1.zig new file mode 100644 index 0000000000..aea123a5c3 --- /dev/null +++ b/test/behavior/pointers_stage1.zig @@ -0,0 +1,305 @@ +const std = @import("std"); +const testing = std.testing; +const expect = testing.expect; +const expectError = testing.expectError; + +const Foo1 = struct { + x: void, +}; + +test "dereference pointer again" { + try testDerefPtrOneVal(); + comptime try testDerefPtrOneVal(); +} + +fn testDerefPtrOneVal() !void { + // Foo1 satisfies the OnePossibleValueYes criteria + const x = &Foo1{ .x = {} }; + const y = x.*; + try expect(@TypeOf(y.x) == void); +} + +test "assigning integer to C pointer" { + var x: i32 = 0; + var ptr: [*c]u8 = 0; + var ptr2: [*c]u8 = x; + if (false) { + ptr; + ptr2; + } +} + +test "implicit cast single item pointer to C pointer and back" { + var y: u8 = 11; + var x: [*c]u8 = &y; + var z: *u8 = x; + z.* += 1; + try expect(y == 12); +} + +test "C pointer comparison and arithmetic" { + const S = struct { + fn doTheTest() !void { + var ptr1: [*c]u32 = 0; + var ptr2 = ptr1 + 10; + try expect(ptr1 == 0); + try expect(ptr1 >= 0); + try expect(ptr1 <= 0); + // expect(ptr1 < 1); + // expect(ptr1 < one); + // expect(1 > ptr1); + // expect(one > ptr1); + try expect(ptr1 < ptr2); + try expect(ptr2 > ptr1); + try expect(ptr2 >= 40); + try expect(ptr2 == 40); + try expect(ptr2 <= 40); + ptr2 -= 10; + try expect(ptr1 == ptr2); + } + }; + try S.doTheTest(); + comptime try S.doTheTest(); +} + +test "peer type resolution with C pointers" { + var ptr_one: *u8 = undefined; + var ptr_many: [*]u8 = undefined; + var ptr_c: [*c]u8 = undefined; + var t = true; + var x1 = if (t) ptr_one else ptr_c; + var x2 = if (t) ptr_many else ptr_c; + var x3 = if (t) ptr_c else ptr_one; + var x4 = if (t) ptr_c else ptr_many; + try expect(@TypeOf(x1) == [*c]u8); + try expect(@TypeOf(x2) == [*c]u8); + try expect(@TypeOf(x3) == [*c]u8); + try expect(@TypeOf(x4) == [*c]u8); +} + +test "implicit casting between C pointer and optional non-C pointer" { + var slice: []const u8 = "aoeu"; + const opt_many_ptr: ?[*]const u8 = slice.ptr; + var ptr_opt_many_ptr = &opt_many_ptr; + var c_ptr: [*c]const [*c]const u8 = ptr_opt_many_ptr; + try expect(c_ptr.*.* == 'a'); + ptr_opt_many_ptr = c_ptr; + try expect(ptr_opt_many_ptr.*.?[1] == 'o'); +} + +test "implicit cast error unions with non-optional to optional pointer" { + const S = struct { + fn doTheTest() !void { + try expectError(error.Fail, foo()); + } + fn foo() anyerror!?*u8 { + return bar() orelse error.Fail; + } + fn bar() ?*u8 { + return null; + } + }; + try S.doTheTest(); + comptime try S.doTheTest(); +} + +test "initialize const optional C pointer to null" { + const a: ?[*c]i32 = null; + try expect(a == null); + comptime try expect(a == null); +} + +test "compare equality of optional and non-optional pointer" { + const a = @intToPtr(*const usize, 0x12345678); + const b = @intToPtr(?*usize, 0x12345678); + try expect(a == b); + try expect(b == a); +} + +test "allowzero pointer and slice" { + var ptr = @intToPtr([*]allowzero i32, 0); + var opt_ptr: ?[*]allowzero i32 = ptr; + try expect(opt_ptr != null); + try expect(@ptrToInt(ptr) == 0); + var runtime_zero: usize = 0; + var slice = ptr[runtime_zero..10]; + comptime try expect(@TypeOf(slice) == []allowzero i32); + try expect(@ptrToInt(&slice[5]) == 20); + + comptime try expect(@typeInfo(@TypeOf(ptr)).Pointer.is_allowzero); + comptime try expect(@typeInfo(@TypeOf(slice)).Pointer.is_allowzero); +} + +test "assign null directly to C pointer and test null equality" { + var x: [*c]i32 = null; + try expect(x == null); + try expect(null == x); + try expect(!(x != null)); + try expect(!(null != x)); + if (x) |same_x| { + _ = same_x; + @panic("fail"); + } + var otherx: i32 = undefined; + try expect((x orelse &otherx) == &otherx); + + const y: [*c]i32 = null; + comptime try expect(y == null); + comptime try expect(null == y); + comptime try expect(!(y != null)); + comptime try expect(!(null != y)); + if (y) |same_y| { + _ = same_y; + @panic("fail"); + } + const othery: i32 = undefined; + comptime try expect((y orelse &othery) == &othery); + + var n: i32 = 1234; + var x1: [*c]i32 = &n; + try expect(!(x1 == null)); + try expect(!(null == x1)); + try expect(x1 != null); + try expect(null != x1); + try expect(x1.?.* == 1234); + if (x1) |same_x1| { + try expect(same_x1.* == 1234); + } else { + @panic("fail"); + } + try expect((x1 orelse &otherx) == x1); + + const nc: i32 = 1234; + const y1: [*c]const i32 = &nc; + comptime try expect(!(y1 == null)); + comptime try expect(!(null == y1)); + comptime try expect(y1 != null); + comptime try expect(null != y1); + comptime try expect(y1.?.* == 1234); + if (y1) |same_y1| { + try expect(same_y1.* == 1234); + } else { + @compileError("fail"); + } + comptime try expect((y1 orelse &othery) == y1); +} + +test "null terminated pointer" { + const S = struct { + fn doTheTest() !void { + var array_with_zero = [_:0]u8{ 'h', 'e', 'l', 'l', 'o' }; + var zero_ptr: [*:0]const u8 = @ptrCast([*:0]const u8, &array_with_zero); + var no_zero_ptr: [*]const u8 = zero_ptr; + var zero_ptr_again = @ptrCast([*:0]const u8, no_zero_ptr); + try expect(std.mem.eql(u8, std.mem.spanZ(zero_ptr_again), "hello")); + } + }; + try S.doTheTest(); + comptime try S.doTheTest(); +} + +test "allow any sentinel" { + const S = struct { + fn doTheTest() !void { + var array = [_:std.math.minInt(i32)]i32{ 1, 2, 3, 4 }; + var ptr: [*:std.math.minInt(i32)]i32 = &array; + try expect(ptr[4] == std.math.minInt(i32)); + } + }; + try S.doTheTest(); + comptime try S.doTheTest(); +} + +test "pointer sentinel with enums" { + const S = struct { + const Number = enum { + one, + two, + sentinel, + }; + + fn doTheTest() !void { + var ptr: [*:.sentinel]const Number = &[_:.sentinel]Number{ .one, .two, .two, .one }; + try expect(ptr[4] == .sentinel); // TODO this should be comptime try expect, see #3731 + } + }; + try S.doTheTest(); + comptime try S.doTheTest(); +} + +test "pointer sentinel with optional element" { + const S = struct { + fn doTheTest() !void { + var ptr: [*:null]const ?i32 = &[_:null]?i32{ 1, 2, 3, 4 }; + try expect(ptr[4] == null); // TODO this should be comptime try expect, see #3731 + } + }; + try S.doTheTest(); + comptime try S.doTheTest(); +} + +test "pointer sentinel with +inf" { + const S = struct { + fn doTheTest() !void { + const inf = std.math.inf_f32; + var ptr: [*:inf]const f32 = &[_:inf]f32{ 1.1, 2.2, 3.3, 4.4 }; + try expect(ptr[4] == inf); // TODO this should be comptime try expect, see #3731 + } + }; + try S.doTheTest(); + comptime try S.doTheTest(); +} + +test "pointer to array at fixed address" { + const array = @intToPtr(*volatile [1]u32, 0x10); + // Silly check just to reference `array` + try expect(@ptrToInt(&array[0]) == 0x10); +} + +test "pointer arithmetic affects the alignment" { + { + var ptr: [*]align(8) u32 = undefined; + var x: usize = 1; + + try expect(@typeInfo(@TypeOf(ptr)).Pointer.alignment == 8); + const ptr1 = ptr + 1; // 1 * 4 = 4 -> lcd(4,8) = 4 + try expect(@typeInfo(@TypeOf(ptr1)).Pointer.alignment == 4); + const ptr2 = ptr + 4; // 4 * 4 = 16 -> lcd(16,8) = 8 + try expect(@typeInfo(@TypeOf(ptr2)).Pointer.alignment == 8); + const ptr3 = ptr + 0; // no-op + try expect(@typeInfo(@TypeOf(ptr3)).Pointer.alignment == 8); + const ptr4 = ptr + x; // runtime-known addend + try expect(@typeInfo(@TypeOf(ptr4)).Pointer.alignment == 4); + } + { + var ptr: [*]align(8) [3]u8 = undefined; + var x: usize = 1; + + const ptr1 = ptr + 17; // 3 * 17 = 51 + try expect(@typeInfo(@TypeOf(ptr1)).Pointer.alignment == 1); + const ptr2 = ptr + x; // runtime-known addend + try expect(@typeInfo(@TypeOf(ptr2)).Pointer.alignment == 1); + const ptr3 = ptr + 8; // 3 * 8 = 24 -> lcd(8,24) = 8 + try expect(@typeInfo(@TypeOf(ptr3)).Pointer.alignment == 8); + const ptr4 = ptr + 4; // 3 * 4 = 12 -> lcd(8,12) = 4 + try expect(@typeInfo(@TypeOf(ptr4)).Pointer.alignment == 4); + } +} + +test "@ptrToInt on null optional at comptime" { + { + const pointer = @intToPtr(?*u8, 0x000); + const x = @ptrToInt(pointer); + _ = x; + comptime try expect(0 == @ptrToInt(pointer)); + } + { + const pointer = @intToPtr(?*u8, 0xf00); + comptime try expect(0xf00 == @ptrToInt(pointer)); + } +} + +test "indexing array with sentinel returns correct type" { + var s: [:0]const u8 = "abc"; + try testing.expectEqualSlices(u8, "*const u8", @typeName(@TypeOf(&s[0]))); +} diff --git a/test/behavior/select.zig b/test/behavior/select.zig new file mode 100644 index 0000000000..5c69094413 --- /dev/null +++ b/test/behavior/select.zig @@ -0,0 +1,25 @@ +const std = @import("std"); +const builtin = @import("builtin"); +const mem = std.mem; +const expect = std.testing.expect; +const Vector = std.meta.Vector; + +test "@select" { + const S = struct { + fn doTheTest() !void { + var a: Vector(4, bool) = [4]bool{ true, false, true, false }; + var b: Vector(4, i32) = [4]i32{ -1, 4, 999, -31 }; + var c: Vector(4, i32) = [4]i32{ -5, 1, 0, 1234 }; + var abc = @select(i32, a, b, c); + try expect(mem.eql(i32, &@as([4]i32, abc), &[4]i32{ -1, 1, 999, 1234 })); + + var x: Vector(4, bool) = [4]bool{ false, false, false, true }; + var y: Vector(4, f32) = [4]f32{ 0.001, 33.4, 836, -3381.233 }; + var z: Vector(4, f32) = [4]f32{ 0.0, 312.1, -145.9, 9993.55 }; + var xyz = @select(f32, x, y, z); + try expect(mem.eql(f32, &@as([4]f32, xyz), &[4]f32{ 0.0, 312.1, -145.9, -3381.233 })); + } + }; + try S.doTheTest(); + comptime try S.doTheTest(); +} diff --git a/test/behavior/translate_c_macros.h b/test/behavior/translate_c_macros.h index 6f458684c7..bff4cdfe23 100644 --- a/test/behavior/translate_c_macros.h +++ b/test/behavior/translate_c_macros.h @@ -18,3 +18,15 @@ struct Foo { #define SIZE_OF_FOO sizeof(struct Foo) #define MAP_FAILED ((void *) -1) + +#define IGNORE_ME_1(x) ((void)(x)) +#define IGNORE_ME_2(x) ((const void)(x)) +#define IGNORE_ME_3(x) ((volatile void)(x)) +#define IGNORE_ME_4(x) ((const volatile void)(x)) +#define IGNORE_ME_5(x) ((volatile const void)(x)) + +#define IGNORE_ME_6(x) (void)(x) +#define IGNORE_ME_7(x) (const void)(x) +#define IGNORE_ME_8(x) (volatile void)(x) +#define IGNORE_ME_9(x) (const volatile void)(x) +#define IGNORE_ME_10(x) (volatile const void)(x) diff --git a/test/behavior/translate_c_macros.zig b/test/behavior/translate_c_macros.zig index 8de06ae8ea..0daf4cec90 100644 --- a/test/behavior/translate_c_macros.zig +++ b/test/behavior/translate_c_macros.zig @@ -24,3 +24,16 @@ test "reference to a struct type" { test "cast negative integer to pointer" { try expectEqual(@intToPtr(?*c_void, @bitCast(usize, @as(isize, -1))), h.MAP_FAILED); } + +test "casting to void with a macro" { + h.IGNORE_ME_1(42); + h.IGNORE_ME_2(42); + h.IGNORE_ME_3(42); + h.IGNORE_ME_4(42); + h.IGNORE_ME_5(42); + h.IGNORE_ME_6(42); + h.IGNORE_ME_7(42); + h.IGNORE_ME_8(42); + h.IGNORE_ME_9(42); + h.IGNORE_ME_10(42); +} diff --git a/test/behavior/typename.zig b/test/behavior/typename.zig index bf8464244b..4d87e0030c 100644 --- a/test/behavior/typename.zig +++ b/test/behavior/typename.zig @@ -2,6 +2,113 @@ const std = @import("std"); const expect = std.testing.expect; const expectEqualSlices = std.testing.expectEqualSlices; -test "slice" { - try expectEqualSlices(u8, "[]u8", @typeName([]u8)); +// Most tests here can be comptime but use runtime so that a stacktrace +// can show failure location. +// +// Note certain results of `@typeName()` expect `behavior.zig` to be the +// root file. Running a test against this file as root will result in +// failures. + +// CAUTION: this test is source-location sensitive. +test "anon fn param - source-location sensitive" { + // https://github.com/ziglang/zig/issues/9339 + try expectEqualSlices(u8, @typeName(TypeFromFn(struct {})), "behavior.typename.TypeFromFn(behavior.typename.struct:15:52)"); + try expectEqualSlices(u8, @typeName(TypeFromFn(union { unused: u8 })), "behavior.typename.TypeFromFn(behavior.typename.union:16:52)"); + try expectEqualSlices(u8, @typeName(TypeFromFn(enum { unused })), "behavior.typename.TypeFromFn(behavior.typename.enum:17:52)"); + + try expectEqualSlices( + u8, + @typeName(TypeFromFn3(struct {}, union { unused: u8 }, enum { unused })), + "behavior.typename.TypeFromFn3(behavior.typename.struct:21:31,behavior.typename.union:21:42,behavior.typename.enum:21:64)", + ); +} + +// CAUTION: this test is source-location sensitive. +test "anon field init" { + const Foo = .{ + .T1 = struct {}, + .T2 = union { unused: u8 }, + .T3 = enum { unused }, + }; + + try expectEqualSlices(u8, @typeName(Foo.T1), "behavior.typename.struct:29:15"); + try expectEqualSlices(u8, @typeName(Foo.T2), "behavior.typename.union:30:15"); + try expectEqualSlices(u8, @typeName(Foo.T3), "behavior.typename.enum:31:15"); +} + +test "basic" { + try expectEqualSlices(u8, @typeName(i64), "i64"); + try expectEqualSlices(u8, @typeName(*usize), "*usize"); + try expectEqualSlices(u8, @typeName([]u8), "[]u8"); +} + +test "top level decl" { + try expectEqualSlices(u8, @typeName(A_Struct), "A_Struct"); + try expectEqualSlices(u8, @typeName(A_Union), "A_Union"); + try expectEqualSlices(u8, @typeName(A_Enum), "A_Enum"); + + // regular fn, without error + try expectEqualSlices(u8, @typeName(@TypeOf(regular)), "fn() void"); + // regular fn inside struct, with error + try expectEqualSlices(u8, @typeName(@TypeOf(B.doTest)), "fn() @typeInfo(@typeInfo(@TypeOf(behavior.typename.B.doTest)).Fn.return_type.?).ErrorUnion.error_set!void"); + // generic fn + try expectEqualSlices(u8, @typeName(@TypeOf(TypeFromFn)), "fn(type) anytype"); +} + +const A_Struct = struct {}; +const A_Union = union { + unused: u8, +}; +const A_Enum = enum { + unused, +}; + +fn regular() void {} + +test "fn body decl" { + try B.doTest(); +} + +const B = struct { + fn doTest() !void { + const B_Struct = struct {}; + const B_Union = union { + unused: u8, + }; + const B_Enum = enum { + unused, + }; + + try expectEqualSlices(u8, @typeName(B_Struct), "B_Struct"); + try expectEqualSlices(u8, @typeName(B_Union), "B_Union"); + try expectEqualSlices(u8, @typeName(B_Enum), "B_Enum"); + } +}; + +test "fn param" { + // https://github.com/ziglang/zig/issues/675 + try expectEqualSlices(u8, @typeName(TypeFromFn(u8)), "behavior.typename.TypeFromFn(u8)"); + try expectEqualSlices(u8, @typeName(TypeFromFn(A_Struct)), "behavior.typename.TypeFromFn(behavior.typename.A_Struct)"); + try expectEqualSlices(u8, @typeName(TypeFromFn(A_Union)), "behavior.typename.TypeFromFn(behavior.typename.A_Union)"); + try expectEqualSlices(u8, @typeName(TypeFromFn(A_Enum)), "behavior.typename.TypeFromFn(behavior.typename.A_Enum)"); + + try expectEqualSlices(u8, @typeName(TypeFromFn2(u8, bool)), "behavior.typename.TypeFromFn2(u8,bool)"); +} + +fn TypeFromFn(comptime T: type) type { + _ = T; + return struct {}; +} + +fn TypeFromFn2(comptime T1: type, comptime T2: type) type { + _ = T1; + _ = T2; + return struct {}; +} + +fn TypeFromFn3(comptime T1: type, comptime T2: type, comptime T3: type) type { + _ = T1; + _ = T2; + _ = T3; + return struct {}; } diff --git a/test/behavior/widening.zig b/test/behavior/widening.zig index dfa70ac4b2..19abf767b8 100644 --- a/test/behavior/widening.zig +++ b/test/behavior/widening.zig @@ -37,3 +37,14 @@ test "float widening f16 to f128" { var y: f128 = x; try expect(x == y); } + +test "cast small unsigned to larger signed" { + try expect(castSmallUnsignedToLargerSigned1(200) == @as(i16, 200)); + try expect(castSmallUnsignedToLargerSigned2(9999) == @as(i64, 9999)); +} +fn castSmallUnsignedToLargerSigned1(x: u8) i16 { + return x; +} +fn castSmallUnsignedToLargerSigned2(x: u16) i64 { + return x; +} diff --git a/test/cases.zig b/test/cases.zig index 39d6128e8c..6510329238 100644 --- a/test/cases.zig +++ b/test/cases.zig @@ -1182,10 +1182,11 @@ pub fn addCases(ctx: *TestContext) !void { var case = ctx.obj("extern variable has no type", linux_x64); case.addError( \\comptime { - \\ _ = foo; + \\ const x = foo + foo; + \\ _ = x; \\} \\extern var foo: i32; - , &[_][]const u8{":2:9: error: unable to resolve comptime value"}); + , &[_][]const u8{":2:15: error: unable to resolve comptime value"}); case.addError( \\export fn entry() void { \\ _ = foo; @@ -1571,7 +1572,7 @@ pub fn addCases(ctx: *TestContext) !void { \\ const x = asm volatile ("syscall" \\ : [o] "{rax}" (-> number) \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (code) + \\ [arg1] "{rdi}" (60) \\ : "rcx", "r11", "memory" \\ ); \\ _ = x; diff --git a/test/run_translated_c.zig b/test/run_translated_c.zig index 4953896636..2e579b06c7 100644 --- a/test/run_translated_c.zig +++ b/test/run_translated_c.zig @@ -1243,7 +1243,7 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void { \\} , ""); - // See __builtin_alloca_with_align comment in std.c.builtins + // See __builtin_alloca_with_align comment in std.zig.c_builtins cases.add("use of unimplemented builtin in unused function does not prevent compilation", \\#include \\void unused() { @@ -1659,4 +1659,94 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void { \\ return 0; \\} , ""); + + cases.add("__builtin_choose_expr (unchosen expression is not evaluated)", + \\#include + \\int main(void) { + \\ int x = 0.0; + \\ int y = 0.0; + \\ int res; + \\ res = __builtin_choose_expr(1, 1, x / y); + \\ if (res != 1) abort(); + \\ res = __builtin_choose_expr(0, x / y, 2); + \\ if (res != 2) abort(); + \\ return 0; + \\} + , ""); + + // TODO: add isnan check for long double once bitfield support is added + // (needed for x86_64-windows-gnu) + // TODO: add isinf check for long double once std.math.isInf supports c_longdouble + cases.add("NAN and INFINITY", + \\#include + \\#include + \\#include + \\union uf { uint32_t u; float f; }; + \\#define CHECK_NAN(STR, VAL) { \ + \\ union uf unpack = {.f = __builtin_nanf(STR)}; \ + \\ if (!isnan(unpack.f)) abort(); \ + \\ if (unpack.u != VAL) abort(); \ + \\} + \\int main(void) { + \\ float f_nan = NAN; + \\ if (!isnan(f_nan)) abort(); + \\ double d_nan = NAN; + \\ if (!isnan(d_nan)) abort(); + \\ CHECK_NAN("0", 0x7FC00000); + \\ CHECK_NAN("", 0x7FC00000); + \\ CHECK_NAN("1", 0x7FC00001); + \\ CHECK_NAN("0x7FC00000", 0x7FC00000); + \\ CHECK_NAN("0x7FC0000F", 0x7FC0000F); + \\ CHECK_NAN("0x7FC000F0", 0x7FC000F0); + \\ CHECK_NAN("0x7FC00F00", 0x7FC00F00); + \\ CHECK_NAN("0x7FC0F000", 0x7FC0F000); + \\ CHECK_NAN("0x7FCF0000", 0x7FCF0000); + \\ CHECK_NAN("0xFFFFFFFF", 0x7FFFFFFF); + \\ float f_inf = INFINITY; + \\ if (!isinf(f_inf)) abort(); + \\ double d_inf = INFINITY; + \\ if (!isinf(d_inf)) abort(); + \\ return 0; + \\} + , ""); + + cases.add("signed array subscript. Issue #8556", + \\#include + \\#include + \\#define TEST_NEGATIVE(type) { type x = -1; if (ptr[x] != 42) abort(); } + \\#define TEST_UNSIGNED(type) { type x = 2; if (arr[x] != 42) abort(); } + \\int main(void) { + \\ int arr[] = {40, 41, 42, 43}; + \\ int *ptr = arr + 3; + \\ if (ptr[-1] != 42) abort(); + \\ TEST_NEGATIVE(int); + \\ TEST_NEGATIVE(long); + \\ TEST_NEGATIVE(long long); + \\ TEST_NEGATIVE(int64_t); + \\ TEST_NEGATIVE(__int128); + \\ TEST_UNSIGNED(unsigned); + \\ TEST_UNSIGNED(unsigned long); + \\ TEST_UNSIGNED(unsigned long long); + \\ TEST_UNSIGNED(uint64_t); + \\ TEST_UNSIGNED(size_t); + \\ TEST_UNSIGNED(unsigned __int128); + \\ return 0; + \\} + , ""); + + cases.add("Ensure side-effects only evaluated once for signed array indices", + \\#include + \\int main(void) { + \\ int foo[] = {1, 2, 3, 4}; + \\ int *p = foo; + \\ int idx = 1; + \\ if ((++p)[--idx] != 2) abort(); + \\ if (p != foo + 1) abort(); + \\ if (idx != 0) abort(); + \\ if ((p++)[idx++] != 2) abort(); + \\ if (p != foo + 2) abort(); + \\ if (idx != 1) abort(); + \\ return 0; + \\} + , ""); } diff --git a/test/stage1/c_abi/cfuncs.c b/test/stage1/c_abi/cfuncs.c index a3b8c9a8c6..0182462716 100644 --- a/test/stage1/c_abi/cfuncs.c +++ b/test/stage1/c_abi/cfuncs.c @@ -61,7 +61,20 @@ struct SmallStructInts { uint8_t c; uint8_t d; }; + void zig_small_struct_ints(struct SmallStructInts); +struct SmallStructInts zig_ret_small_struct_ints(); + +struct MedStructMixed { + uint32_t a; + float b; + float c; + uint32_t d; +}; + +void zig_med_struct_mixed(struct MedStructMixed); +struct MedStructMixed zig_ret_med_struct_mixed(); + struct SplitStructInts { uint64_t a; @@ -70,6 +83,14 @@ struct SplitStructInts { }; void zig_split_struct_ints(struct SplitStructInts); +struct SplitStructMixed { + uint64_t a; + uint8_t b; + float c; +}; +void zig_split_struct_mixed(struct SplitStructMixed); +struct SplitStructMixed zig_ret_split_struct_mixed(); + struct BigStruct zig_big_struct_both(struct BigStruct); typedef struct Vector3 { @@ -121,6 +142,16 @@ void run_c_tests(void) { zig_split_struct_ints(s); } + { + struct MedStructMixed s = {1234, 100.0f, 1337.0f}; + zig_med_struct_mixed(s); + } + + { + struct SplitStructMixed s = {1234, 100, 1337.0f}; + zig_split_struct_mixed(s); + } + { struct BigStruct s = {30, 31, 32, 33, 34}; struct BigStruct res = zig_big_struct_both(s); @@ -230,6 +261,44 @@ void c_small_struct_ints(struct SmallStructInts x) { assert_or_panic(x.b == 2); assert_or_panic(x.c == 3); assert_or_panic(x.d == 4); + + struct SmallStructInts y = zig_ret_small_struct_ints(); + + assert_or_panic(y.a == 1); + assert_or_panic(y.b == 2); + assert_or_panic(y.c == 3); + assert_or_panic(y.d == 4); +} + +struct SmallStructInts c_ret_small_struct_ints() { + struct SmallStructInts s = { + .a = 1, + .b = 2, + .c = 3, + .d = 4, + }; + return s; +} + +void c_med_struct_mixed(struct MedStructMixed x) { + assert_or_panic(x.a == 1234); + assert_or_panic(x.b == 100.0f); + assert_or_panic(x.c == 1337.0f); + + struct MedStructMixed y = zig_ret_med_struct_mixed(); + + assert_or_panic(y.a == 1234); + assert_or_panic(y.b == 100.0f); + assert_or_panic(y.c == 1337.0f); +} + +struct MedStructMixed c_ret_med_struct_mixed() { + struct MedStructMixed s = { + .a = 1234, + .b = 100.0, + .c = 1337.0, + }; + return s; } void c_split_struct_ints(struct SplitStructInts x) { @@ -238,6 +307,26 @@ void c_split_struct_ints(struct SplitStructInts x) { assert_or_panic(x.c == 1337); } +void c_split_struct_mixed(struct SplitStructMixed x) { + assert_or_panic(x.a == 1234); + assert_or_panic(x.b == 100); + assert_or_panic(x.c == 1337.0f); + struct SplitStructMixed y = zig_ret_split_struct_mixed(); + + assert_or_panic(y.a == 1234); + assert_or_panic(y.b == 100); + assert_or_panic(y.c == 1337.0f); +} + +struct SplitStructMixed c_ret_split_struct_mixed() { + struct SplitStructMixed s = { + .a = 1234, + .b = 100, + .c = 1337.0f, + }; + return s; +} + struct BigStruct c_big_struct_both(struct BigStruct x) { assert_or_panic(x.a == 1); assert_or_panic(x.b == 2); diff --git a/test/stage1/c_abi/main.zig b/test/stage1/c_abi/main.zig index ed5cad7c56..b8137334ec 100644 --- a/test/stage1/c_abi/main.zig +++ b/test/stage1/c_abi/main.zig @@ -1,4 +1,5 @@ const std = @import("std"); +const print = std.debug.print; const expect = std.testing.expect; extern fn run_c_tests() void; @@ -170,6 +171,34 @@ export fn zig_big_union(x: BigUnion) void { expect(x.a.e == 5) catch @panic("test failure"); } +const MedStructMixed = extern struct { + a: u32, + b: f32, + c: f32, + d: u32 = 0, +}; +extern fn c_med_struct_mixed(MedStructMixed) void; +extern fn c_ret_med_struct_mixed() MedStructMixed; + +test "C ABI medium struct of ints and floats" { + var s = MedStructMixed{ + .a = 1234, + .b = 100.0, + .c = 1337.0, + }; + c_med_struct_mixed(s); + var s2 = c_ret_med_struct_mixed(); + expect(s2.a == 1234) catch @panic("test failure"); + expect(s2.b == 100.0) catch @panic("test failure"); + expect(s2.c == 1337.0) catch @panic("test failure"); +} + +export fn zig_med_struct_mixed(x: MedStructMixed) void { + expect(x.a == 1234) catch @panic("test failure"); + expect(x.b == 100.0) catch @panic("test failure"); + expect(x.c == 1337.0) catch @panic("test failure"); +} + const SmallStructInts = extern struct { a: u8, b: u8, @@ -177,6 +206,7 @@ const SmallStructInts = extern struct { d: u8, }; extern fn c_small_struct_ints(SmallStructInts) void; +extern fn c_ret_small_struct_ints() SmallStructInts; test "C ABI small struct of ints" { var s = SmallStructInts{ @@ -186,6 +216,11 @@ test "C ABI small struct of ints" { .d = 4, }; c_small_struct_ints(s); + var s2 = c_ret_small_struct_ints(); + expect(s2.a == 1) catch @panic("test failure"); + expect(s2.b == 2) catch @panic("test failure"); + expect(s2.c == 3) catch @panic("test failure"); + expect(s2.d == 4) catch @panic("test failure"); } export fn zig_small_struct_ints(x: SmallStructInts) void { @@ -217,6 +252,33 @@ export fn zig_split_struct_ints(x: SplitStructInt) void { expect(x.c == 1337) catch @panic("test failure"); } +const SplitStructMixed = extern struct { + a: u64, + b: u8, + c: f32, +}; +extern fn c_split_struct_mixed(SplitStructMixed) void; +extern fn c_ret_split_struct_mixed() SplitStructMixed; + +test "C ABI split struct of ints and floats" { + var s = SplitStructMixed{ + .a = 1234, + .b = 100, + .c = 1337.0, + }; + c_split_struct_mixed(s); + var s2 = c_ret_split_struct_mixed(); + expect(s2.a == 1234) catch @panic("test failure"); + expect(s2.b == 100) catch @panic("test failure"); + expect(s2.c == 1337.0) catch @panic("test failure"); +} + +export fn zig_split_struct_mixed(x: SplitStructMixed) void { + expect(x.a == 1234) catch @panic("test failure"); + expect(x.b == 100) catch @panic("test failure"); + expect(x.c == 1337.0) catch @panic("test failure"); +} + extern fn c_big_struct_both(BigStruct) BigStruct; test "C ABI sret and byval together" { @@ -315,6 +377,31 @@ export fn zig_ret_i64() i64 { return -1; } +export fn zig_ret_small_struct_ints() SmallStructInts { + return .{ + .a = 1, + .b = 2, + .c = 3, + .d = 4, + }; +} + +export fn zig_ret_med_struct_mixed() MedStructMixed { + return .{ + .a = 1234, + .b = 100.0, + .c = 1337.0, + }; +} + +export fn zig_ret_split_struct_mixed() SplitStructMixed { + return .{ + .a = 1234, + .b = 100, + .c = 1337.0, + }; +} + extern fn c_ret_bool() bool; extern fn c_ret_u8() u8; extern fn c_ret_u16() u16; diff --git a/test/stage2/arm.zig b/test/stage2/arm.zig index 6b4f569757..103b058a54 100644 --- a/test/stage2/arm.zig +++ b/test/stage2/arm.zig @@ -299,6 +299,28 @@ pub fn addCases(ctx: *TestContext) !void { ); } + { + var case = ctx.exe("enums", linux_arm); + case.addCompareOutput( + \\const Number = enum { one, two, three }; + \\ + \\pub fn main() void { + \\ var x: Number = .one; + \\ var y = Number.two; + \\ var z = @intToEnum(Number, 2); + \\ assert(@enumToInt(x) == 0); + \\ assert(@enumToInt(y) == 1); + \\ assert(@enumToInt(z) == 2); + \\} + \\ + \\fn assert(ok: bool) void { + \\ if (!ok) unreachable; // assertion failure + \\} + , + "", + ); + } + { var case = ctx.exe("recursive fibonacci", linux_arm); case.addCompareOutput( diff --git a/test/stage2/cbe.zig b/test/stage2/cbe.zig index 6427e2e3b8..aa1022257b 100644 --- a/test/stage2/cbe.zig +++ b/test/stage2/cbe.zig @@ -49,7 +49,7 @@ pub fn addCases(ctx: *TestContext) !void { \\export fn foo() callconv(y) c_int { \\ return 0; \\} - \\var y: i32 = 1234; + \\var y: @import("std").builtin.CallingConvention = .C; , &.{ ":2:22: error: unable to resolve comptime value", ":5:26: error: unable to resolve comptime value", @@ -240,6 +240,10 @@ pub fn addCases(ctx: *TestContext) !void { if (host_supports_custom_stack_size) { var case = ctx.exeFromCompiledC("@setEvalBranchQuota", .{}); + // TODO when adding result location support to function calls, revisit this test + // case. It can go back to what it was before, with `y` being comptime known. + // Because the ret_ptr will passed in with the inline fn call, and there will + // only be 1 store to it, and it will be comptime known. case.addCompareOutput( \\pub export fn main() i32 { \\ @setEvalBranchQuota(1001); @@ -247,7 +251,7 @@ pub fn addCases(ctx: *TestContext) !void { \\ return y - 1; \\} \\ - \\fn rec(n: usize) callconv(.Inline) usize { + \\inline fn rec(n: i32) i32 { \\ if (n <= 1) return n; \\ return rec(n - 1); \\} diff --git a/test/stage2/wasm.zig b/test/stage2/wasm.zig index f746be99d2..ab400f0a53 100644 --- a/test/stage2/wasm.zig +++ b/test/stage2/wasm.zig @@ -113,6 +113,27 @@ pub fn addCases(ctx: *TestContext) !void { \\} , "25\n"); + case.addCompareOutput( + \\pub export fn _start() i32 { + \\ var i: i32 = 2147483647; + \\ return i +% 1; + \\} + , "-2147483648\n"); + + case.addCompareOutput( + \\pub export fn _start() i32 { + \\ var i: i4 = 7; + \\ return i +% 1; + \\} + , "0\n"); + + case.addCompareOutput( + \\pub export fn _start() u32 { + \\ var i: u8 = 255; + \\ return i +% 1; + \\} + , "0\n"); + case.addCompareOutput( \\pub export fn _start() u32 { \\ var i: u32 = 5; @@ -133,6 +154,27 @@ pub fn addCases(ctx: *TestContext) !void { \\} , "15\n"); + case.addCompareOutput( + \\pub export fn _start() i32 { + \\ var i: i32 = -2147483648; + \\ return i -% 1; + \\} + , "2147483647\n"); + + case.addCompareOutput( + \\pub export fn _start() i32 { + \\ var i: i7 = -64; + \\ return i -% 1; + \\} + , "63\n"); + + case.addCompareOutput( + \\pub export fn _start() u32 { + \\ var i: u4 = 0; + \\ return i -% 1; + \\} + , "15\n"); + case.addCompareOutput( \\pub export fn _start() u32 { \\ var i: u32 = 5; @@ -157,6 +199,27 @@ pub fn addCases(ctx: *TestContext) !void { \\} , "350\n"); + case.addCompareOutput( + \\pub export fn _start() i32 { + \\ var i: i32 = 2147483647; + \\ return i *% 2; + \\} + , "-2\n"); + + case.addCompareOutput( + \\pub export fn _start() u32 { + \\ var i: u3 = 3; + \\ return i *% 3; + \\} + , "1\n"); + + case.addCompareOutput( + \\pub export fn _start() i32 { + \\ var i: i4 = 3; + \\ return i *% 3; + \\} + , "1\n"); + case.addCompareOutput( \\pub export fn _start() u32 { \\ var i: u32 = 352; @@ -612,4 +675,69 @@ pub fn addCases(ctx: *TestContext) !void { \\} , "42\n"); } + + { + var case = ctx.exe("wasm integer widening", wasi); + + case.addCompareOutput( + \\pub export fn _start() u64 { + \\ var x: u32 = 5; + \\ return x; + \\} + , "5\n"); + } + + { + var case = ctx.exe("wasm optionals", wasi); + + case.addCompareOutput( + \\pub export fn _start() u32 { + \\ var x: ?u32 = 5; + \\ var y: u32 = 0; + \\ if (x) |val| { + \\ y = val; + \\ } + \\ return y; + \\} + , "5\n"); + + case.addCompareOutput( + \\pub export fn _start() u32 { + \\ var x: ?u32 = null; + \\ var y: u32 = 0; + \\ if (x) |val| { + \\ y = val; + \\ } + \\ return y; + \\} + , "0\n"); + + case.addCompareOutput( + \\pub export fn _start() u32 { + \\ var x: ?u32 = 5; + \\ return x.?; + \\} + , "5\n"); + + case.addCompareOutput( + \\pub export fn _start() u32 { + \\ var x: u32 = 5; + \\ var y: ?u32 = x; + \\ return y.?; + \\} + , "5\n"); + + case.addCompareOutput( + \\pub export fn _start() u32 { + \\ var val: ?u32 = 5; + \\ while (val) |*v| { + \\ v.* -= 1; + \\ if (v.* == 2) { + \\ val = null; + \\ } + \\ } + \\ return 0; + \\} + , "0\n"); + } } diff --git a/test/standalone.zig b/test/standalone.zig index a483097f4a..9a32701ddd 100644 --- a/test/standalone.zig +++ b/test/standalone.zig @@ -37,6 +37,8 @@ pub fn addCases(cases: *tests.StandaloneContext) void { if (std.Target.current.os.tag == .linux) { cases.addBuildFile("test/standalone/pie/build.zig", .{}); } + // Try to build and run an Objective-C executable. + cases.addBuildFile("test/standalone/objc/build.zig", .{ .build_modes = true, .requires_macos_sdk = true }); // Ensure the development tools are buildable. cases.add("tools/gen_spirv_spec.zig"); diff --git a/test/standalone/objc/Foo.h b/test/standalone/objc/Foo.h new file mode 100644 index 0000000000..05cb7df39b --- /dev/null +++ b/test/standalone/objc/Foo.h @@ -0,0 +1,7 @@ +#import + +@interface Foo : NSObject + +- (NSString *)name; + +@end diff --git a/test/standalone/objc/Foo.m b/test/standalone/objc/Foo.m new file mode 100644 index 0000000000..6fc9b1edf0 --- /dev/null +++ b/test/standalone/objc/Foo.m @@ -0,0 +1,11 @@ +#import "Foo.h" + +@implementation Foo + +- (NSString *)name +{ + NSString *str = [[NSString alloc] initWithFormat:@"Zig"]; + return str; +} + +@end diff --git a/test/standalone/objc/build.zig b/test/standalone/objc/build.zig new file mode 100644 index 0000000000..7fdec514e7 --- /dev/null +++ b/test/standalone/objc/build.zig @@ -0,0 +1,36 @@ +const std = @import("std"); +const Builder = std.build.Builder; +const CrossTarget = std.zig.CrossTarget; + +fn isRunnableTarget(t: CrossTarget) bool { + // TODO I think we might be able to run this on Linux via Darling. + // Add a check for that here, and return true if Darling is available. + if (t.isNative() and t.getOsTag() == .macos) + return true + else + return false; +} + +pub fn build(b: *Builder) void { + const mode = b.standardReleaseOptions(); + const target = b.standardTargetOptions(.{}); + + const test_step = b.step("test", "Test the program"); + + const exe = b.addExecutable("test", null); + b.default_step.dependOn(&exe.step); + exe.addIncludeDir("."); + exe.addCSourceFile("Foo.m", &[0][]const u8{}); + exe.addCSourceFile("test.m", &[0][]const u8{}); + exe.setBuildMode(mode); + exe.setTarget(target); + exe.linkLibC(); + // TODO when we figure out how to ship framework stubs for cross-compilation, + // populate paths to the sysroot here. + exe.linkFramework("Foundation"); + + if (isRunnableTarget(target)) { + const run_cmd = exe.run(); + test_step.dependOn(&run_cmd.step); + } +} diff --git a/test/standalone/objc/test.m b/test/standalone/objc/test.m new file mode 100644 index 0000000000..3c81316788 --- /dev/null +++ b/test/standalone/objc/test.m @@ -0,0 +1,12 @@ +#import "Foo.h" +#import + +int main(int argc, char *argv[]) +{ + @autoreleasepool { + Foo *foo = [[Foo alloc] init]; + NSString *result = [foo name]; + assert([result isEqualToString:@"Zig"]); + return 0; + } +} diff --git a/test/tests.zig b/test/tests.zig index d83701ff6a..a427bbefeb 100644 --- a/test/tests.zig +++ b/test/tests.zig @@ -391,7 +391,14 @@ pub fn addRuntimeSafetyTests(b: *build.Builder, test_filter: ?[]const u8, modes: return cases.step; } -pub fn addStandaloneTests(b: *build.Builder, test_filter: ?[]const u8, modes: []const Mode, skip_non_native: bool, target: std.zig.CrossTarget) *build.Step { +pub fn addStandaloneTests( + b: *build.Builder, + test_filter: ?[]const u8, + modes: []const Mode, + skip_non_native: bool, + enable_macos_sdk: bool, + target: std.zig.CrossTarget, +) *build.Step { const cases = b.allocator.create(StandaloneContext) catch unreachable; cases.* = StandaloneContext{ .b = b, @@ -400,6 +407,7 @@ pub fn addStandaloneTests(b: *build.Builder, test_filter: ?[]const u8, modes: [] .test_filter = test_filter, .modes = modes, .skip_non_native = skip_non_native, + .enable_macos_sdk = enable_macos_sdk, .target = target, }; @@ -768,7 +776,7 @@ pub const StackTracesContext = struct { var buf = ArrayList(u8).init(b.allocator); defer buf.deinit(); if (stderr.len != 0 and stderr[stderr.len - 1] == '\n') stderr = stderr[0 .. stderr.len - 1]; - var it = mem.split(stderr, "\n"); + var it = mem.split(u8, stderr, "\n"); process_lines: while (it.next()) |line| { if (line.len == 0) continue; @@ -839,6 +847,7 @@ pub const StandaloneContext = struct { test_filter: ?[]const u8, modes: []const Mode, skip_non_native: bool, + enable_macos_sdk: bool, target: std.zig.CrossTarget, pub fn addC(self: *StandaloneContext, root_src: []const u8) void { @@ -849,9 +858,15 @@ pub const StandaloneContext = struct { self.addAllArgs(root_src, false); } - pub fn addBuildFile(self: *StandaloneContext, build_file: []const u8, features: struct { build_modes: bool = false, cross_targets: bool = false }) void { + pub fn addBuildFile(self: *StandaloneContext, build_file: []const u8, features: struct { + build_modes: bool = false, + cross_targets: bool = false, + requires_macos_sdk: bool = false, + }) void { const b = self.b; + if (features.requires_macos_sdk and !self.enable_macos_sdk) return; + const annotated_case_name = b.fmt("build {s}", .{build_file}); if (self.test_filter) |filter| { if (mem.indexOf(u8, annotated_case_name, filter) == null) return; diff --git a/test/translate_c.zig b/test/translate_c.zig index 1ceaf15e5c..6ddc2107ee 100644 --- a/test/translate_c.zig +++ b/test/translate_c.zig @@ -3461,11 +3461,11 @@ pub fn addCases(cases: *tests.TranslateCContext) void { \\pub const MAY_NEED_PROMOTION_OCT = @import("std").zig.c_translation.promoteIntLiteral(c_int, 0o20000000000, .octal); }); - // See __builtin_alloca_with_align comment in std.c.builtins + // See __builtin_alloca_with_align comment in std.zig.c_builtins cases.add("demote un-implemented builtins", \\#define FOO(X) __builtin_alloca_with_align((X), 8) , &[_][]const u8{ - \\pub const FOO = @compileError("TODO implement function '__builtin_alloca_with_align' in std.c.builtins"); + \\pub const FOO = @compileError("TODO implement function '__builtin_alloca_with_align' in std.zig.c_builtins"); }); cases.add("null sentinel arrays when initialized from string literal. Issue #8256", @@ -3630,4 +3630,15 @@ pub fn addCases(cases: *tests.TranslateCContext) void { , &[_][]const u8{ \\pub const FOO = @import("std").zig.c_translation.Macros.U_SUFFIX; }); + + cases.add("Simple array access of pointer with non-negative integer constant", + \\void foo(int *p) { + \\ p[0]; + \\ p[1]; + \\} + , &[_][]const u8{ + \\_ = p[@intCast(c_uint, @as(c_int, 0))]; + , + \\_ = p[@intCast(c_uint, @as(c_int, 1))]; + }); } diff --git a/tools/update_glibc.zig b/tools/update_glibc.zig index ba12f6e0e6..0b25d97572 100644 --- a/tools/update_glibc.zig +++ b/tools/update_glibc.zig @@ -188,9 +188,9 @@ pub fn main() !void { std.debug.warn("unable to open {s}: {}\n", .{ abi_list_filename, err }); std.process.exit(1); }; - var lines_it = std.mem.tokenize(contents, "\n"); + var lines_it = std.mem.tokenize(u8, contents, "\n"); while (lines_it.next()) |line| { - var tok_it = std.mem.tokenize(line, " "); + var tok_it = std.mem.tokenize(u8, line, " "); const ver = tok_it.next().?; const name = tok_it.next().?; const category = tok_it.next().?; @@ -319,8 +319,8 @@ pub fn strCmpLessThan(context: void, a: []const u8, b: []const u8) bool { pub fn versionLessThan(context: void, a: []const u8, b: []const u8) bool { _ = context; const sep_chars = "GLIBC_."; - var a_tokens = std.mem.tokenize(a, sep_chars); - var b_tokens = std.mem.tokenize(b, sep_chars); + var a_tokens = std.mem.tokenize(u8, a, sep_chars); + var b_tokens = std.mem.tokenize(u8, b, sep_chars); while (true) { const a_next = a_tokens.next(); diff --git a/tools/update_spirv_features.zig b/tools/update_spirv_features.zig index 0de1c56934..69e8237f98 100644 --- a/tools/update_spirv_features.zig +++ b/tools/update_spirv_features.zig @@ -19,7 +19,7 @@ const Version = struct { minor: u32, fn parse(str: []const u8) !Version { - var it = std.mem.split(str, "."); + var it = std.mem.split(u8, str, "."); const major = it.next() orelse return error.InvalidVersion; const minor = it.next() orelse return error.InvalidVersion;