aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/backend/rust-builtins.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/rust/backend/rust-builtins.h')
-rw-r--r--gcc/rust/backend/rust-builtins.h120
1 files changed, 12 insertions, 108 deletions
diff --git a/gcc/rust/backend/rust-builtins.h b/gcc/rust/backend/rust-builtins.h
index 5cd8401..e421fa4 100644
--- a/gcc/rust/backend/rust-builtins.h
+++ b/gcc/rust/backend/rust-builtins.h
@@ -78,88 +78,18 @@ namespace Compile {
class BuiltinsContext
{
public:
- static BuiltinsContext &get ()
- {
- static BuiltinsContext instance;
- return instance;
- }
+ static BuiltinsContext &get ();
- bool lookup_simple_builtin (const std::string &name, tree *builtin)
- {
- auto it = rust_intrinsic_to_gcc_builtin.find (name);
- if (it == rust_intrinsic_to_gcc_builtin.end ())
- return false;
-
- return lookup_gcc_builtin (it->second, builtin);
- }
+ bool lookup_simple_builtin (const std::string &name, tree *builtin);
private:
- static const int builtin_const = 1 << 0;
- static const int builtin_noreturn = 1 << 1;
- static const int builtin_novops = 1 << 2;
-
- BuiltinsContext () { setup (); }
-
- void setup_overflow_fns ()
- {
- tree overflow_type
- = build_varargs_function_type_list (boolean_type_node, NULL_TREE);
-
- define_builtin ("add_overflow", BUILT_IN_ADD_OVERFLOW,
- "__builtin_add_overflow", "add_overflow", overflow_type, 0);
- define_builtin ("sub_overflow", BUILT_IN_SUB_OVERFLOW,
- "__builtin_sub_overflow", "sub_overflow", overflow_type, 0);
- define_builtin ("mul_overflow", BUILT_IN_MUL_OVERFLOW,
- "__builtin_mul_overflow", "mul_overflow", overflow_type, 0);
- }
-
- void setup_math_fns ()
- {
- tree math_function_type_f32
- = build_function_type_list (float_type_node, float_type_node, NULL_TREE);
-
- define_builtin ("sinf32", BUILT_IN_SINF, "__builtin_sinf", "sinf",
- math_function_type_f32, builtin_const);
- define_builtin ("sqrtf32", BUILT_IN_SQRTF, "__builtin_sqrtf", "sqrtf",
- math_function_type_f32, builtin_const);
- }
-
- void setup ()
- {
- setup_math_fns ();
- setup_overflow_fns ();
-
- define_builtin ("unreachable", BUILT_IN_UNREACHABLE,
- "__builtin_unreachable", NULL,
- build_function_type (void_type_node, void_list_node),
- builtin_const | builtin_noreturn);
-
- define_builtin ("abort", BUILT_IN_ABORT, "__builtin_abort", "abort",
- build_function_type (void_type_node, void_list_node),
- builtin_const | builtin_noreturn);
-
- define_builtin ("breakpoint", BUILT_IN_TRAP, "__builtin_trap", "breakpoint",
- build_function_type (void_type_node, void_list_node),
- builtin_const | builtin_noreturn);
-
- define_builtin (
- "memcpy", BUILT_IN_MEMCPY, "__builtin_memcpy", "memcpy",
- build_function_type_list (build_pointer_type (void_type_node),
- build_pointer_type (void_type_node),
- build_pointer_type (void_type_node),
- size_type_node, NULL_TREE),
- 0);
- }
-
- static void handle_flags (tree decl, int flags)
- {
- if (flags & builtin_const)
- TREE_READONLY (decl) = 1;
- if (flags & builtin_noreturn)
- TREE_READONLY (decl) = 1;
- if (flags & builtin_novops)
- DECL_IS_NOVOPS (decl) = 1;
- }
+ BuiltinsContext ();
+
+ void setup_overflow_fns ();
+
+ void setup_math_fns ();
+
+ void setup ();
// Define a builtin function. BCODE is the builtin function code
// defined by builtins.def. NAME is the name of the builtin function.
@@ -169,35 +99,9 @@ private:
// NORETURN_P is true if the function has the noreturn attribute.
void define_builtin (const std::string rust_name, built_in_function bcode,
const char *name, const char *libname, tree fntype,
- int flags)
- {
- tree decl = add_builtin_function (name, fntype, bcode, BUILT_IN_NORMAL,
- libname, NULL_TREE);
- handle_flags (decl, flags);
- set_builtin_decl (bcode, decl, true);
-
- this->builtin_functions_[name] = decl;
- if (libname != NULL)
- {
- decl = add_builtin_function (libname, fntype, bcode, BUILT_IN_NORMAL,
- NULL, NULL_TREE);
- handle_flags (decl, flags);
-
- this->builtin_functions_[libname] = decl;
- }
-
- rust_intrinsic_to_gcc_builtin[rust_name] = name;
- }
-
- bool lookup_gcc_builtin (const std::string &name, tree *builtin)
- {
- auto it = builtin_functions_.find (name);
- if (it == builtin_functions_.end ())
- return false;
-
- *builtin = it->second;
- return true;
- }
+ int flags);
+
+ bool lookup_gcc_builtin (const std::string &name, tree *builtin);
// A mapping of the GCC built-ins exposed to GCC Rust.
std::map<std::string, tree> builtin_functions_;