Add expr_callee_abi
authorRichard Sandiford <richard.sandiford@arm.com>
Mon, 14 Oct 2019 08:06:06 +0000 (08:06 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 14 Oct 2019 08:06:06 +0000 (08:06 +0000)
This turned out to be useful for the SVE PCS support, and is a natural
tree-level analogue of insn_callee_abi.

2019-10-14  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
* function-abi.h (expr_callee_abi): Declare.
* function-abi.cc (expr_callee_abi): New function.

From-SVN: r276952

gcc/ChangeLog
gcc/function-abi.cc
gcc/function-abi.h

index cf359bf58351bb9ad52c44686e4b18e2527edb58..e755803b12c1dab5dc6e3c6e66094c15b1ac0924 100644 (file)
@@ -1,3 +1,8 @@
+2019-10-14  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * function-abi.h (expr_callee_abi): Declare.
+       * function-abi.cc (expr_callee_abi): New function.
+
 2019-10-14  Aldy Hernandez  <aldyh@redhat.com>
 
        * tree-vrp.c (value_range_base::set): Normalize unsigned ~[0,0]
index eee789a29e8e1581d365508c2a8afc8f30024729..b4a18396367da24e953ed60b5197b52b574570e4 100644 (file)
@@ -229,3 +229,32 @@ insn_callee_abi (const rtx_insn *insn)
 
   return default_function_abi;
 }
+
+/* Return the ABI of the function called by CALL_EXPR EXP.  Return the
+   default ABI for erroneous calls.  */
+
+function_abi
+expr_callee_abi (const_tree exp)
+{
+  gcc_assert (TREE_CODE (exp) == CALL_EXPR);
+
+  if (tree fndecl = get_callee_fndecl (exp))
+    return fndecl_abi (fndecl);
+
+  tree callee = CALL_EXPR_FN (exp);
+  if (callee == error_mark_node)
+    return default_function_abi;
+
+  tree type = TREE_TYPE (callee);
+  if (type == error_mark_node)
+    return default_function_abi;
+
+  if (POINTER_TYPE_P (type))
+    {
+      type = TREE_TYPE (type);
+      if (type == error_mark_node)
+       return default_function_abi;
+    }
+
+  return fntype_abi (type);
+}
index 9bb4d1768b397e6085c995ed4cf2f3ddd3fb358b..96a49dfbea6e37f89c82a507a64939bdf37d9c27 100644 (file)
@@ -315,5 +315,6 @@ call_clobbered_in_region_p (unsigned int abis, const_hard_reg_set mask,
 extern const predefined_function_abi &fntype_abi (const_tree);
 extern function_abi fndecl_abi (const_tree);
 extern function_abi insn_callee_abi (const rtx_insn *);
+extern function_abi expr_callee_abi (const_tree);
 
 #endif