aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/backend/rust-tree.cc
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2022-03-09 14:37:47 +0000
committerPhilip Herron <philip.herron@embecosm.com>2022-03-10 11:40:02 +0000
commita08ac0c27aed0c6d390d03656b708eb71381a5e9 (patch)
tree2de46126aaff38e8ef503952f299f164d6788f75 /gcc/rust/backend/rust-tree.cc
parent865b6090a8f8981cdfc050ea2ee44abbe92de141 (diff)
downloadgcc-a08ac0c27aed0c6d390d03656b708eb71381a5e9.zip
gcc-a08ac0c27aed0c6d390d03656b708eb71381a5e9.tar.gz
gcc-a08ac0c27aed0c6d390d03656b708eb71381a5e9.tar.bz2
Add support for the rust offset intrinsic
This patch adds the initial support for generic intrinsics these are do not map directly to GCC builtins and need to be substited with their specificed types. This patch allows for custom implementation body for these functions by specifying handler functions which will generate the applicable intrinsic when asked for. Addresses #658
Diffstat (limited to 'gcc/rust/backend/rust-tree.cc')
-rw-r--r--gcc/rust/backend/rust-tree.cc18
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/rust/backend/rust-tree.cc b/gcc/rust/backend/rust-tree.cc
index 8e39408..6f7614d 100644
--- a/gcc/rust/backend/rust-tree.cc
+++ b/gcc/rust/backend/rust-tree.cc
@@ -17,6 +17,7 @@
// <http://www.gnu.org/licenses/>.
#include "rust-tree.h"
+#include "fold-const.h"
#include "stringpool.h"
#include "attribs.h"
#include "escaped_string.h"
@@ -656,4 +657,21 @@ get_fndecl_from_callee (tree fn)
return NULL_TREE;
}
+tree
+pointer_offset_expression (tree base_tree, tree index_tree, location_t location)
+{
+ tree element_type_tree = TREE_TYPE (TREE_TYPE (base_tree));
+ if (base_tree == error_mark_node || TREE_TYPE (base_tree) == error_mark_node
+ || index_tree == error_mark_node || element_type_tree == error_mark_node)
+ return error_mark_node;
+
+ tree element_size = TYPE_SIZE_UNIT (element_type_tree);
+ index_tree = fold_convert_loc (location, sizetype, index_tree);
+ tree offset
+ = fold_build2_loc (location, MULT_EXPR, sizetype, index_tree, element_size);
+
+ return fold_build2_loc (location, POINTER_PLUS_EXPR, TREE_TYPE (base_tree),
+ base_tree, offset);
+}
+
} // namespace Rust