aboutsummaryrefslogtreecommitdiff
path: root/gcc/is-a.h
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2017-08-30 11:18:37 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2017-08-30 11:18:37 +0000
commitd305ca88fc9b180a1790e02b144e921d17b393f0 (patch)
treea2c9e2b70bbf121f659d36303df886bad0895c81 /gcc/is-a.h
parent2123a9a50fb35109af6c2ba3bcfd71a1d5432954 (diff)
downloadgcc-d305ca88fc9b180a1790e02b144e921d17b393f0.zip
gcc-d305ca88fc9b180a1790e02b144e921d17b393f0.tar.gz
gcc-d305ca88fc9b180a1790e02b144e921d17b393f0.tar.bz2
[59/77] Add a rtx_jump_table_data::get_data_mode helper
This patch adds a helper function to get the mode of the addresses or offsets in a jump table. It also changes the final.c code to use rtx_jump_table_data over rtx or rtx_insn in cases where it needed to use the new helper. This in turn meant adding a safe_dyn_cast equivalent of safe_as_a, to cope with null NEXT_INSNs. 2017-08-30 Richard Sandiford <richard.sandiford@linaro.org> Alan Hayward <alan.hayward@arm.com> David Sherwood <david.sherwood@arm.com> gcc/ * is-a.h (safe_dyn_cast): New function. * rtl.h (rtx_jump_table_data::get_data_mode): New function. (jump_table_for_label): Likewise. * final.c (final_addr_vec_align): Take an rtx_jump_table_data * instead of an rtx_insn *. (shorten_branches): Use dyn_cast instead of LABEL_P and JUMP_TABLE_DATA_P. Use jump_table_for_label and rtx_jump_table_data::get_data_mode. (final_scan_insn): Likewise. Co-Authored-By: Alan Hayward <alan.hayward@arm.com> Co-Authored-By: David Sherwood <david.sherwood@arm.com> From-SVN: r251511
Diffstat (limited to 'gcc/is-a.h')
-rw-r--r--gcc/is-a.h14
1 files changed, 14 insertions, 0 deletions
diff --git a/gcc/is-a.h b/gcc/is-a.h
index b4e5279..2adc740 100644
--- a/gcc/is-a.h
+++ b/gcc/is-a.h
@@ -103,6 +103,11 @@ TYPE dyn_cast <TYPE> (pointer)
Note that we have converted two sets of assertions in the calls to varpool
into safe and efficient use of a variable.
+TYPE safe_dyn_cast <TYPE> (pointer)
+
+ Like dyn_cast <TYPE> (pointer), except that it accepts null pointers
+ and returns null results for them.
+
If you use these functions and get a 'inline function not defined' or a
'missing symbol' error message for 'is_a_helper<....>::test', it means that
@@ -222,4 +227,13 @@ dyn_cast (U *p)
return static_cast <T> (0);
}
+/* Similar to dyn_cast, except that the pointer may be null. */
+
+template <typename T, typename U>
+inline T
+safe_dyn_cast (U *p)
+{
+ return p ? dyn_cast <T> (p) : 0;
+}
+
#endif /* GCC_IS_A_H */