mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
Support for SysV for CVaList
This commit is contained in:
@@ -2,6 +2,8 @@
|
|||||||
// Use of this source code is governed by the MIT license
|
// Use of this source code is governed by the MIT license
|
||||||
// a copy of which can be found in the LICENSE_STDLIB file.
|
// a copy of which can be found in the LICENSE_STDLIB file.
|
||||||
module std::core::cinterop;
|
module std::core::cinterop;
|
||||||
|
import std::core::env;
|
||||||
|
|
||||||
|
|
||||||
const C_INT_SIZE = $$C_INT_SIZE;
|
const C_INT_SIZE = $$C_INT_SIZE;
|
||||||
const C_LONG_SIZE = $$C_LONG_SIZE;
|
const C_LONG_SIZE = $$C_LONG_SIZE;
|
||||||
@@ -60,7 +62,8 @@ macro typeid unsigned_int_from_bitsize(usz $bitsize) @private
|
|||||||
$endswitch
|
$endswitch
|
||||||
}
|
}
|
||||||
|
|
||||||
module std::core::cinterop @if(env::DARWIN && env::AARCH64);
|
const USE_STACK_VALIST = env::ARCH_32_BIT || env::WIN32 || (env::DARWIN && env::AARCH64);
|
||||||
|
module std::core::cinterop @if(USE_STACK_VALIST);
|
||||||
|
|
||||||
typedef CVaList = void*;
|
typedef CVaList = void*;
|
||||||
macro CVaList.next(&self, $Type)
|
macro CVaList.next(&self, $Type)
|
||||||
@@ -70,3 +73,45 @@ macro CVaList.next(&self, $Type)
|
|||||||
return *($Type*)ptr;
|
return *($Type*)ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
module std::core::cinterop @if(env::X86_64 && !env::WIN32);
|
||||||
|
|
||||||
|
struct CVaListData
|
||||||
|
{
|
||||||
|
uint gp_offset;
|
||||||
|
uint fp_offset;
|
||||||
|
void *overflow_arg_area;
|
||||||
|
void *reg_save_area;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef CVaList = CVaListData*;
|
||||||
|
|
||||||
|
macro CVaList.next(self, $Type)
|
||||||
|
{
|
||||||
|
CVaListData* data = (CVaListData*)self;
|
||||||
|
$switch:
|
||||||
|
$case $Type.kindof == FLOAT ||| ($Type.kindof == VECTOR && $Type.sizeof <= 16):
|
||||||
|
var $LoadType = $Type.sizeof < 8 ? double : $Type;
|
||||||
|
if (data.fp_offset < 6 * 8 + 8 * 16 )
|
||||||
|
{
|
||||||
|
defer data.fp_offset += (uint)mem::aligned_offset($Type.sizeof, 16);
|
||||||
|
return ($Type)*($LoadType*)(data.reg_save_area + data.fp_offset);
|
||||||
|
}
|
||||||
|
void* ptr = mem::aligned_pointer(data.overflow_arg_area, max(8, $Type.alignof));
|
||||||
|
defer data.overflow_arg_area = ptr + $Type.sizeof;
|
||||||
|
return ($Type)*($LoadType*)ptr;
|
||||||
|
$case $Type.kindof == SIGNED_INT || $Type.kindof == UNSIGNED_INT:
|
||||||
|
var $LoadType = $Type.sizeof < 4 ? int : $Type;
|
||||||
|
if (data.gp_offset < 6 * 8 && $Type.sizeof <= 8)
|
||||||
|
{
|
||||||
|
defer data.gp_offset += (uint)mem::aligned_offset($Type.sizeof, 8);
|
||||||
|
return ($Type)*($LoadType*)(data.reg_save_area + data.gp_offset);
|
||||||
|
}
|
||||||
|
void* ptr = mem::aligned_pointer(data.overflow_arg_area, max(8, $Type.alignof));
|
||||||
|
defer data.overflow_arg_area = ptr + $Type.sizeof;
|
||||||
|
return ($Type)*($LoadType*)ptr;
|
||||||
|
$default:
|
||||||
|
void* ptr = mem::aligned_pointer(data.overflow_arg_area, max(8, $Type.alignof));
|
||||||
|
defer data.overflow_arg_area = ptr + $Type.sizeof;
|
||||||
|
return *($Type*)ptr;
|
||||||
|
$endswitch
|
||||||
|
}
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
`path::public_share_directory`, `path::templates_directory`, `path::saved_games_directory`, `path::music_directory`, `path::downloads_directory`.
|
`path::public_share_directory`, `path::templates_directory`, `path::saved_games_directory`, `path::music_directory`, `path::downloads_directory`.
|
||||||
- Add `LinkedList` array_view to support `[]` and `foreach`/`foreach_r`. #2438
|
- Add `LinkedList` array_view to support `[]` and `foreach`/`foreach_r`. #2438
|
||||||
- Make `LinkedList` printable and add `==` operator. #2438
|
- Make `LinkedList` printable and add `==` operator. #2438
|
||||||
- CVaList support on MacOS aarch64.
|
- CVaList support on MacOS aarch64, SysV ABI x64.
|
||||||
|
|
||||||
## 0.7.5 Change list
|
## 0.7.5 Change list
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user