| // Part of the Crubit project, under the Apache License v2.0 with LLVM | |
| // Exceptions. See /LICENSE for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| #ifndef CRUBIT_RS_BINDINGS_FROM_CC_TEST_FUNCTION_SIMPLE_SIMPLE_FUNCTIONS_H_ | |
| #define CRUBIT_RS_BINDINGS_FROM_CC_TEST_FUNCTION_SIMPLE_SIMPLE_FUNCTIONS_H_ | |
| #include "support/annotations.h" | |
| CRUBIT_MUST_BIND int return_value(); | |
| CRUBIT_MUST_BIND int* return_pointer(); | |
| CRUBIT_MUST_BIND int& return_reference(); | |
| CRUBIT_MUST_BIND void take_pointer(int* i); | |
| CRUBIT_MUST_BIND void take_reference(int& i); | |
| CRUBIT_MUST_BIND CRUBIT_UNSAFE_MARK_SAFE const int* forward_pointer( | |
| const int* i); | |
| CRUBIT_MUST_BIND const int& forward_reference(const int& i); | |
| CRUBIT_MUST_BIND int multiply(int x, int y); | |
| CRUBIT_MUST_BIND int multiply_with_unnamed_parameters(int, int); | |
| CRUBIT_MUST_BIND int multiply_with_keyword_named_parameters(int self, int crate, | |
| int super); | |
| // LLVM identifiers use the `\01` prefix to suppress mangling: | |
| // https://llvm.org/docs/LangRef.html#identifiers | |
| // Test that we can import functions that have such names. | |
| // If `__USER_LABEL_PREFIX__` is non-empty, the Clang mangler adds the `\01` | |
| // prefix; otherwise, we add it here ourselves. | |
| #define IS_EMPTY_HELPER 1 | |
| #define IS_EMPTY(x) IS_EMPTY2(x) | |
| #define IS_EMPTY2(x) IS_EMPTY_HELPER##x | |
| #if IS_EMPTY(__USER_LABEL_PREFIX__) | |
| CRUBIT_MUST_BIND int llvm_no_mangle_marker() __asm("\01_llvm_no_mangle_marker"); | |
| #else | |
| CRUBIT_MUST_BIND int llvm_no_mangle_marker() __asm("_llvm_no_mangle_marker"); | |
| #endif | |
| // Test that we can import functions whose `__asm` name contains a dollar sign. | |
| // For example, the Apple SDKs use dollar signs in their symbol versioning | |
| // macros (e.g. `__DARWIN_EXTSN()`). | |
| CRUBIT_MUST_BIND int asm_name_with_dollar_sign() __asm( | |
| "asm$name$with$dollar$sign"); | |
| // https://cdecl.org/?q=int+%28*get_multiply_function%28%29%29%28int%2C+int%29: | |
| // declare foo as function returning pointer to function (int, int) returning | |
| // int | |
| CRUBIT_MUST_BIND int (*get_pointer_to_multiply_function())(int, int); | |
| // Same as above, but returning a *reference* to a function. | |
| CRUBIT_MUST_BIND int (&get_reference_to_multiply_function())(int, int); | |
| CRUBIT_MUST_BIND inline int (*inline_get_pointer_to_multiply_function())(int, | |
| int) { | |
| return multiply; | |
| } | |
| CRUBIT_MUST_BIND inline int apply_binary_op(int x, int y, int (*op)(int, int)) { | |
| return op(x, y); | |
| } | |
| // TODO(b/217419782): Add testcases for pointers to functions that take or | |
| // return takes/returns non-trivially-movable types by value. In particular, | |
| // some function signatures might require going through a C++ thunk - such | |
| // function pointers can't work without a thunk. See also | |
| // <internal link> | |
| #endif // CRUBIT_RS_BINDINGS_FROM_CC_TEST_FUNCTION_SIMPLE_SIMPLE_FUNCTIONS_H_ |