]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/brig/brigfrontend/brig-arg-block-handler.cc
Update copyright years.
[thirdparty/gcc.git] / gcc / brig / brigfrontend / brig-arg-block-handler.cc
CommitLineData
55a56509 1/* brig-arg-block-handler.cc -- brig arg block start/end directive handling
fbd26352 2 Copyright (C) 2016-2019 Free Software Foundation, Inc.
55a56509 3 Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
4 for General Processor Tech.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
21
22#include "brig-code-entry-handler.h"
23#include "tree-iterator.h"
24#include "system.h"
25#include "errors.h"
26
27#include "tree-pretty-print.h"
28#include "print-tree.h"
29
30size_t
31brig_directive_arg_block_handler::operator () (const BrigBase *base)
32{
33 if (base->kind == BRIG_KIND_DIRECTIVE_ARG_BLOCK_START)
34 {
35 /* Initiate a new code block for the call site. */
36 tree stmt_list = alloc_stmt_list ();
37 tree bind_expr
38 = build3 (BIND_EXPR, void_type_node, NULL, stmt_list, NULL);
39 tree block = make_node (BLOCK);
40 BIND_EXPR_BLOCK (bind_expr) = block;
41 static int block_id = 0;
42 BLOCK_NUMBER (block) = block_id++;
43 TREE_USED (block) = 1;
44 tree m_parentblock = DECL_INITIAL (m_parent.m_cf->m_func_decl);
45 BLOCK_SUPERCONTEXT (block) = m_parentblock;
46
47 chainon (BLOCK_SUBBLOCKS (m_parentblock), block);
48
49 m_parent.m_cf->m_current_bind_expr = bind_expr;
50 m_parent.m_cf->m_generating_arg_block = true;
51 }
52 else if (base->kind == BRIG_KIND_DIRECTIVE_ARG_BLOCK_END)
53 {
54 /* Restore the used bind expression back to the function
55 scope. */
56 tree new_bind_expr = m_parent.m_cf->m_current_bind_expr;
57 m_parent.m_cf->m_current_bind_expr
58 = DECL_SAVED_TREE (m_parent.m_cf->m_func_decl);
59 m_parent.m_cf->append_statement (new_bind_expr);
60 m_parent.m_cf->m_generating_arg_block = false;
61 }
62 else
63 gcc_unreachable ();
64
65 return base->byteCount;
66}