GCC Middle and Back End API Reference
multiple_target.cc File Reference
#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "backend.h"
#include "tree.h"
#include "stringpool.h"
#include "gimple.h"
#include "diagnostic-core.h"
#include "gimple-ssa.h"
#include "cgraph.h"
#include "tree-pass.h"
#include "target.h"
#include "attribs.h"
#include "pretty-print.h"
#include "gimple-iterator.h"
#include "gimple-walk.h"
#include "tree-inline.h"
#include "intl.h"
Include dependency graph for multiple_target.cc:

Functions

static tree replace_function_decl (tree *op, int *walk_subtrees, void *data)
 
static void create_dispatcher_calls (struct cgraph_node *node)
 
static int get_attr_str (tree arglist, char *attr_str)
 
static int separate_attrs (char *attr_str, char **attrs, int attrnum)
 
static bool is_valid_asm_symbol (char c)
 
static void create_new_asm_name (char *old_asm_name, char *new_asm_name)
 
static cgraph_nodecreate_target_clone (cgraph_node *node, bool definition, char *name, tree attributes)
 
static bool expand_target_clones (struct cgraph_node *node, bool definition)
 
static void redirect_to_specific_clone (cgraph_node *node)
 
static unsigned int ipa_target_clone (void)
 
simple_ipa_opt_passmake_pass_target_clone (gcc::context *ctxt)
 

Function Documentation

◆ create_dispatcher_calls()

◆ create_new_asm_name()

static void create_new_asm_name ( char * old_asm_name,
char * new_asm_name )
static
Replace all not valid assembler symbols with '_'.

References i, and is_valid_asm_symbol().

Referenced by expand_target_clones().

◆ create_target_clone()

static cgraph_node * create_target_clone ( cgraph_node * node,
bool definition,
char * name,
tree attributes )
static

◆ expand_target_clones()

◆ get_attr_str()

static int get_attr_str ( tree arglist,
char * attr_str )
static
Create string with attributes separated by TARGET_CLONES_ATTR_SEPARATOR. Return number of attributes.

References TARGET_CLONES_ATTR_SEPARATOR, TREE_CHAIN, TREE_STRING_POINTER, and TREE_VALUE.

Referenced by expand_target_clones().

◆ ipa_target_clone()

◆ is_valid_asm_symbol()

static bool is_valid_asm_symbol ( char c)
static
Return true if symbol is valid in assembler name.

Referenced by create_new_asm_name().

◆ make_pass_target_clone()

simple_ipa_opt_pass * make_pass_target_clone ( gcc::context * ctxt)

◆ redirect_to_specific_clone()

static void redirect_to_specific_clone ( cgraph_node * node)
static
When NODE is a target clone, consider all callees and redirect to a clone with equal target attributes. That prevents multiple multi-versioning dispatches and a call-chain can be optimized. This optimisation might pick the wrong version in some cases, since knowing that we meet the target requirements for a matching callee version does not tell us that we won't also meet the target requirements for a higher priority callee version at runtime. Since this is longstanding behaviour for x86 and powerpc, we preserve it for those targets, but skip the optimisation for targets that use the "target_version" attribute for multi-versioning.

References attribute_value_equal(), cgraph_node::callees, symtab_node::decl, DECL_ATTRIBUTES, cgraph_node::function_version(), gcc_assert, lookup_attribute(), cgraph_function_version_info::next, cgraph_edge::next_callee, NULL, NULL_TREE, cgraph_function_version_info::prev, cgraph_edge::redirect_call_stmt_to_callee(), TARGET_HAS_FMV_TARGET_ATTRIBUTE, and cgraph_function_version_info::this_node.

Referenced by ipa_target_clone().

◆ replace_function_decl()

static tree replace_function_decl ( tree * op,
int * walk_subtrees,
void * data )
static
Pass for parsing functions with multiple target attributes. Contributed by Evgeny Stupachenko <evstupac@gmail.com> Copyright (C) 2015-2025 Free Software Foundation, Inc. This file is part of GCC. GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC; see the file COPYING3. If not see <http://www.gnu.org/licenses/>.
Walker callback that replaces all FUNCTION_DECL of a function that's going to be versioned.

References walk_stmt_info::info, NULL, and TREE_CODE.

Referenced by create_dispatcher_calls().

◆ separate_attrs()

static int separate_attrs ( char * attr_str,
char ** attrs,
int attrnum )
static
Return number of attributes separated by TARGET_CLONES_ATTR_SEPARATOR and put them into ARGS. If there is no DEFAULT attribute return -1. If there is an empty string in attribute return -2. If there are multiple DEFAULT attributes return -3.

References i, NULL, and TARGET_CLONES_ATTR_SEPARATOR.

Referenced by expand_target_clones().