aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-06-06 13:02:16 +0100
committergingerBill <bill@gingerbill.org>2024-06-06 13:02:16 +0100
commitc4ef8e7f6ceb4e2ce5d4869931d8f82afc1eb44c (patch)
treeb7adc511b3c0bc88b17def7a334424baf8829f8c
parent155516b897450ec265cfb53b6e32db90f15544f5 (diff)
parent9b66b0c8e6a934a1dc4ab68cfc02652e7a26c179 (diff)
Merge branch 'master' of https://github.com/odin-lang/Odin
-rw-r--r--.github/workflows/ci.yml1
-rw-r--r--.github/workflows/nightly.yml31
-rw-r--r--base/runtime/core.odin15
-rw-r--r--base/runtime/default_allocators_general.odin2
-rw-r--r--base/runtime/entry_wasm.odin36
-rw-r--r--base/runtime/error_checks.odin4
-rw-r--r--base/runtime/heap_allocator_orca.odin29
-rw-r--r--base/runtime/heap_allocator_other.odin2
-rw-r--r--base/runtime/os_specific_orca.odin43
-rw-r--r--base/runtime/procs.odin2
-rw-r--r--ci/create_nightly_json.py51
-rw-r--r--ci/delete_old_binaries.py33
-rw-r--r--ci/nightly.py140
-rwxr-xr-xci/upload_create_nightly.sh25
-rw-r--r--core/fmt/fmt_os.odin1
-rw-r--r--core/time/time_orca.odin24
-rw-r--r--src/build_settings.cpp7
-rw-r--r--src/linker.cpp40
-rw-r--r--src/main.cpp32
-rw-r--r--tests/internal/Makefile10
-rwxr-xr-xtests/issues/run.sh2
-rw-r--r--vendor/directx/d3d11/d3d11.odin2
-rw-r--r--vendor/sdl2/sdl_render.odin2
-rw-r--r--vendor/x11/xlib/xlib_const.odin5
-rw-r--r--vendor/x11/xlib/xlib_procs.odin30
25 files changed, 390 insertions, 179 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 33bc303f0..2884fb301 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -24,7 +24,6 @@ jobs:
/usr/sbin/pkg_add https://github.com/andreas-jonsson/llvm17-netbsd-bin/releases/download/pkgsrc-current/llvm-17.0.6.tgz
/usr/sbin/pkg_add https://github.com/andreas-jonsson/llvm17-netbsd-bin/releases/download/pkgsrc-current/clang-17.0.6.tgz
ln -s /usr/pkg/bin/python3.11 /usr/bin/python3
- ln -s /usr/pkg/bin/bash /bin/bash
run: |
git config --global --add safe.directory $(pwd)
gmake release
diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
index 221ab1cdb..8d8392f95 100644
--- a/.github/workflows/nightly.yml
+++ b/.github/workflows/nightly.yml
@@ -151,11 +151,11 @@ jobs:
with:
python-version: '3.8.x'
- - name: Install B2 CLI
+ - name: Install B2 SDK
shell: bash
run: |
python -m pip install --upgrade pip
- pip install --upgrade b2
+ pip install --upgrade b2sdk
- name: Display Python version
run: python -c "import sys; print(sys.version)"
@@ -188,24 +188,9 @@ jobs:
BUCKET: ${{ secrets.B2_BUCKET }}
DAYS_TO_KEEP: ${{ secrets.B2_DAYS_TO_KEEP }}
run: |
- echo Authorizing B2 account
- b2 account authorize "$APPID" "$APPKEY"
-
- echo Uploading artifcates to B2
- chmod +x ./ci/upload_create_nightly.sh
- ./ci/upload_create_nightly.sh "$BUCKET" windows-amd64 windows_artifacts/
- ./ci/upload_create_nightly.sh "$BUCKET" ubuntu-amd64 ubuntu_artifacts/dist.zip
- ./ci/upload_create_nightly.sh "$BUCKET" macos-amd64 macos_artifacts/dist.zip
- ./ci/upload_create_nightly.sh "$BUCKET" macos-arm64 macos_arm_artifacts/dist.zip
-
- echo Deleting old artifacts in B2
- python3 ci/delete_old_binaries.py "$BUCKET" "$DAYS_TO_KEEP"
-
- echo Creating nightly.json
- python3 ci/create_nightly_json.py "$BUCKET" > nightly.json
-
- echo Uploading nightly.json
- b2 upload-file "$BUCKET" nightly.json nightly.json
-
- echo Clear B2 account info
- b2 clear-account
+ python3 ci/nightly.py artifact windows-amd64 windows_artifacts/
+ python3 ci/nightly.py artifact ubuntu-amd64 ubuntu_artifacts/dist.zip
+ python3 ci/nightly.py artifact macos-amd64 macos_artifacts/dist.zip
+ python3 ci/nightly.py artifact macos-arm64 macos_arm_artifacts/dist.zip
+ python3 ci/nightly.py prune
+ python3 ci/nightly.py json \ No newline at end of file
diff --git a/base/runtime/core.odin b/base/runtime/core.odin
index 47b9a690c..3e24060af 100644
--- a/base/runtime/core.odin
+++ b/base/runtime/core.odin
@@ -701,7 +701,7 @@ default_assertion_failure_proc :: proc(prefix, message: string, loc: Source_Code
when ODIN_OS == .Freestanding {
// Do nothing
} else {
- when !ODIN_DISABLE_ASSERT {
+ when ODIN_OS != .Orca && !ODIN_DISABLE_ASSERT {
print_caller_location(loc)
print_string(" ")
}
@@ -710,7 +710,18 @@ default_assertion_failure_proc :: proc(prefix, message: string, loc: Source_Code
print_string(": ")
print_string(message)
}
- print_byte('\n')
+
+ when ODIN_OS == .Orca {
+ assert_fail(
+ cstring(raw_data(loc.file_path)),
+ cstring(raw_data(loc.procedure)),
+ loc.line,
+ "",
+ cstring(raw_data(orca_stderr_buffer[:orca_stderr_buffer_idx])),
+ )
+ } else {
+ print_byte('\n')
+ }
}
trap()
}
diff --git a/base/runtime/default_allocators_general.odin b/base/runtime/default_allocators_general.odin
index ab4dd1db8..64af6c904 100644
--- a/base/runtime/default_allocators_general.odin
+++ b/base/runtime/default_allocators_general.odin
@@ -6,7 +6,7 @@ when ODIN_DEFAULT_TO_NIL_ALLOCATOR {
} else when ODIN_DEFAULT_TO_PANIC_ALLOCATOR {
default_allocator_proc :: panic_allocator_proc
default_allocator :: panic_allocator
-} else when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 {
+} else when ODIN_OS != .Orca && (ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32) {
default_allocator :: default_wasm_allocator
default_allocator_proc :: wasm_allocator_proc
} else {
diff --git a/base/runtime/entry_wasm.odin b/base/runtime/entry_wasm.odin
index c608942ba..a24c6f4b7 100644
--- a/base/runtime/entry_wasm.odin
+++ b/base/runtime/entry_wasm.odin
@@ -6,15 +6,29 @@ package runtime
import "base:intrinsics"
when !ODIN_TEST && !ODIN_NO_ENTRY_POINT {
- @(link_name="_start", linkage="strong", require, export)
- _start :: proc "c" () {
- context = default_context()
- #force_no_inline _startup_runtime()
- intrinsics.__entry_point()
+ when ODIN_OS == .Orca {
+ @(linkage="strong", require, export)
+ oc_on_init :: proc "c" () {
+ context = default_context()
+ #force_no_inline _startup_runtime()
+ intrinsics.__entry_point()
+ }
+ @(linkage="strong", require, export)
+ oc_on_terminate :: proc "c" () {
+ context = default_context()
+ #force_no_inline _cleanup_runtime()
+ }
+ } else {
+ @(link_name="_start", linkage="strong", require, export)
+ _start :: proc "c" () {
+ context = default_context()
+ #force_no_inline _startup_runtime()
+ intrinsics.__entry_point()
+ }
+ @(link_name="_end", linkage="strong", require, export)
+ _end :: proc "c" () {
+ context = default_context()
+ #force_no_inline _cleanup_runtime()
+ }
}
- @(link_name="_end", linkage="strong", require, export)
- _end :: proc "c" () {
- context = default_context()
- #force_no_inline _cleanup_runtime()
- }
-} \ No newline at end of file
+}
diff --git a/base/runtime/error_checks.odin b/base/runtime/error_checks.odin
index 742e06a71..32a895c3f 100644
--- a/base/runtime/error_checks.odin
+++ b/base/runtime/error_checks.odin
@@ -4,6 +4,8 @@ package runtime
bounds_trap :: proc "contextless" () -> ! {
when ODIN_OS == .Windows {
windows_trap_array_bounds()
+ } else when ODIN_OS == .Orca {
+ abort_ext("", "", 0, "bounds trap")
} else {
trap()
}
@@ -13,6 +15,8 @@ bounds_trap :: proc "contextless" () -> ! {
type_assertion_trap :: proc "contextless" () -> ! {
when ODIN_OS == .Windows {
windows_trap_type_assertion()
+ } else when ODIN_OS == .Orca {
+ abort_ext("", "", 0, "type assertion trap")
} else {
trap()
}
diff --git a/base/runtime/heap_allocator_orca.odin b/base/runtime/heap_allocator_orca.odin
new file mode 100644
index 000000000..c22a67ca1
--- /dev/null
+++ b/base/runtime/heap_allocator_orca.odin
@@ -0,0 +1,29 @@
+//+build orca
+//+private
+package runtime
+
+foreign {
+ @(link_name="malloc") _orca_malloc :: proc "c" (size: int) -> rawptr ---
+ @(link_name="calloc") _orca_calloc :: proc "c" (num, size: int) -> rawptr ---
+ @(link_name="free") _orca_free :: proc "c" (ptr: rawptr) ---
+ @(link_name="realloc") _orca_realloc :: proc "c" (ptr: rawptr, size: int) -> rawptr ---
+}
+
+_heap_alloc :: proc(size: int, zero_memory := true) -> rawptr {
+ if size <= 0 {
+ return nil
+ }
+ if zero_memory {
+ return _orca_calloc(1, size)
+ } else {
+ return _orca_malloc(size)
+ }
+}
+
+_heap_resize :: proc(ptr: rawptr, new_size: int) -> rawptr {
+ return _orca_realloc(ptr, new_size)
+}
+
+_heap_free :: proc(ptr: rawptr) {
+ _orca_free(ptr)
+}
diff --git a/base/runtime/heap_allocator_other.odin b/base/runtime/heap_allocator_other.odin
index 45049c7e9..74536ada9 100644
--- a/base/runtime/heap_allocator_other.odin
+++ b/base/runtime/heap_allocator_other.odin
@@ -12,4 +12,4 @@ _heap_resize :: proc(ptr: rawptr, new_size: int) -> rawptr {
_heap_free :: proc(ptr: rawptr) {
unimplemented("base:runtime 'heap_free' procedure is not supported on this platform")
-} \ No newline at end of file
+}
diff --git a/base/runtime/os_specific_orca.odin b/base/runtime/os_specific_orca.odin
new file mode 100644
index 000000000..b6f5930ab
--- /dev/null
+++ b/base/runtime/os_specific_orca.odin
@@ -0,0 +1,43 @@
+//+build orca
+//+private
+package runtime
+
+import "base:intrinsics"
+
+// Constants allowing to specify the level of logging verbosity.
+log_level :: enum u32 {
+ // Only errors are logged.
+ ERROR = 0,
+ // Only warnings and errors are logged.
+ WARNING = 1,
+ // All messages are logged.
+ INFO = 2,
+ COUNT = 3,
+}
+
+@(default_calling_convention="c", link_prefix="oc_")
+foreign {
+ abort_ext :: proc(file: cstring, function: cstring, line: i32, fmt: cstring, #c_vararg args: ..any) -> ! ---
+ assert_fail :: proc(file: cstring, function: cstring, line: i32, src: cstring, fmt: cstring, #c_vararg args: ..any) -> ! ---
+ log_ext :: proc(level: log_level, function: cstring, file: cstring, line: i32, fmt: cstring, #c_vararg args: ..any) ---
+}
+
+// NOTE: This is all pretty gross, don't look.
+
+// WASM is single threaded so this should be fine.
+orca_stderr_buffer: [4096]byte
+orca_stderr_buffer_idx: int
+
+_stderr_write :: proc "contextless" (data: []byte) -> (int, _OS_Errno) {
+ for b in data {
+ orca_stderr_buffer[orca_stderr_buffer_idx] = b
+ orca_stderr_buffer_idx += 1
+
+ if b == '\n' || orca_stderr_buffer_idx == len(orca_stderr_buffer)-1 {
+ log_ext(.ERROR, "", "", 0, cstring(raw_data(orca_stderr_buffer[:orca_stderr_buffer_idx])))
+ orca_stderr_buffer_idx = 0
+ }
+ }
+
+ return len(data), 0
+}
diff --git a/base/runtime/procs.odin b/base/runtime/procs.odin
index c9347463b..002a6501f 100644
--- a/base/runtime/procs.odin
+++ b/base/runtime/procs.odin
@@ -25,7 +25,7 @@ when ODIN_NO_CRT && ODIN_OS == .Windows {
RtlMoveMemory(dst, src, len)
return dst
}
-} else when ODIN_NO_CRT || (ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32) {
+} else when ODIN_NO_CRT || (ODIN_OS != .Orca && (ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32)) {
// NOTE: on wasm, calls to these procs are generated (by LLVM) with type `i32` instead of `int`.
//
// NOTE: `#any_int` is also needed, because calls that we generate (and package code)
diff --git a/ci/create_nightly_json.py b/ci/create_nightly_json.py
deleted file mode 100644
index 3a1fcd1ef..000000000
--- a/ci/create_nightly_json.py
+++ /dev/null
@@ -1,51 +0,0 @@
-import subprocess
-import sys
-import json
-import datetime
-import urllib.parse
-import sys
-
-def main():
- files_by_date = {}
- bucket = sys.argv[1]
-
- files_lines = execute_cli(f"b2 ls --long b2://{bucket}/nightly/").split("\n")
- for x in files_lines:
- parts = x.split(" ", 1)
- if parts[0]:
- print(f"Parts[0]: {parts[0]}", flush=True)
- json_str = execute_cli(f"b2 file info b2://{bucket}/{parts[0]}")
- data = json.loads(json_str)
- name = remove_prefix(data['fileName'], "nightly/")
- url = f"https://f001.backblazeb2.com/file/{bucket}/nightly/{urllib.parse.quote_plus(name)}"
- sha1 = data['contentSha1']
- size = int(data['size'])
- ts = int(data['fileInfo']['src_last_modified_millis'])
- date = datetime.datetime.fromtimestamp(ts/1000).strftime('%Y-%m-%d')
-
- if date not in files_by_date.keys():
- files_by_date[date] = []
-
- files_by_date[date].append({
- 'name': name,
- 'url': url,
- 'sha1': sha1,
- 'sizeInBytes': size,
- })
-
- now = datetime.datetime.utcnow().isoformat()
-
- print(json.dumps({
- 'last_updated' : now,
- 'files': files_by_date
- }, sort_keys=True, indent=4))
-
-def remove_prefix(text, prefix):
- return text[text.startswith(prefix) and len(prefix):]
-
-def execute_cli(command):
- sb = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
- return sb.stdout.read().decode("utf-8");
-
-if __name__ == '__main__':
- sys.exit(main()) \ No newline at end of file
diff --git a/ci/delete_old_binaries.py b/ci/delete_old_binaries.py
deleted file mode 100644
index f7d5d02af..000000000
--- a/ci/delete_old_binaries.py
+++ /dev/null
@@ -1,33 +0,0 @@
-import subprocess
-import sys
-import json
-import datetime
-import urllib.parse
-import sys
-
-def main():
- files_by_date = {}
- bucket = sys.argv[1]
- days_to_keep = int(sys.argv[2])
- print(f"Looking for binaries to delete older than {days_to_keep} days")
-
- files_lines = execute_cli(f"b2 ls --long --versions b2://{bucket}/nightly/").split("\n")
- for x in files_lines:
- parts = [y for y in x.split(' ') if y]
-
- if parts and parts[0]:
- date = datetime.datetime.strptime(parts[2], '%Y-%m-%d').replace(hour=0, minute=0, second=0, microsecond=0)
- now = datetime.datetime.utcnow().replace(hour=0, minute=0, second=0, microsecond=0)
- delta = now - date
-
- if delta.days > days_to_keep:
- print(f'Deleting b2://{bucket}/{parts[5]}')
- execute_cli(f'b2 rm b2://{bucket}/{parts[5]}')
-
-
-def execute_cli(command):
- sb = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
- return sb.stdout.read().decode("utf-8");
-
-if __name__ == '__main__':
- sys.exit(main()) \ No newline at end of file
diff --git a/ci/nightly.py b/ci/nightly.py
new file mode 100644
index 000000000..7bd32899d
--- /dev/null
+++ b/ci/nightly.py
@@ -0,0 +1,140 @@
+import os
+import sys
+from zipfile import ZipFile, ZIP_DEFLATED
+from b2sdk.v2 import InMemoryAccountInfo, B2Api
+from datetime import datetime
+import json
+
+UPLOAD_FOLDER = "nightly/"
+
+info = InMemoryAccountInfo()
+b2_api = B2Api(info)
+application_key_id = os.environ['APPID']
+application_key = os.environ['APPKEY']
+bucket_name = os.environ['BUCKET']
+days_to_keep = os.environ['DAYS_TO_KEEP']
+
+def auth() -> bool:
+ try:
+ realm = b2_api.account_info.get_realm()
+ return True # Already authenticated
+ except:
+ pass # Not yet authenticated
+
+ err = b2_api.authorize_account("production", application_key_id, application_key)
+ return err == None
+
+def get_bucket():
+ if not auth(): sys.exit(1)
+ return b2_api.get_bucket_by_name(bucket_name)
+
+def remove_prefix(text: str, prefix: str) -> str:
+ return text[text.startswith(prefix) and len(prefix):]
+
+def create_and_upload_artifact_zip(platform: str, artifact: str) -> int:
+ now = datetime.utcnow().replace(hour=0, minute=0, second=0, microsecond=0)
+ destination_zip_name = "odin-{}-nightly+{}.zip".format(platform, now.strftime("%Y-%m-%d"))
+
+ source_zip_name = artifact
+ if not artifact.endswith(".zip"):
+ print(f"Creating archive {destination_zip_name} from {artifact} and uploading to {bucket_name}")
+
+ source_zip_name = destination_zip_name
+ with ZipFile(source_zip_name, mode='w', compression=ZIP_DEFLATED, compresslevel=9) as z:
+ for root, directory, filenames in os.walk(artifact):
+ for file in filenames:
+ file_path = os.path.join(root, file)
+ zip_path = os.path.join("dist", os.path.relpath(file_path, artifact))
+ z.write(file_path, zip_path)
+
+ if not os.path.exists(source_zip_name):
+ print(f"Error: Newly created ZIP archive {source_zip_name} not found.")
+ return 1
+
+ print("Uploading {} to {}".format(source_zip_name, UPLOAD_FOLDER + destination_zip_name))
+ bucket = get_bucket()
+ res = bucket.upload_local_file(
+ source_zip_name, # Local file to upload
+ "nightly/" + destination_zip_name, # B2 destination path
+ )
+ return 0
+
+def prune_artifacts():
+ print(f"Looking for binaries to delete older than {days_to_keep} days")
+
+ bucket = get_bucket()
+ for file, _ in bucket.ls(UPLOAD_FOLDER, latest_only=False):
+ # Timestamp is in milliseconds
+ date = datetime.fromtimestamp(file.upload_timestamp / 1_000.0).replace(hour=0, minute=0, second=0, microsecond=0)
+ now = datetime.utcnow().replace(hour=0, minute=0, second=0, microsecond=0)
+ delta = now - date
+
+ if delta.days > int(days_to_keep):
+ print("Deleting {}".format(file.file_name))
+ file.delete()
+
+ return 0
+
+def update_nightly_json():
+ print(f"Updating nightly.json with files {days_to_keep} days or newer")
+
+ files_by_date = {}
+
+ bucket = get_bucket()
+
+ for file, _ in bucket.ls(UPLOAD_FOLDER, latest_only=True):
+ # Timestamp is in milliseconds
+ date = datetime.fromtimestamp(file.upload_timestamp / 1_000.0).replace(hour=0, minute=0, second=0, microsecond=0).strftime('%Y-%m-%d')
+ name = remove_prefix(file.file_name, UPLOAD_FOLDER)
+ sha1 = file.content_sha1
+ size = file.size
+ url = bucket.get_download_url(file.file_name)
+
+ if date not in files_by_date.keys():
+ files_by_date[date] = []
+
+ files_by_date[date].append({
+ 'name': name,
+ 'url': url,
+ 'sha1': sha1,
+ 'sizeInBytes': size,
+ })
+
+ now = datetime.utcnow().isoformat()
+
+ nightly = json.dumps({
+ 'last_updated' : now,
+ 'files': files_by_date
+ }, sort_keys=True, indent=4, ensure_ascii=False).encode('utf-8')
+
+ res = bucket.upload_bytes(
+ nightly, # JSON bytes
+ "nightly.json", # B2 destination path
+ )
+ return 0
+
+if __name__ == "__main__":
+ if len(sys.argv) == 1:
+ print("Usage: {} <verb> [arguments]".format(sys.argv[0]))
+ print("\tartifact <platform prefix> <artifact path>\n\t\tCreates and uploads a platform artifact zip.")
+ print("\tprune\n\t\tDeletes old artifacts from bucket")
+ print("\tjson\n\t\tUpdate and upload nightly.json")
+ sys.exit(1)
+ else:
+ command = sys.argv[1].lower()
+ if command == "artifact":
+ if len(sys.argv) != 4:
+ print("Usage: {} artifact <platform prefix> <artifact path>".format(sys.argv[0]))
+ print("Error: Expected artifact command to be given platform prefix and artifact path.\n")
+ sys.exit(1)
+
+ res = create_and_upload_artifact_zip(sys.argv[2], sys.argv[3])
+ sys.exit(res)
+
+ elif command == "prune":
+ res = prune_artifacts()
+ sys.exit(res)
+
+ elif command == "json":
+ res = update_nightly_json()
+ sys.exit(res) \ No newline at end of file
diff --git a/ci/upload_create_nightly.sh b/ci/upload_create_nightly.sh
deleted file mode 100755
index 8404b33ff..000000000
--- a/ci/upload_create_nightly.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/bash
-
-set -e
-
-bucket=$1
-platform=$2
-artifact=$3
-
-now=$(date +'%Y-%m-%d')
-filename="odin-$platform-nightly+$now.zip"
-
-echo "Creating archive $filename from $artifact and uploading to $bucket"
-
-# If this is already zipped up (done before artifact upload to keep permissions in tact), just move it.
-if [ "${artifact: -4}" == ".zip" ]
-then
- echo "Artifact already a zip"
- mkdir -p "output"
- mv "$artifact" "output/$filename"
-else
- echo "Artifact needs to be zipped"
- 7z a -bd "output/$filename" -r "$artifact"
-fi
-
-b2 file upload "$bucket" "output/$filename" "nightly/$filename"
diff --git a/core/fmt/fmt_os.odin b/core/fmt/fmt_os.odin
index a403dcd65..9de0d43be 100644
--- a/core/fmt/fmt_os.odin
+++ b/core/fmt/fmt_os.odin
@@ -1,5 +1,6 @@
//+build !freestanding
//+build !js
+//+build !orca
package fmt
import "base:runtime"
diff --git a/core/time/time_orca.odin b/core/time/time_orca.odin
new file mode 100644
index 000000000..d222c8247
--- /dev/null
+++ b/core/time/time_orca.odin
@@ -0,0 +1,24 @@
+//+private
+//+build orca
+package time
+
+_IS_SUPPORTED :: false
+
+_now :: proc "contextless" () -> Time {
+ return {}
+}
+
+_sleep :: proc "contextless" (d: Duration) {
+}
+
+_tick_now :: proc "contextless" () -> Tick {
+ // mul_div_u64 :: proc "contextless" (val, num, den: i64) -> i64 {
+ // q := val / den
+ // r := val % den
+ // return q * num + r * num / den
+ // }
+ return {}
+}
+
+_yield :: proc "contextless" () {
+}
diff --git a/src/build_settings.cpp b/src/build_settings.cpp
index a7e455818..52e6fd7ff 100644
--- a/src/build_settings.cpp
+++ b/src/build_settings.cpp
@@ -1088,7 +1088,6 @@ gb_global TargetMetrics target_orca_wasm32 = {
TargetArch_wasm32,
4, 4, 8, 16,
str_lit("wasm32-wasi-js"),
- // str_lit("e-m:e-p:32:32-i64:64-n32:64-S128"),
};
@@ -1170,6 +1169,7 @@ gb_global NamedTargetMetrics named_targets[] = {
{ str_lit("freestanding_wasm32"), &target_freestanding_wasm32 },
{ str_lit("wasi_wasm32"), &target_wasi_wasm32 },
{ str_lit("js_wasm32"), &target_js_wasm32 },
+ { str_lit("orca_wasm32"), &target_orca_wasm32 },
{ str_lit("freestanding_wasm64p32"), &target_freestanding_wasm64p32 },
{ str_lit("js_wasm64p32"), &target_js_wasm64p32 },
@@ -2045,11 +2045,10 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta
// }
if (bc->no_entry_point || bc->metrics.os == TargetOs_orca) {
link_flags = gb_string_appendc(link_flags, "--no-entry ");
- bc->no_entry_point = true; // just in case for the "orca" target
}
-
+
bc->link_flags = make_string_c(link_flags);
-
+
// Disallow on wasm
bc->use_separate_modules = false;
} else {
diff --git a/src/linker.cpp b/src/linker.cpp
index b699c0dfb..25c54a6ab 100644
--- a/src/linker.cpp
+++ b/src/linker.cpp
@@ -13,6 +13,7 @@ struct LinkerData {
};
gb_internal i32 system_exec_command_line_app(char const *name, char const *fmt, ...);
+gb_internal bool system_exec_command_line_app_output(char const *command, gbString *output);
#if defined(GB_SYSTEM_OSX)
gb_internal void linker_enable_system_library_linking(LinkerData *ld) {
@@ -69,27 +70,40 @@ gb_internal i32 linker_stage(LinkerData *gen) {
if (is_arch_wasm()) {
timings_start_section(timings, str_lit("wasm-ld"));
- String extra_orca_flags = {};
+ gbString extra_orca_flags = gb_string_make(temporary_allocator(), "");
+
+ gbString inputs = gb_string_make(temporary_allocator(), "");
+ inputs = gb_string_append_fmt(inputs, "\"%.*s.o\"", LIT(output_filename));
- #if defined(GB_SYSTEM_WINDOWS)
if (build_context.metrics.os == TargetOs_orca) {
- extra_orca_flags = str_lit(" W:/orca/installation/dev-afb9591/bin/liborca_wasm.a --export-dynamic");
+ gbString orca_sdk_path = gb_string_make(temporary_allocator(), "");
+ if (!system_exec_command_line_app_output("orca sdk-path", &orca_sdk_path)) {
+ gb_printf_err("executing `orca sdk-path` failed, make sure Orca is installed and added to your path\n");
+ return 1;
+ }
+ if (gb_string_length(orca_sdk_path) == 0) {
+ gb_printf_err("executing `orca sdk-path` did not produce output\n");
+ return 1;
+ }
+ inputs = gb_string_append_fmt(inputs, " \"%s/orca-libc/lib/crt1.o\" \"%s/orca-libc/lib/libc.o\"", orca_sdk_path, orca_sdk_path);
+
+ extra_orca_flags = gb_string_append_fmt(extra_orca_flags, " -L \"%s/bin\" -lorca_wasm --export-dynamic", orca_sdk_path);
}
+
+ #if defined(GB_SYSTEM_WINDOWS)
result = system_exec_command_line_app("wasm-ld",
- "\"%.*s\\bin\\wasm-ld\" \"%.*s.o\" -o \"%.*s\" %.*s %.*s %.*s",
+ "\"%.*s\\bin\\wasm-ld\" %s -o \"%.*s\" %.*s %.*s %s",
LIT(build_context.ODIN_ROOT),
- LIT(output_filename), LIT(output_filename), LIT(build_context.link_flags), LIT(build_context.extra_linker_flags),
- LIT(extra_orca_flags));
+ inputs, LIT(output_filename), LIT(build_context.link_flags), LIT(build_context.extra_linker_flags),
+ extra_orca_flags);
#else
- if (build_context.metrics.os == TargetOs_orca) {
- extra_orca_flags = str_lit(" -L . -lorca --export-dynamic");
- }
-
result = system_exec_command_line_app("wasm-ld",
- "wasm-ld \"%.*s.o\" -o \"%.*s\" %.*s %.*s %.*s",
- LIT(output_filename), LIT(output_filename), LIT(build_context.link_flags), LIT(build_context.extra_linker_flags),
- LIT(extra_orca_flags));
+ "wasm-ld %s -o \"%.*s\" %.*s %.*s %s",
+ inputs, LIT(output_filename),
+ LIT(build_context.link_flags),
+ LIT(build_context.extra_linker_flags),
+ extra_orca_flags);
#endif
return result;
}
diff --git a/src/main.cpp b/src/main.cpp
index 3ca024ed9..70def5802 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -155,6 +155,38 @@ gb_internal i32 system_exec_command_line_app(char const *name, char const *fmt,
return exit_code;
}
+#if defined(GB_SYSTEM_WINDOWS)
+#define popen _popen
+#define pclose _pclose
+#endif
+
+gb_internal bool system_exec_command_line_app_output(char const *command, gbString *output) {
+ GB_ASSERT(output);
+
+ u8 buffer[256];
+ FILE *stream;
+ stream = popen(command, "r");
+ if (!stream) {
+ return false;
+ }
+ defer (pclose(stream));
+
+ while (!feof(stream)) {
+ size_t n = fread(buffer, 1, 255, stream);
+ *output = gb_string_append_length(*output, buffer, n);
+
+ if (ferror(stream)) {
+ return false;
+ }
+ }
+
+ if (build_context.show_system_calls) {
+ gb_printf_err("[SYSTEM CALL OUTPUT] %s -> %s\n", command, *output);
+ }
+
+ return true;
+}
+
gb_internal Array<String> setup_args(int argc, char const **argv) {
gbAllocator a = heap_allocator();
diff --git a/tests/internal/Makefile b/tests/internal/Makefile
index fb22767d2..307badb41 100644
--- a/tests/internal/Makefile
+++ b/tests/internal/Makefile
@@ -1,7 +1,9 @@
ODIN=../../odin
COMMON=-file -vet -strict-style -o:minimal
-all: asan_test rtti_test map_test pow_test 128_test string_compare_test
+all: all_bsd asan_test
+
+all_bsd: rtti_test map_test pow_test 128_test string_compare_test
rtti_test:
$(ODIN) test test_rtti.odin $(COMMON)
@@ -15,8 +17,8 @@ pow_test:
128_test:
$(ODIN) test test_128.odin $(COMMON)
+string_compare_test:
+ $(ODIN) test test_string_compare.odin $(COMMON)
+
asan_test:
$(ODIN) test test_asan.odin $(COMMON) -sanitize:address -debug
-
-string_compare_test:
- $(ODIN) test test_string_compare.odin $(COMMON) \ No newline at end of file
diff --git a/tests/issues/run.sh b/tests/issues/run.sh
index 24b388b07..a5280485e 100755
--- a/tests/issues/run.sh
+++ b/tests/issues/run.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
set -eu
mkdir -p build
diff --git a/vendor/directx/d3d11/d3d11.odin b/vendor/directx/d3d11/d3d11.odin
index a1e3cf039..3af0f2965 100644
--- a/vendor/directx/d3d11/d3d11.odin
+++ b/vendor/directx/d3d11/d3d11.odin
@@ -3374,7 +3374,7 @@ CREATE_DEVICE_FLAG :: enum u32 {
DEBUGGABLE = 6,
PREVENT_ALTERING_LAYER_SETTINGS_FROM_REGISTRY = 7,
DISABLE_GPU_TIMEOUT = 8,
- VIDEO_SUPPORT = 12,
+ VIDEO_SUPPORT = 11,
}
PFN_CREATE_DEVICE :: #type proc "c" (a0: ^dxgi.IAdapter, a1: DRIVER_TYPE, a2: HMODULE, a3: u32, a4: ^FEATURE_LEVEL, a5: u32, a6: u32, a7: ^^IDevice, a8: ^FEATURE_LEVEL, a9: ^^IDeviceContext) -> HRESULT
diff --git a/vendor/sdl2/sdl_render.odin b/vendor/sdl2/sdl_render.odin
index f948b39b0..cceebf3ac 100644
--- a/vendor/sdl2/sdl_render.odin
+++ b/vendor/sdl2/sdl_render.odin
@@ -76,7 +76,7 @@ foreign lib {
GetRenderer :: proc(window: ^Window) -> ^Renderer ---
GetRendererInfo :: proc(renderer: ^Renderer, info: ^RendererInfo) -> c.int ---
GetRendererOutputSize :: proc(renderer: ^Renderer, w, h: ^c.int) -> c.int ---
- CreateTexture :: proc(renderer: ^Renderer, format: u32, access: TextureAccess, w, h: c.int) -> ^Texture ---
+ CreateTexture :: proc(renderer: ^Renderer, format: PixelFormatEnum, access: TextureAccess, w, h: c.int) -> ^Texture ---
CreateTextureFromSurface :: proc(renderer: ^Renderer, surface: ^Surface) -> ^Texture ---
QueryTexture :: proc(texture: ^Texture, format: ^u32, access, w, h: ^c.int) -> c.int ---
SetTextureColorMod :: proc(texture: ^Texture, r, g, b: u8) -> c.int ---
diff --git a/vendor/x11/xlib/xlib_const.odin b/vendor/x11/xlib/xlib_const.odin
index 910940dec..0b87ab9f7 100644
--- a/vendor/x11/xlib/xlib_const.odin
+++ b/vendor/x11/xlib/xlib_const.odin
@@ -17,6 +17,11 @@ AllTemporary :: 0
CurrentTime :: 0
NoSymbol :: 0
+PropModeReplace :: 0
+PropModePrepend :: 1
+PropModeAppend :: 2
+
+XA_ATOM :: Atom(4)
XA_WM_CLASS :: Atom(67)
XA_WM_CLIENT_MACHINE :: Atom(36)
XA_WM_COMMAND :: Atom(34)
diff --git a/vendor/x11/xlib/xlib_procs.odin b/vendor/x11/xlib/xlib_procs.odin
index 735ddc9c4..20ec5bb39 100644
--- a/vendor/x11/xlib/xlib_procs.odin
+++ b/vendor/x11/xlib/xlib_procs.odin
@@ -6,6 +6,16 @@ foreign xlib {
@(link_name="_Xdebug") _Xdebug: i32
}
+foreign import xcursor "system:Xcursor"
+@(default_calling_convention="c", link_prefix="X")
+foreign xcursor {
+ cursorGetTheme :: proc(display: ^Display) -> cstring ---
+ cursorGetDefaultSize :: proc(display: ^Display) -> i32 ---
+ cursorLibraryLoadImage :: proc(name: cstring, theme: cstring, size: i32) -> rawptr ---
+ cursorImageLoadCursor :: proc(display: ^Display, img: rawptr) -> Cursor ---
+ cursorImageDestroy :: proc(img: rawptr) ---
+}
+
/* ---- X11/Xlib.h ---------------------------------------------------------*/
@(default_calling_convention="c", link_prefix="X")
@@ -20,11 +30,9 @@ foreign xlib {
NoOp :: proc(display: ^Display) ---
// Display macros (connection)
ConnectionNumber :: proc(display: ^Display) -> i32 ---
- ExtendedMaxRequestSize ::
- proc(display: ^Display) -> int ---
+ ExtendedMaxRequestSize :: proc(display: ^Display) -> int ---
MaxRequestSize :: proc(display: ^Display) -> int ---
- LastKnownRequestProcessed ::
- proc(display: ^Display) -> uint ---
+ LastKnownRequestProcessed :: proc(display: ^Display) -> uint ---
NextRequest :: proc(display: ^Display) -> uint ---
ProtocolVersion :: proc(display: ^Display) -> i32 ---
ProtocolRevision :: proc(display: ^Display) -> i32 ---
@@ -46,8 +54,7 @@ foreign xlib {
DefaultRootWindow :: proc(display: ^Display) -> Window ---
DefaultScreen :: proc(display: ^Display) -> i32 ---
DefaultVisual :: proc(display: ^Display, screen_no: i32) -> ^Visual ---
- DefaultScreenOfDisplay ::
- proc(display: ^Display) -> ^Screen ---
+ DefaultScreenOfDisplay :: proc(display: ^Display) -> ^Screen ---
// Display macros (other)
RootWindow :: proc(display: ^Display, screen_no: i32) -> Window ---
ScreenCount :: proc(display: ^Display) -> i32 ---
@@ -1619,6 +1626,17 @@ foreign xlib {
) -> b32 ---
DestroyImage :: proc(image: ^XImage) ---
ResourceManagerString :: proc(display: ^Display) -> cstring ---
+ utf8SetWMProperties :: proc(
+ display: ^Display,
+ window: Window,
+ window_name: cstring,
+ icon_name: cstring,
+ argv: ^cstring,
+ argc: i32,
+ normal_hints: ^XSizeHints,
+ wm_hints: ^XWMHints,
+ class_hints: ^XClassHint,
+ ) ---
}
@(default_calling_convention="c")