On Mon, Sep 26, 2011 at 9:22 AM, Nathan Froyd <nfr...@mozilla.com> wrote:
> On 9/23/2011 6:03 PM, Sriraman Tallam wrote:
>>
>> This patch adds a new linker plugin to re-order functions.
>
> This is great stuff.  We were experimenting with using the coverage files to
> generate an ordering for --section-ordering-file, but this might be even
> better, will have to experiment with it.
>
> A couple of comments on the code itself:
>
>> Index: function_reordering_plugin/callgraph.h
>> +inline static Edge_list *
>> +make_edge_list (Edge *e)
>> +{
>> +  Edge_list *list = (Edge_list *)malloc (sizeof (Edge_list));
>
> If you are going to use libiberty via hashtab.h, you might as well make use
> of the *ALLOC family of macros to make this and other allocations a little
> neater.
>
>> +/*Represents an edge in the call graph.  */
>> +struct __edge__
>
> I think the usual convention is to call this edge_d or something similar,
> avoiding the profusion of underscores.
>
>> +void
>> +map_section_name_to_index (char *section_name, void *handle, int shndx)
>> +{
>> +  void **slot;
>> +  char *function_name;
>> +
>> +  if (is_prefix_of (".text.hot.", section_name))
>> +    function_name = section_name + 10 /* strlen (".text.hot.") */;
>> +  else if (is_prefix_of (".text.unlikely.", section_name))
>> +    function_name = section_name + 15 /* strlen (".text.unlikely.") */;
>> +  else if (is_prefix_of (".text.cold.", section_name))
>> +    function_name = section_name + 11 /* strlen (".text.cold.") */;
>> +  else if (is_prefix_of (".text.startup.", section_name))
>> +    function_name = section_name + 14 /* strlen (".text.startup.") */;
>> +  else
>> +    function_name = section_name + 6 /*strlen (".text.") */;
>
> You don't handle plain .text; this is assuming -ffunction-sections, right?
>  Can this limitation be easily removed?

You need to compile with -ffunction-sections or the individual
sections cannot be re-ordered. That is why I assumed a .text.* prefix
before every function section. Did you have something else in mind?

Thanks for your other comments. I will make those changes.

-Sri.

>
> I think it is customary to put the comment after the semicolon.
>
> Might just be easier to say something like:
>
>  const char *sections[] = { ".text.hot", ... }
>  char *function_name = NULL;
>
>  for (i = 0; i < ARRAY_SIZE (sections); i++)
>    if (is_prefix_of (sections[i], section_name))
>      {
>         function_name = section_name + strlen (sections[i]);
>         break;
>      }
>
>  if (!function_name)
>    function_name = section_name + 6; /* strlen (".text.") */
>
> I guess that's not much shorter.
>
>> +void
>> +cleanup ()
>> +{
>> +  Node *node;
>> +  Edge *edge;
>> +
>> +  /* Free all nodes and edge_lists.  */
>> +  for (node = node_chain; node != NULL; )
>> +    {
>> +      Node *next_node = node->next;
>> +      Edge_list *it;
>> +      for (it = node->edge_list; it != NULL; )
>> +        {
>> +          Edge_list *next_it = it->next;
>> +          free (it);
>> +          it = next_it;
>> +        }
>
> Write a free_edge_list function, since you do this once here and twice
> below.
>
> -Nathan
>

Reply via email to