muteki
Loading...
Searching...
No Matches
abi.h
Go to the documentation of this file.
1/*
2 * Copyright 2025 dogtopus
3 * SPDX-License-Identifier: MIT
4 */
5
11#ifndef __OSDEP_ABI_H__
12#define __OSDEP_ABI_H__
13
14#if defined(__clang__)
15
16// clang: Ignore unused parameter warning and clangd's warning on asm().
17#define NO_EXPECTED_WARNINGS_BEGIN \
18 _Pragma("clang diagnostic push") \
19 _Pragma("clang diagnostic ignored \"-Wunused-parameter\"") \
20 _Pragma("clang diagnostic ignored \"-Wlanguage-extension-token\"")
21#define NO_EXPECTED_WARNINGS_END \
22 _Pragma("clang diagnostic pop")
23
24#elif defined(__GNUC__) // !defined(__clang__)
25
26// gcc: Ignore unused parameter warning.
27#define NO_EXPECTED_WARNINGS_BEGIN \
28 _Pragma("GCC diagnostic push") \
29 _Pragma("GCC diagnostic ignored \"-Wunused-parameter\"")
30#define NO_EXPECTED_WARNINGS_END \
31 _Pragma("GCC diagnostic pop")
32
33#else // !defined(__GNUC__)
34
35// No-op
36#define NO_EXPECTED_WARNINGS_BEGIN
37#define NO_EXPECTED_WARNINGS_END
38
39#endif // defined(__clang__) || defined(__GNUC__)
40
41#define __APCS_WRAPPER_BASE(NAME, VA_LIST_NAME, STATIC, RETTYPE, ...) \
42 NO_EXPECTED_WARNINGS_BEGIN \
43 __attribute__((naked)) STATIC RETTYPE NAME(__VA_ARGS__) { \
44 asm ( \
45 /* x x x x | a0 a1 a2 a3 ... */ \
46 "push {r0-r3}\n\t" \
47 /* x x x x | <lr> a0 a1 a2 a3 ... */ \
48 "push {lr}\n\t" \
49 /* &a0 x x x | <lr> a0 a1 a2 a3 ... */ \
50 "add r0, sp, #4\n\t" \
51 /* &a0 x &<lr> x | <lr> a0 a1 a2 a3 ... */ \
52 "mov r2, sp\n\t" \
53 "tst r2, #7\n\t" \
54 /* &a0 x flag x | [padding] <lr> a0 a1 a2 a3 ... */ \
55 "mov r2, #0\n\t" \
56 "subeq sp, sp, #4\n\t" \
57 "moveq r2, #1\n\t" \
58 /* &a0 x x x | flag [padding] <lr> a0 a1 a2 a3 ... */ \
59 "push {r2}\n\t" \
60 "bl __osdep_apcs_thunk_"#NAME "\n\t" \
61 /* ret ret_hi flag x | [padding] <lr> a0 a1 a2 a3 ... */ \
62 "pop {r2}\n\t" \
63 "cmp r2, #0\n\t" \
64 /* ret ret_hi flag x | <lr> a0 a1 a2 a3 ... */ \
65 "addne sp, sp, #4\n\t" \
66 /* ret ret_hi <lr> x | a0 a1 a2 a3 ... */ \
67 "pop {r2}\n\t" \
68 /* ret ret_hi <lr> x | ... */ \
69 "add sp, sp, #16\n\t" \
70 "bx r2" \
71 ); \
72 } \
73 NO_EXPECTED_WARNINGS_END \
74 __attribute__((used)) static RETTYPE __osdep_apcs_thunk_##NAME(va_list VA_LIST_NAME)
75
111#define APCS_WRAPPER(NAME, VA_LIST_NAME, RETTYPE, ...) \
112 __APCS_WRAPPER_BASE(NAME, VA_LIST_NAME, , RETTYPE, __VA_ARGS__)
113
124#define APCS_WRAPPER_STATIC(NAME, VA_LIST_NAME, RETTYPE, ...) \
125 __APCS_WRAPPER_BASE(NAME, VA_LIST_NAME, static, RETTYPE, __VA_ARGS__)
126
127#endif // __OSDEP_ABI_H__