本文整理汇总了C++中DECL_STRUCT_FUNCTION函数的典型用法代码示例。如果您正苦于以下问题:C++ DECL_STRUCT_FUNCTION函数的具体用法?C++ DECL_STRUCT_FUNCTION怎么用?C++ DECL_STRUCT_FUNCTION使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了DECL_STRUCT_FUNCTION函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: getSize
int getSize(char *name) {
struct cgraph_node *node;
basic_block bb;
gimple statement;
enum gimple_code code;
gimple_stmt_iterator gsi;
int size = 0;
for (node = cgraph_nodes; node; node = node->next) {
/* Nodes without a body, and clone nodes are not interesting. */
if (!gimple_has_body_p(node->decl) || node->clone_of)
continue;
if (strcmp(cgraph_node_name(node), name) == 0) {
set_cfun(DECL_STRUCT_FUNCTION(node->decl));
//fprintf(stderr, "%s --> ", cgraph_node_name(node));
FOR_ALL_BB(bb) {
for (gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi)) {
statement = gsi_stmt(gsi);
code = gimple_code(statement);
//debug_gimple_stmt(statement);
if (code != GIMPLE_CALL) {
size++;
}
}
}
return size;
}
}
示例2: test_conversion_to_ssa
static void
test_conversion_to_ssa ()
{
/* As above, construct a trivial function, gimplify it, and build a CFG: */
tree fndecl = build_trivial_high_gimple_function ();
function *fun = DECL_STRUCT_FUNCTION (fndecl);
ASSERT_TRUE (fun != NULL);
build_cfg (fndecl);
convert_to_ssa (fndecl);
verify_three_block_gimple_cfg (fun);
/* For out trivial test function we should now have something like
this:
test_fn ()
{
<bb 2>:
_1 = 42;
return _1;
}
*/
basic_block bb2 = get_real_block (fun);
gimple *stmt_a = gimple_seq_first_stmt (bb_seq (bb2));
ASSERT_EQ (GIMPLE_ASSIGN, gimple_code (stmt_a));
gimple *stmt_b = stmt_a->next;
ASSERT_EQ (GIMPLE_RETURN, gimple_code (stmt_b));
ASSERT_EQ (NULL, stmt_b->next);
greturn *return_stmt = as_a <greturn *> (stmt_b);
ASSERT_EQ (SSA_NAME, TREE_CODE (gimple_return_retval (return_stmt)));
}
示例3: record_vars_into
void
record_vars_into (tree vars, tree fn)
{
bool change_cfun = fn != current_function_decl;
if (change_cfun)
push_cfun (DECL_STRUCT_FUNCTION (fn));
for (; vars; vars = DECL_CHAIN (vars))
{
tree var = vars;
/* BIND_EXPRs contains also function/type/constant declarations
we don't need to care about. */
if (TREE_CODE (var) != VAR_DECL)
continue;
/* Nothing to do in this case. */
if (DECL_EXTERNAL (var))
continue;
/* Record the variable. */
add_local_decl (cfun, var);
}
if (change_cfun)
pop_cfun ();
}
示例4: call_graph_add_fn
static void
call_graph_add_fn (tree fndecl)
{
const tree outer = current_function_decl;
struct function *f = DECL_STRUCT_FUNCTION (fndecl);
gcc_assert (TREE_CODE (fndecl) == FUNCTION_DECL);
f->is_cilk_function = 1;
f->curr_properties = cfun->curr_properties;
gcc_assert (cfun == DECL_STRUCT_FUNCTION (outer));
gcc_assert (cfun->decl == outer);
push_cfun (f);
cgraph_node::create (fndecl);
pop_cfun_to (outer);
}
示例5: set_callers_may_not_allocate_frame
static void
set_callers_may_not_allocate_frame (function *fn)
{
basic_block bb;
gimple_stmt_iterator gsi;
gimple *stmt;
tree called_fn_tree;
function *called_fn;
if (fn->cfg == NULL)
return;
FOR_EACH_BB_FN (bb, fn)
{
for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
{
stmt = gsi_stmt (gsi);
if (is_gimple_call (stmt))
{
called_fn_tree = gimple_call_fndecl (stmt);
if (called_fn_tree != NULL)
{
called_fn = DECL_STRUCT_FUNCTION (called_fn_tree);
if (called_fn != NULL)
called_fn->machine->callers_may_not_allocate_frame = true;
}
}
}
}
return;
}
示例6: pop_cfun_to
static void
pop_cfun_to (tree outer)
{
pop_cfun ();
current_function_decl = outer;
gcc_assert (cfun == DECL_STRUCT_FUNCTION (current_function_decl));
gcc_assert (cfun->decl == current_function_decl);
}
示例7: build_function
static void
build_function (tree fndecl, tree stmts, tree block)
{
DECL_INITIAL(fndecl) = block;
DECL_SAVED_TREE (fndecl) = stmts ;
tree resdecl = build_decl(input_location,RESULT_DECL, NULL_TREE, integer_type_node);
DECL_CONTEXT (resdecl) = fndecl;
DECL_RESULT(fndecl) = resdecl;
current_function_decl = fndecl;
if (DECL_STRUCT_FUNCTION(fndecl) == NULL)
push_struct_function(fndecl);
else
push_cfun(DECL_STRUCT_FUNCTION(fndecl));
cfun->function_end_locus = BUILTINS_LOCATION;
}
示例8: compute_call_stmt_bb_frequency
/* Computes the frequency of the call statement so that it can be stored in
cgraph_edge. BB is the basic block of the call statement. */
int
compute_call_stmt_bb_frequency (tree decl, basic_block bb)
{
int entry_freq = ENTRY_BLOCK_PTR_FOR_FN
(DECL_STRUCT_FUNCTION (decl))->frequency;
int freq = bb->frequency;
if (profile_status_for_fn (DECL_STRUCT_FUNCTION (decl)) == PROFILE_ABSENT)
return CGRAPH_FREQ_BASE;
if (!entry_freq)
entry_freq = 1, freq++;
freq = freq * CGRAPH_FREQ_BASE / entry_freq;
if (freq > CGRAPH_FREQ_MAX)
freq = CGRAPH_FREQ_MAX;
return freq;
}
示例9: afdo_indirect_call
static void
afdo_indirect_call (gimple_stmt_iterator *gsi, const icall_target_map &map,
bool transform)
{
gimple gs = gsi_stmt (*gsi);
tree callee;
if (map.size () == 0)
return;
gcall *stmt = dyn_cast <gcall *> (gs);
if ((!stmt) || gimple_call_fndecl (stmt) != NULL_TREE)
return;
callee = gimple_call_fn (stmt);
histogram_value hist = gimple_alloc_histogram_value (
cfun, HIST_TYPE_INDIR_CALL, stmt, callee);
hist->n_counters = 3;
hist->hvalue.counters = XNEWVEC (gcov_type, hist->n_counters);
gimple_add_histogram_value (cfun, stmt, hist);
gcov_type total = 0;
icall_target_map::const_iterator max_iter = map.end ();
for (icall_target_map::const_iterator iter = map.begin ();
iter != map.end (); ++iter)
{
total += iter->second;
if (max_iter == map.end () || max_iter->second < iter->second)
max_iter = iter;
}
hist->hvalue.counters[0]
= (unsigned long long)afdo_string_table->get_name (max_iter->first);
hist->hvalue.counters[1] = max_iter->second;
hist->hvalue.counters[2] = total;
if (!transform)
return;
struct cgraph_edge *indirect_edge
= cgraph_node::get (current_function_decl)->get_edge (stmt);
struct cgraph_node *direct_call = cgraph_node::get_for_asmname (
get_identifier ((const char *) hist->hvalue.counters[0]));
if (direct_call == NULL || !check_ic_target (stmt, direct_call))
return;
if (DECL_STRUCT_FUNCTION (direct_call->decl) == NULL)
return;
struct cgraph_edge *new_edge
= indirect_edge->make_speculative (direct_call, 0, 0);
new_edge->redirect_call_stmt_to_callee ();
gimple_remove_histogram_value (cfun, stmt, hist);
inline_call (new_edge, true, NULL, NULL, false);
}
示例10: convert_to_ssa
static void
convert_to_ssa (tree fndecl)
{
function *fun = DECL_STRUCT_FUNCTION (fndecl);
ASSERT_TRUE (fun != NULL);
ASSERT_EQ (fndecl, fun->decl);
gimple_opt_pass *build_ssa_pass = make_pass_build_ssa (g);
push_cfun (fun);
build_ssa_pass->execute (fun);
pop_cfun ();
}
示例11: symtab_nonoverwritable_alias
symtab_node *
symtab_nonoverwritable_alias (symtab_node *node)
{
tree new_decl;
symtab_node *new_node = NULL;
/* First try to look up existing alias or base object
(if that is already non-overwritable). */
node = symtab_alias_ultimate_target (node, NULL);
gcc_assert (!node->alias && !node->weakref);
symtab_for_node_and_aliases (node, symtab_nonoverwritable_alias_1,
(void *)&new_node, true);
if (new_node)
return new_node;
#ifndef ASM_OUTPUT_DEF
/* If aliases aren't supported by the assembler, fail. */
return NULL;
#endif
/* Otherwise create a new one. */
new_decl = copy_node (node->decl);
DECL_DLLIMPORT_P (new_decl) = 0;
DECL_NAME (new_decl) = clone_function_name (node->decl, "localalias");
if (TREE_CODE (new_decl) == FUNCTION_DECL)
DECL_STRUCT_FUNCTION (new_decl) = NULL;
DECL_INITIAL (new_decl) = NULL;
SET_DECL_ASSEMBLER_NAME (new_decl, DECL_NAME (new_decl));
SET_DECL_RTL (new_decl, NULL);
/* Update the properties. */
DECL_EXTERNAL (new_decl) = 0;
if (DECL_ONE_ONLY (node->decl))
DECL_SECTION_NAME (new_decl) = NULL;
DECL_COMDAT_GROUP (new_decl) = 0;
TREE_PUBLIC (new_decl) = 0;
DECL_COMDAT (new_decl) = 0;
DECL_WEAK (new_decl) = 0;
DECL_VIRTUAL_P (new_decl) = 0;
if (TREE_CODE (new_decl) == FUNCTION_DECL)
{
DECL_STATIC_CONSTRUCTOR (new_decl) = 0;
DECL_STATIC_DESTRUCTOR (new_decl) = 0;
new_node = cgraph_create_function_alias
(new_decl, node->decl);
}
else
new_node = varpool_create_variable_alias (new_decl,
node->decl);
symtab_resolve_alias (new_node, node);
gcc_assert (decl_binds_to_current_def_p (new_decl));
return new_node;
}
示例12: check_bb_profile
/* Check the consistency of profile information. We can't do that
in verify_flow_info, as the counts may get invalid for incompletely
solved graphs, later eliminating of conditionals or roundoff errors.
It is still practical to have them reported for debugging of simple
testcases. */
static void
check_bb_profile (basic_block bb, FILE * file, int indent, int flags)
{
edge e;
int sum = 0;
gcov_type lsum;
edge_iterator ei;
struct function *fun = DECL_STRUCT_FUNCTION (current_function_decl);
char *s_indent = (char *) alloca ((size_t) indent + 1);
memset ((void *) s_indent, ' ', (size_t) indent);
s_indent[indent] = '\0';
if (profile_status_for_function (fun) == PROFILE_ABSENT)
return;
if (bb != EXIT_BLOCK_PTR_FOR_FUNCTION (fun))
{
FOR_EACH_EDGE (e, ei, bb->succs)
sum += e->probability;
if (EDGE_COUNT (bb->succs) && abs (sum - REG_BR_PROB_BASE) > 100)
fprintf (file, "%s%sInvalid sum of outgoing probabilities %.1f%%\n",
(flags & TDF_COMMENT) ? ";; " : "", s_indent,
sum * 100.0 / REG_BR_PROB_BASE);
lsum = 0;
FOR_EACH_EDGE (e, ei, bb->succs)
lsum += e->count;
if (EDGE_COUNT (bb->succs)
&& (lsum - bb->count > 100 || lsum - bb->count < -100))
fprintf (file, "%s%sInvalid sum of outgoing counts %i, should be %i\n",
(flags & TDF_COMMENT) ? ";; " : "", s_indent,
(int) lsum, (int) bb->count);
}
if (bb != ENTRY_BLOCK_PTR_FOR_FUNCTION (fun))
{
sum = 0;
FOR_EACH_EDGE (e, ei, bb->preds)
sum += EDGE_FREQUENCY (e);
if (abs (sum - bb->frequency) > 100)
fprintf (file,
"%s%sInvalid sum of incoming frequencies %i, should be %i\n",
(flags & TDF_COMMENT) ? ";; " : "", s_indent,
sum, bb->frequency);
lsum = 0;
FOR_EACH_EDGE (e, ei, bb->preds)
lsum += e->count;
if (lsum - bb->count > 100 || lsum - bb->count < -100)
fprintf (file, "%s%sInvalid sum of incoming counts %i, should be %i\n",
(flags & TDF_COMMENT) ? ";; " : "", s_indent,
(int) lsum, (int) bb->count);
}
}
示例13: xml_local_decls
void xml_local_decls(int indent, FILE *out)
{
tree var;
fprintf(out, "%s<locals>\n", spc(indent));
indent += INDENT;
for (var = DECL_STRUCT_FUNCTION(current_function_decl)->local_decls;
var;
var = TREE_CHAIN(var))
xml_local_decl(TREE_VALUE(var), indent, out);
indent -= INDENT;
fprintf(out, "%s</locals>\n", spc(indent));
}
示例14: gimple_set_body
void
gimple_set_body (tree fndecl, gimple_seq seq)
{
struct function *fn = DECL_STRUCT_FUNCTION (fndecl);
if (fn == NULL)
{
/* If FNDECL still does not have a function structure associated
with it, then it does not make sense for it to receive a
GIMPLE body. */
gcc_assert (seq == NULL);
}
else
fn->gimple_body = seq;
}
示例15: analyze_function
static funct_state
analyze_function (struct cgraph_node *fn, bool ipa)
{
tree decl = fn->decl;
funct_state l;
basic_block this_block;
l = XCNEW (struct funct_state_d);
l->pure_const_state = IPA_CONST;
l->state_previously_known = IPA_NEITHER;
l->looping_previously_known = true;
l->looping = false;
l->can_throw = false;
state_from_flags (&l->state_previously_known, &l->looping_previously_known,
flags_from_decl_or_type (fn->decl),
fn->cannot_return_p ());
if (fn->thunk.thunk_p || fn->alias)
{
/* Thunk gets propagated through, so nothing interesting happens. */
gcc_assert (ipa);
return l;
}
if (dump_file)
{
fprintf (dump_file, "\n\n local analysis of %s\n ",
fn->name ());
}
push_cfun (DECL_STRUCT_FUNCTION (decl));
FOR_EACH_BB_FN (this_block, cfun)
{
gimple_stmt_iterator gsi;
struct walk_stmt_info wi;
memset (&wi, 0, sizeof (wi));
for (gsi = gsi_start_bb (this_block);
!gsi_end_p (gsi);
gsi_next (&gsi))
{
check_stmt (&gsi, l, ipa);
if (l->pure_const_state == IPA_NEITHER && l->looping && l->can_throw)
goto end;
}
}