aboutsummaryrefslogtreecommitdiff
path: root/core/sys/llvm/code_generator.odin
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-06-06 14:52:22 +0100
committergingerBill <bill@gingerbill.org>2020-06-06 14:52:22 +0100
commita3fa647bfd579e38337cff173a672159d42f7fd6 (patch)
treebd7013533feebe5d17481e5961d10132ce8760d6 /core/sys/llvm/code_generator.odin
parent1a4e2196bd6c76e89a41ac7f124b28462e695146 (diff)
Add `package sys/llvm` to expose some of the LLVM intrinsics
Diffstat (limited to 'core/sys/llvm/code_generator.odin')
-rw-r--r--core/sys/llvm/code_generator.odin71
1 files changed, 71 insertions, 0 deletions
diff --git a/core/sys/llvm/code_generator.odin b/core/sys/llvm/code_generator.odin
new file mode 100644
index 000000000..7d41ed67b
--- /dev/null
+++ b/core/sys/llvm/code_generator.odin
@@ -0,0 +1,71 @@
+// Code Generator Intrinsics
+package sys_llvm
+
+@(default_calling_convention="none")
+foreign _ {
+ @(link_name="llvm.returnaddress")
+ return_address :: proc(#const level: u32 = 0) -> rawptr ---
+
+ @(link_name="llvm.addressofreturnaddress")
+ address_of_return_address :: proc() -> rawptr ---
+
+ @(link_name="llvm.sponentry")
+ stack_pointer_on_entry :: proc() -> rawptr ---
+
+ @(link_name="llvm.frameaddress")
+ frame_address :: proc(#const level: u32 = 0) -> rawptr ---
+
+ @(link_name="llvm.stacksave")
+ stack_save :: proc() -> rawptr ---
+
+ @(link_name="llvm.stackrestore")
+ stack_restore :: proc(ptr: rawptr) ---
+
+ @(link_name="llvm.get.dynamic.area.offset.i32")
+ get_dynamic_area_offset_i32 :: proc() -> i32 ---
+
+ @(link_name="llvm.get.dynamic.area.offset.i64")
+ get_dynamic_area_offset_i64 :: proc() -> i64 ---
+}
+
+
+Prefetch_Read_Write :: enum i32 {
+ Read = 0,
+ Write = 1,
+}
+
+Prefetch_Locality :: enum i32 {
+ None = 0,
+ Low = 1,
+ Mid = 2,
+ High = 3,
+}
+
+Prefetch_Cache :: enum i32 {
+ Instruction = 0,
+ Data = 1,
+}
+
+
+@(default_calling_convention="none")
+foreign _ {
+ @(link_name="llvm.prefetch")
+ prefetch :: proc(address: rawptr, #const rw: Prefetch_Read_Write, #const locality: Prefetch_Locality, #const cache: Prefetch_Cache) ---
+}
+
+
+
+@(default_calling_convention="none")
+foreign _ {
+ @(link_name="llvm.pcmarker")
+ pc_marker :: proc(id: i32) ---
+
+ @(link_name="llvm.readcyclecounter")
+ read_cycle_counter :: proc() -> u64 ---
+
+ @(link_name="llvm.clear_cache")
+ clear_cache :: proc(rawptr, rawptr) ---
+
+ @(link_name="llvm.thread.pointer")
+ thread_pointer :: proc() -> rawptr ---
+}