Index: gcc/target.def
===================================================================
--- gcc/target.def	2015-06-30 21:57:42.678281095 +0100
+++ gcc/target.def	2015-06-30 21:57:42.674281140 +0100
@@ -5877,6 +5877,11 @@ HOOK_VECTOR_END (mode_switching)
 #include "target-insns.def"
 #undef DEF_TARGET_INSN
 
+#define DEF_TARGET_INSN(NAME, PROTO) \
+  DEFHOOKPOD (code_for_##NAME, "*", enum insn_code, CODE_FOR_nothing)
+#include "target-insns.def"
+#undef DEF_TARGET_INSN
+
 /* Close the 'struct gcc_target' definition.  */
 HOOK_VECTOR_END (C90_EMPTY_HACK)
 
Index: gcc/gentarget-def.c
===================================================================
--- gcc/gentarget-def.c	2015-06-30 21:57:42.678281095 +0100
+++ gcc/gentarget-def.c	2015-06-30 21:57:42.674281140 +0100
@@ -189,6 +189,13 @@ def_target_insn (const char *name, const
     printf ("invalid_%s\n", suffix);
   else
     printf ("target_gen_%s\n", name);
+
+  printf ("#undef TARGET_CODE_FOR_%s\n", upper_name);
+  printf ("#define TARGET_CODE_FOR_%s ", upper_name);
+  if (truth == 0)
+    printf ("CODE_FOR_nothing\n");
+  else
+    printf ("CODE_FOR_%s\n", name);
 }
 
 int
Index: gcc/defaults.h
===================================================================
--- gcc/defaults.h	2015-06-30 21:57:42.678281095 +0100
+++ gcc/defaults.h	2015-06-30 21:57:42.670281186 +0100
@@ -1426,16 +1426,6 @@ #define STACK_CHECK_MAX_VAR_SIZE (STACK_
 #define TARGET_VTABLE_USES_DESCRIPTORS 0
 #endif
 
-#ifndef HAVE_tablejump
-#define HAVE_tablejump 0
-static inline rtx
-gen_tablejump (rtx, rtx)
-{
-  gcc_unreachable ();
-  return NULL;
-}
-#endif
-
 #endif /* GCC_INSN_FLAGS_H  */
 
 #endif  /* ! GCC_DEFAULTS_H */
Index: gcc/target-insns.def
===================================================================
--- gcc/target-insns.def	2015-06-30 21:57:42.678281095 +0100
+++ gcc/target-insns.def	2015-06-30 21:57:42.674281140 +0100
@@ -31,6 +31,7 @@
 
    Instructions should be documented in md.texi rather than here.  */
 DEF_TARGET_INSN (canonicalize_funcptr_for_compare, (rtx x0, rtx x1))
+DEF_TARGET_INSN (casesi, (rtx x0, rtx x1, rtx x2, rtx x3, rtx x4))
 DEF_TARGET_INSN (epilogue, (void))
 DEF_TARGET_INSN (jump, (rtx x0))
 DEF_TARGET_INSN (load_multiple, (rtx x0, rtx x1, rtx x2))
@@ -42,3 +43,4 @@ DEF_TARGET_INSN (return, (void))
 DEF_TARGET_INSN (sibcall_epilogue, (void))
 DEF_TARGET_INSN (simple_return, (void))
 DEF_TARGET_INSN (store_multiple, (rtx x0, rtx x1, rtx x2))
+DEF_TARGET_INSN (tablejump, (rtx x0, rtx x1))
Index: gcc/expr.c
===================================================================
--- gcc/expr.c	2015-06-30 21:57:42.678281095 +0100
+++ gcc/expr.c	2015-06-30 21:57:42.670281186 +0100
@@ -11058,14 +11058,6 @@ do_store_flag (sepops ops, rtx target, m
 				 && !TYPE_UNSIGNED (ops->type)) ? -1 : 1);
 }
 
-
-/* Stubs in case we haven't got a casesi insn.  */
-#ifndef HAVE_casesi
-# define HAVE_casesi 0
-# define gen_casesi(a, b, c, d, e) (0)
-# define CODE_FOR_casesi CODE_FOR_nothing
-#endif
-
 /* Attempt to generate a casesi instruction.  Returns 1 if successful,
    0 otherwise (i.e. if there is no casesi instruction).
 
@@ -11080,7 +11072,7 @@ try_casesi (tree index_type, tree index_
   machine_mode index_mode = SImode;
   rtx op1, op2, index;
 
-  if (! HAVE_casesi)
+  if (! targetm.have_casesi ())
     return 0;
 
   /* Convert the index to SImode.  */
@@ -11124,7 +11116,7 @@ try_casesi (tree index_type, tree index_
   create_fixed_operand (&ops[4], (default_label
 				  ? default_label
 				  : fallback_label));
-  expand_jump_insn (CODE_FOR_casesi, 5, ops);
+  expand_jump_insn (targetm.code_for_casesi, 5, ops);
   return 1;
 }
 
@@ -11197,7 +11189,7 @@ do_tablejump (rtx index, machine_mode mo
   vector = gen_const_mem (CASE_VECTOR_MODE, index);
   convert_move (temp, vector, 0);
 
-  emit_jump_insn (gen_tablejump (temp, table_label));
+  emit_jump_insn (targetm.gen_tablejump (temp, table_label));
 
   /* If we are generating PIC code or if the table is PC-relative, the
      table and JUMP_INSN must be adjacent, so don't output a BARRIER.  */
@@ -11211,7 +11203,7 @@ try_tablejump (tree index_type, tree ind
 {
   rtx index;
 
-  if (! HAVE_tablejump)
+  if (! targetm.have_tablejump ())
     return 0;
 
   index_expr = fold_build2 (MINUS_EXPR, index_type,
Index: gcc/stmt.c
===================================================================
--- gcc/stmt.c	2015-06-30 21:57:42.678281095 +0100
+++ gcc/stmt.c	2015-06-30 21:57:42.670281186 +0100
@@ -780,10 +780,6 @@ dump_case_nodes (FILE *f, struct case_no
   dump_case_nodes (f, root->right, indent_step, indent_level);
 }
 
-#ifndef HAVE_casesi
-#define HAVE_casesi 0
-#endif
-
 /* Return the smallest number of different values for which it is best to use a
    jump-table instead of a tree of conditional branches.  */
 
@@ -812,7 +808,7 @@ expand_switch_as_decision_tree_p (tree r
 
   /* If neither casesi or tablejump is available, or flag_jump_tables
      over-ruled us, we really have no choice.  */
-  if (!HAVE_casesi && !HAVE_tablejump)
+  if (!targetm.have_casesi () && !targetm.have_tablejump ())
     return true;
   if (!flag_jump_tables)
     return true;
@@ -1291,7 +1287,7 @@ expand_sjlj_dispatch_table (rtx dispatch
      of expanding as a decision tree or dispatch table vs. the "new
      way" with decrement chain or dispatch table.  */
   if (dispatch_table.length () <= 5
-      || (!HAVE_casesi && !HAVE_tablejump)
+      || (!targetm.have_casesi () && !targetm.have_tablejump ())
       || !flag_jump_tables)
     {
       /* Expand the dispatch as a decrement chain:
Index: gcc/targhooks.c
===================================================================
--- gcc/targhooks.c	2015-06-30 21:57:42.678281095 +0100
+++ gcc/targhooks.c	2015-06-30 21:57:42.674281140 +0100
@@ -1339,10 +1339,6 @@ default_target_can_inline_p (tree caller
   return ret;
 }
 
-#ifndef HAVE_casesi
-# define HAVE_casesi 0
-#endif
-
 /* If the machine does not have a case insn that compares the bounds,
    this means extra overhead for dispatch tables, which raises the
    threshold for using them.  */
@@ -1350,7 +1346,7 @@ default_target_can_inline_p (tree caller
 unsigned int
 default_case_values_threshold (void)
 {
-  return (HAVE_casesi ? 4 : 5);
+  return (targetm.have_casesi () ? 4 : 5);
 }
 
 bool
