I have another question along the same lines. Is it possible to tell gcc to
never delete a certain function even if it is never called in the executable?
Any help is greatly appreciated!
Thanks,
Balaji V. Iyer.
-Original Message-
From: Martin Jambor [mailto:mjam...@suse.cz]
Sent: Monday, March 26, 2012 8:52 AM
To: Iyer, Balaji V
Cc: 'gcc@gcc.gnu.org'
Subject: Re: Question about Tree_function_versioning
Hi,
On Mon, Mar 26, 2012 at 01:34:55AM +, Iyer, Balaji V wrote:
Hello Everyone,
I am currently trying to take certain functions (marked by certain
attributes) and create vector version along with the scalar versions
of the function. For example, let's say I have a function my_add that
is marked with a certain attribute, I am trying to clone it into
my_add_vector and still keep the original my_add. For this, I am
trying to use tree_function_versioning in cgraphunit.c to clone the
cgraph_node into a new function. Does this function actually create a
2nd function (called my_add_vector) and copy the body from my_add
function to the my_add_vector function or does it just create a node
called my_add_vector and then create a pointer to the body of the
my_add?
Is there a better approach for doing this?
tree_function_versioning indeed does copy the body of a function into a new
one, but that's the only thing it does. You might be better served by its
callers such as cgraph_function_versioning. But I believe all cloning
functions currently also make the new clone private to the current compilation
unit (and thus subject to unreachable node removal if they have no callers)
which is something you might not want. If it is a problem, you'd either need
to re-set the relevant decl and node attributes subsequently or change the
cloning functions themselves.
I assume you're not operating within an IPA pass, in that case you'd need
cgraph_create_virtual_clone and a transformation hook.
Martin