Bug 106129 - [12 Regression] LTO option merging broken
Summary: [12 Regression] LTO option merging broken
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: lto (show other bugs)
Version: 13.0
: P2 normal
Target Milestone: 12.2
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2022-06-28 22:42 UTC by Joseph S. Myers
Modified: 2022-07-27 22:23 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Known to work: 12.1.1, 13.0
Known to fail: 12.1.0
Last reconfirmed: 2022-06-30 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Joseph S. Myers 2022-06-28 22:42:14 UTC
The LTO merging of options from different input files was broken by:

commit 227a2ecf663d69972b851f51f1934d18927b62cd
Author: Martin Liska <mliska@suse.cz>
Date:   Fri Mar 12 11:53:47 2021 +0100

    lto-wrapper: Use vec<cl_decoded_option> data type.

Previously, find_and_merge_options would merge options it read into those in *opts. After this commit, options in *opts on entry to find_and_merge_options are ignored; the only merging that takes place is between multiple sets of options in the same input file that are read in the same call to this function (not sure how that case can occur at all). The effects include, for example, that if some objects are built with PIC enabled and others with it disabled, and the last LTO object processed has PIC enabled, the choice of PIC for the last object will result in the whole program being built as PIC, when the merging logic is intended to ensure that a mixture of PIC and non-PIC objects results in the whole program being built as non-PIC.

I'm testing a patch for this bug.
Comment 1 GCC Commits 2022-06-30 16:42:58 UTC
The master branch has been updated by Joseph Myers <jsm28@gcc.gnu.org>:

https://gcc.gnu.org/g:8a8ee37a3325f1009034245676ef4e482c0444a2

commit r13-1368-g8a8ee37a3325f1009034245676ef4e482c0444a2
Author: Joseph Myers <joseph@codesourcery.com>
Date:   Thu Jun 30 16:41:40 2022 +0000

    lto: Fix option merging [PR106129]
    
    The LTO merging of options from different input files was broken by:
    
    commit 227a2ecf663d69972b851f51f1934d18927b62cd
    Author: Martin Liska <mliska@suse.cz>
    Date:   Fri Mar 12 11:53:47 2021 +0100
    
        lto-wrapper: Use vec<cl_decoded_option> data type.
    
    Previously, find_and_merge_options would merge options it read into
    those in *opts. After this commit, options in *opts on entry to
    find_and_merge_options are ignored; the only merging that takes place
    is between multiple sets of options in the same input file that are
    read in the same call to this function (not sure how that case can
    occur at all). The effects include, for example, that if some objects
    are built with PIC enabled and others with it disabled, and the last
    LTO object processed has PIC enabled, the choice of PIC for the last
    object will result in the whole program being built as PIC, when the
    merging logic is intended to ensure that a mixture of PIC and non-PIC
    objects results in the whole program being built as non-PIC.
    
    Fix this with an extra argument to find_and_merge_options to determine
    whether merging should take place.  This shows up a second issue with
    that commit (which I think wasn't actually intended to change code
    semantics at all): once merging is enabled again, the check for
    -Xassembler options became an infinite loop in the case where both
    inputs had -Xassembler options, with the same first option, so fix
    that loop to restore the previous semantics.
    
    Note that I'm not sure how LTO option merging might be tested in the
    testsuite (clearly there wasn't sufficient, if any, coverage to detect
    these bugs).
    
    Bootstrapped with no regressions for x86_64-pc-linux-gnu.
    
            PR lto/106129
            * lto-wrapper.cc (find_option): Add argument start.
            (merge_and_complain): Loop over existing_opt_index and
            existing_opt2_index for Xassembler check.  Update calls to
            find_option.
            (find_and_merge_options): Add argument first to determine whether
            to merge options with those passed in *opts.
            (run_gcc): Update calls to find_and_merge_options.
Comment 2 Joseph S. Myers 2022-06-30 16:43:22 UTC
Fixed so far for GCC 13.
Comment 3 GCC Commits 2022-07-27 09:24:31 UTC
The releases/gcc-12 branch has been updated by Richard Biener <rguenth@gcc.gnu.org>:

https://gcc.gnu.org/g:d2892faac6d760ebc47f8f6ebee51e5cf6255cc8

commit r12-8628-gd2892faac6d760ebc47f8f6ebee51e5cf6255cc8
Author: Joseph Myers <joseph@codesourcery.com>
Date:   Thu Jun 30 16:41:40 2022 +0000

    lto: Fix option merging [PR106129]
    
    The LTO merging of options from different input files was broken by:
    
    commit 227a2ecf663d69972b851f51f1934d18927b62cd
    Author: Martin Liska <mliska@suse.cz>
    Date:   Fri Mar 12 11:53:47 2021 +0100
    
        lto-wrapper: Use vec<cl_decoded_option> data type.
    
    Previously, find_and_merge_options would merge options it read into
    those in *opts. After this commit, options in *opts on entry to
    find_and_merge_options are ignored; the only merging that takes place
    is between multiple sets of options in the same input file that are
    read in the same call to this function (not sure how that case can
    occur at all). The effects include, for example, that if some objects
    are built with PIC enabled and others with it disabled, and the last
    LTO object processed has PIC enabled, the choice of PIC for the last
    object will result in the whole program being built as PIC, when the
    merging logic is intended to ensure that a mixture of PIC and non-PIC
    objects results in the whole program being built as non-PIC.
    
    Fix this with an extra argument to find_and_merge_options to determine
    whether merging should take place.  This shows up a second issue with
    that commit (which I think wasn't actually intended to change code
    semantics at all): once merging is enabled again, the check for
    -Xassembler options became an infinite loop in the case where both
    inputs had -Xassembler options, with the same first option, so fix
    that loop to restore the previous semantics.
    
    Note that I'm not sure how LTO option merging might be tested in the
    testsuite (clearly there wasn't sufficient, if any, coverage to detect
    these bugs).
    
    Bootstrapped with no regressions for x86_64-pc-linux-gnu.
    
            PR lto/106129
            * lto-wrapper.cc (find_option): Add argument start.
            (merge_and_complain): Loop over existing_opt_index and
            existing_opt2_index for Xassembler check.  Update calls to
            find_option.
            (find_and_merge_options): Add argument first to determine whether
            to merge options with those passed in *opts.
            (run_gcc): Update calls to find_and_merge_options.
    
    (cherry picked from commit 8a8ee37a3325f1009034245676ef4e482c0444a2)
Comment 4 Richard Biener 2022-07-27 09:25:53 UTC
Fixed.