diff options
author | Richard Sandiford <richard.sandiford@linaro.org> | 2018-05-17 10:52:58 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2018-05-17 10:52:58 +0000 |
commit | e4f81565ce768256ff3f7acc368c38fa450098cc (patch) | |
tree | 0a8bc7b8cca8bc8c488119cf5a5f80dd27acc639 /gcc/internal-fn.c | |
parent | eb69361d0c5e98423e7ad7a537bc3250e083de4a (diff) | |
download | gcc-e4f81565ce768256ff3f7acc368c38fa450098cc.zip gcc-e4f81565ce768256ff3f7acc368c38fa450098cc.tar.gz gcc-e4f81565ce768256ff3f7acc368c38fa450098cc.tar.bz2 |
Gimple FE support for internal functions
This patch gets the gimple FE to parse calls to internal functions.
The only non-obvious thing was how the functions should be written
to avoid clashes with real function names. One option would be to
go the magic number of underscores route, but we already do that for
built-in functions, and it would be good to keep them visually
distinct. In the end I borrowed the local/internal label convention
from asm and used:
x = .SQRT (y);
2018-05-17 Richard Sandiford <richard.sandiford@linaro.org>
gcc/
* internal-fn.h (lookup_internal_fn): Declare
* internal-fn.c (lookup_internal_fn): New function.
* gimple.c (gimple_build_call_from_tree): Handle calls to
internal functions.
* gimple-pretty-print.c (dump_gimple_call): Print "." before
internal function names.
* tree-pretty-print.c (dump_generic_node): Likewise.
* tree-ssa-scopedtables.c (expr_hash_elt::print): Likewise.
gcc/c/
* gimple-parser.c: Include internal-fn.h.
(c_parser_gimple_statement): Treat a leading CPP_DOT as a call.
(c_parser_gimple_call_internal): New function.
(c_parser_gimple_postfix_expression): Use it to handle CPP_DOT.
Fix typos in comment.
gcc/testsuite/
* gcc.dg/gimplefe-28.c: New test.
* gcc.dg/asan/use-after-scope-9.c: Adjust expected output for
internal function calls.
* gcc.dg/goacc/loop-processing-1.c: Likewise.
From-SVN: r260316
Diffstat (limited to 'gcc/internal-fn.c')
-rw-r--r-- | gcc/internal-fn.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/gcc/internal-fn.c b/gcc/internal-fn.c index da205c9..ba94a61 100644 --- a/gcc/internal-fn.c +++ b/gcc/internal-fn.c @@ -64,6 +64,26 @@ const int internal_fn_flags_array[] = { 0 }; +/* Return the internal function called NAME, or IFN_LAST if there's + no such function. */ + +internal_fn +lookup_internal_fn (const char *name) +{ + typedef hash_map<nofree_string_hash, internal_fn> name_to_fn_map_type; + static name_to_fn_map_type *name_to_fn_map; + + if (!name_to_fn_map) + { + name_to_fn_map = new name_to_fn_map_type (IFN_LAST); + for (unsigned int i = 0; i < IFN_LAST; ++i) + name_to_fn_map->put (internal_fn_name (internal_fn (i)), + internal_fn (i)); + } + internal_fn *entry = name_to_fn_map->get (name); + return entry ? *entry : IFN_LAST; +} + /* Fnspec of each internal function, indexed by function number. */ const_tree internal_fn_fnspec_array[IFN_LAST + 1]; |