Re: [PATCH] [GOLD] Add plugin API for processing plugin-added input files

2017-11-09 Thread Stephen Crane
Cary Coutant  writes:

> The patch for include/plugin-api.h needs to be separated out (with a
> ChangeLog entry of its own), and applied first to the GCC tree, then
> synced to binutils. After that, the rest of this patch is OK to apply.

Thanks. Attached is the patch for plugin-api.h which needs to be applied
to GCC and binutils (plugin_api_new_input.patch). Also attached is the
gold patch to implement the new functionality
(gold_new_input_handler.patch). ChangeLogs for both patches are below. I
don't have write access to either repo, so would you be willing to
commit on my behalf?

> Can you also update the GCC wiki whopr/driver page?

I'd be happy to if I can be added to the EditorGroup (my username is
StephenCrane).


include/ChangeLog:
2017-11-09  Stephen Crane  

* plugin-api.h: Add new plugin hook to allow processing of input
files added by a plugin.
(ld_plugin_new_input_handler): New funcion hook type.
(ld_plugin_register_new_input): New interface.
(LDPT_REGISTER_NEW_INPUT_HOOK): New enum val.
(tv_register_new_input): New member.


gold/ChangeLog:
2017-11-09  Stephen Crane  

* plugin.cc (Plugin::load): Include hooks for register_new_input
in transfer vector.
(Plugin::new_input): New function.
(register_new_input): New function.
(Plugin_manager::claim_file): Call Plugin::new_input if in
replacement phase.
* plugin.h (Plugin::set_new_input_handler): New function.
* testsuite/plugin_new_section_layout.c: New plugin to test
new_input plugin API.
* testsuite/plugin_final_layout.sh: Add new input test.
* testsuite/Makefile.am (plugin_layout_new_file): New test case.
* testsuite/Makefile.in: Regenerate.

commit f45d97f0ee4c202602c9951ade622caf2e27ffe2
Author: Stephen Crane 
Date:   Thu Sep 21 14:22:37 2017 -0700

Add plugin API for processing plugin-added input files

Gold plugins may wish to further process an input file added by a plugin. For
example, the plugin may need to assign a unique segment for sections in a
plugin-generated input file. This patch adds a plugin callback that the linker
will call when reading symbols from a new input file added after the
all_symbols_read event (i.e. an input file added by a plugin).

diff --git a/include/plugin-api.h b/include/plugin-api.h
index 3a3e8b456db..f081f85dfaf 100644
--- a/include/plugin-api.h
+++ b/include/plugin-api.h
@@ -365,6 +365,20 @@ enum ld_plugin_status
 (*ld_plugin_get_input_section_size) (const struct ld_plugin_section section,
  uint64_t *secsize);
 
+typedef
+enum ld_plugin_status
+(*ld_plugin_new_input_handler) (const struct ld_plugin_input_file *file);
+
+/* The linker's interface for registering the "new_input" handler. This handler
+   will be notified when a new input file has been added after the
+   all_symbols_read event, allowing the plugin to, for example, set a unique
+   segment for sections in plugin-generated input files. */
+
+typedef
+enum ld_plugin_status
+(*ld_plugin_register_new_input) (ld_plugin_new_input_handler handler);
+
+
 enum ld_plugin_level
 {
   LDPL_INFO,
@@ -407,7 +421,8 @@ enum ld_plugin_tag
   LDPT_UNIQUE_SEGMENT_FOR_SECTIONS = 27,
   LDPT_GET_SYMBOLS_V3 = 28,
   LDPT_GET_INPUT_SECTION_ALIGNMENT = 29,
-  LDPT_GET_INPUT_SECTION_SIZE = 30
+  LDPT_GET_INPUT_SECTION_SIZE = 30,
+  LDPT_REGISTER_NEW_INPUT_HOOK = 31
 };
 
 /* The plugin transfer vector.  */
@@ -441,6 +456,7 @@ struct ld_plugin_tv
 ld_plugin_unique_segment_for_sections tv_unique_segment_for_sections;
 ld_plugin_get_input_section_alignment tv_get_input_section_alignment;
 ld_plugin_get_input_section_size tv_get_input_section_size;
+ld_plugin_register_new_input tv_register_new_input;
   } tv_u;
 };
 
diff --git a/gold/plugin.cc b/gold/plugin.cc
index 5ea23b5bdd..49212b4309 100644
--- a/gold/plugin.cc
+++ b/gold/plugin.cc
@@ -167,6 +167,9 @@ static enum ld_plugin_status
 get_input_section_size(const struct ld_plugin_section section,
uint64_t* secsize);
 
+static enum ld_plugin_status
+register_new_input(ld_plugin_new_input_handler handler);
+
 };
 
 #endif // ENABLE_PLUGINS
@@ -211,7 +214,7 @@ Plugin::load()
   sscanf(ver, "%d.%d", &major, &minor);
 
   // Allocate and populate a transfer vector.
-  const int tv_fixed_size = 29;
+  const int tv_fixed_size = 30;
 
   int tv_size = this->args_.size() + tv_fixed_size;
   ld_plugin_tv* tv = new ld_plugin_tv[tv_size];
@@ -345,6 +348,10 @@ Plugin::load()
   tv[i].tv_tag = LDPT_GET_INPUT_SECTION_SIZE;
   tv[i].tv_u.tv_get_input_section_size = get_input_section_size;
 
+  ++i;
+  tv[i].tv_tag = LDPT_REGISTER_NEW_INPUT_HOOK;
+  tv[i].tv_u.tv_register_new_input = register_new_input;
+
   ++i;
   tv[i].tv_tag = LDPT_NULL;
   tv[i].tv_u.tv_val = 0;
@@ -383,6 +390,15 @@ Plugin::all_symbols_read()
 (*this-

Re: [PATCH] [GOLD] Add plugin API for processing plugin-added input files

2017-12-11 Thread Stephen Crane
Thanks for committing the GCC portion and following up on this. I had
been meaning to write and ask. I don't have commit privs for binutils,
so either you or Cary will have to commit the binutils patch as well,
if it's not too much trouble. I think much has changed to need a
rebase?

Thanks,
Stephen

On Mon, Dec 11, 2017 at 2:10 PM, Sriraman Tallam  wrote:
> On Thu, Nov 9, 2017 at 9:04 PM, Cary Coutant  wrote:
>>> include/ChangeLog:
>>> 2017-11-09  Stephen Crane  
>>>
>>> * plugin-api.h: Add new plugin hook to allow processing of input
>>> files added by a plugin.
>>> (ld_plugin_new_input_handler): New funcion hook type.
>>> (ld_plugin_register_new_input): New interface.
>>> (LDPT_REGISTER_NEW_INPUT_HOOK): New enum val.
>>>     (tv_register_new_input): New member.
>>>
>>>
>>> gold/ChangeLog:
>>> 2017-11-09  Stephen Crane  
>>>
>>> * plugin.cc (Plugin::load): Include hooks for register_new_input
>>> in transfer vector.
>>> (Plugin::new_input): New function.
>>> (register_new_input): New function.
>>> (Plugin_manager::claim_file): Call Plugin::new_input if in
>>> replacement phase.
>>> * plugin.h (Plugin::set_new_input_handler): New function.
>>> * testsuite/plugin_new_section_layout.c: New plugin to test
>>> new_input plugin API.
>>> * testsuite/plugin_final_layout.sh: Add new input test.
>>> * testsuite/Makefile.am (plugin_layout_new_file): New test case.
>>> * testsuite/Makefile.in: Regenerate.
>>
>> These are OK. Thanks!
>>
>> Sri, I'm out of town through 11/18, and won't be able to commit the
>> include/ patch to GCC before Stage 1 ends. Can you take care of it?
>> (If not, I'll take care of it when I get back -- it was approved
>> during Stage 1, so I think it's OK to commit early in Stage 3,
>> especially since it's nothing but new declarations.)
>
> Stephen, I was looking at binutils and realized this patch has not
> been committed yet.  I only committed the GCC portion, plugin-api.h.
>
> Thanks
> Sri
>
>>
>> -cary


Re: [PATCH] [GOLD] Add plugin API for processing plugin-added input files

2017-12-12 Thread Stephen Crane
Thank you so much. I just added documentation for the new hook to
https://gcc.gnu.org/wiki/whopr/driver so that should finish off this
feature.

I'm happy to fix any bugs that might crop up related to this hook, of
course. I don't follow the binutils list closely, so I apologize in
advance if I miss any issues related to this feature. Just CC me
explicitly and I'll jump on it.

Thanks,
- stephen

On Mon, Dec 11, 2017 at 3:03 PM, Sriraman Tallam  wrote:
> On Mon, Dec 11, 2017 at 2:16 PM, Stephen Crane  wrote:
>> Thanks for committing the GCC portion and following up on this. I had
>> been meaning to write and ask. I don't have commit privs for binutils,
>> so either you or Cary will have to commit the binutils patch as well,
>> if it's not too much trouble. I think much has changed to need a
>> rebase?
>
> I just committed your patch.  I had to make one very minor change to
> plugin_new_section_layout.c to compile, move the loop initialization
> declaration outside as that is not allowed on C.  I tested the patch.
>
> Thanks
> Sri
>
>>
>> Thanks,
>> Stephen
>>
>> On Mon, Dec 11, 2017 at 2:10 PM, Sriraman Tallam  wrote:
>>> On Thu, Nov 9, 2017 at 9:04 PM, Cary Coutant  wrote:
>>>>> include/ChangeLog:
>>>>> 2017-11-09  Stephen Crane  
>>>>>
>>>>> * plugin-api.h: Add new plugin hook to allow processing of input
>>>>> files added by a plugin.
>>>>> (ld_plugin_new_input_handler): New funcion hook type.
>>>>>     (ld_plugin_register_new_input): New interface.
>>>>> (LDPT_REGISTER_NEW_INPUT_HOOK): New enum val.
>>>>> (tv_register_new_input): New member.
>>>>>
>>>>>
>>>>> gold/ChangeLog:
>>>>> 2017-11-09  Stephen Crane  
>>>>>
>>>>> * plugin.cc (Plugin::load): Include hooks for register_new_input
>>>>> in transfer vector.
>>>>> (Plugin::new_input): New function.
>>>>> (register_new_input): New function.
>>>>> (Plugin_manager::claim_file): Call Plugin::new_input if in
>>>>> replacement phase.
>>>>> * plugin.h (Plugin::set_new_input_handler): New function.
>>>>> * testsuite/plugin_new_section_layout.c: New plugin to test
>>>>> new_input plugin API.
>>>>> * testsuite/plugin_final_layout.sh: Add new input test.
>>>>> * testsuite/Makefile.am (plugin_layout_new_file): New test case.
>>>>> * testsuite/Makefile.in: Regenerate.
>>>>
>>>> These are OK. Thanks!
>>>>
>>>> Sri, I'm out of town through 11/18, and won't be able to commit the
>>>> include/ patch to GCC before Stage 1 ends. Can you take care of it?
>>>> (If not, I'll take care of it when I get back -- it was approved
>>>> during Stage 1, so I think it's OK to commit early in Stage 3,
>>>> especially since it's nothing but new declarations.)
>>>
>>> Stephen, I was looking at binutils and realized this patch has not
>>> been committed yet.  I only committed the GCC portion, plugin-api.h.
>>>
>>> Thanks
>>> Sri
>>>
>>>>
>>>> -cary


[PATCH] Add linker plugin API for processing plugin-added input files

2017-09-21 Thread Stephen Crane
I'm looking to extend the linker plugin API to allow linker plugins the
chance to assign sections to segments for sections in plugin-generated
files. Currently the linker does not give the plugin the opportunity to
call the unique_segment_for_sections interface for files generated by a
plugin, since the plugin does not have access to an input handle for
such files. This new interface adds a plugin callback the linker will
call while processing newly added input files, giving the plugin a
handle to refer to that file. 

This change would be concurrent with a corresponding change to gold. See
the following email thread on the binutils mailing list for more details
on the implementation of this API change:
https://sourceware.org/ml/binutils/2017-08/msg00279.html.


include/Changelog:

2017-09-21  Stephen Crane 

* plugin-api.h: Add new hook to the plugin transfer vector to
support assigning plugin-generated sections to unique output
segments.
(ld_plugin_register_new_input): New hook.
(ld_plugin_tag): Add LDPT_REGISTER_NEW_INPUT_HOOK.
(ld_plugin_tv): Add tv_register_new_input.


I would greatly appreciate any feedback on this proposed change.
Thanks,
Stephen

commit f45d97f0ee4c202602c9951ade622caf2e27ffe2
Author: Stephen Crane 
Date:   Thu Sep 21 14:22:37 2017 -0700

Add plugin API for processing plugin-added input files

Gold plugins may wish to further process an input file added by a plugin. For
example, the plugin may need to assign a unique segment for sections in a
plugin-generated input file. This patch adds a plugin callback that the linker
will call when reading symbols from a new input file added after the
all_symbols_read event (i.e. an input file added by a plugin).

diff --git a/include/plugin-api.h b/include/plugin-api.h
index 3a3e8b456db..f081f85dfaf 100644
--- a/include/plugin-api.h
+++ b/include/plugin-api.h
@@ -365,6 +365,20 @@ enum ld_plugin_status
 (*ld_plugin_get_input_section_size) (const struct ld_plugin_section section,
  uint64_t *secsize);
 
+typedef
+enum ld_plugin_status
+(*ld_plugin_new_input_handler) (const struct ld_plugin_input_file *file);
+
+/* The linker's interface for registering the "new_input" handler. This handler
+   will be notified when a new input file has been added after the
+   all_symbols_read event, allowing the plugin to, for example, set a unique
+   segment for sections in plugin-generated input files. */
+
+typedef
+enum ld_plugin_status
+(*ld_plugin_register_new_input) (ld_plugin_new_input_handler handler);
+
+
 enum ld_plugin_level
 {
   LDPL_INFO,
@@ -407,7 +421,8 @@ enum ld_plugin_tag
   LDPT_UNIQUE_SEGMENT_FOR_SECTIONS = 27,
   LDPT_GET_SYMBOLS_V3 = 28,
   LDPT_GET_INPUT_SECTION_ALIGNMENT = 29,
-  LDPT_GET_INPUT_SECTION_SIZE = 30
+  LDPT_GET_INPUT_SECTION_SIZE = 30,
+  LDPT_REGISTER_NEW_INPUT_HOOK = 31
 };
 
 /* The plugin transfer vector.  */
@@ -441,6 +456,7 @@ struct ld_plugin_tv
 ld_plugin_unique_segment_for_sections tv_unique_segment_for_sections;
 ld_plugin_get_input_section_alignment tv_get_input_section_alignment;
 ld_plugin_get_input_section_size tv_get_input_section_size;
+ld_plugin_register_new_input tv_register_new_input;
   } tv_u;
 };