This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: Map ".text.hot" and ".text.unlikely" input section prefixes to separate output sections.
On Fri, Dec 21, 2012 at 10:29 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Fri, Dec 21, 2012 at 7:46 AM, Ian Lance Taylor <iant@google.com> wrote:
>> On Fri, Dec 21, 2012 at 7:38 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
>>> On Thu, Dec 20, 2012 at 10:26 PM, Ian Lance Taylor <iant@google.com> wrote:
>>>> On Thu, Dec 20, 2012 at 2:38 PM, Cary Coutant <ccoutant@google.com> wrote:
>>>>> This patch fixes the problems I've been seeing. It sets the "may sort
>>>>> attached input sections" flag for the .text section, which ensures
>>>>> that we track all input sections for that output section. The problem
>>>>> was that we can't start tracking input sections in mid-stream. We may
>>>>> not want to do this unconditionally for .text, so maybe you'll want a
>>>>> linker option to enable this reordering?
>>>>
>>>> Thanks for tracking this down.
>>>>
>>>> It would be nice to avoid doing it for .text, but I don't see how to
>>>> do that while remaining compatible with GNU ld.
>>>>
>>>> I reimplemented this code in a different way that I think fits in
>>>> better with the existing section ordering code. Committed to
>>>> mainline.
>>>>
>>>> Ian
>>>>
>>>>
>>>> 2012-12-20 Ian Lance Taylor <iant@google.com>
>>>>
>>>> * layout.cc (Layout::special_ordering_of_input_section): New
>>>> function.
>>>> (Layout::layout): If input section requires special ordering, must
>>>> sort input sections.
>>>> (Layout::make_output_section): May sort .text input sections.
>>>> (Layout::is_section_name_prefix_grouped): Remove.
>>>> * layout.h (class Layout): Declare
>>>> special_ordering_of_input_section. Don't declare
>>>> is_section_name_prefix_grouped.
>>>> * output.cc (Output_section::add_input_section): Revert last
>>>> change.
>>>> (Output_section::Input_section_sort::match_file_name): Don't crash
>>>> if called on output section data.
>>>> (Output_section::Input_section_sort_compare): Sort based on
>>>> special ordering.
>>>> (Output_section::Input_section_sort_section_order_index_compare):
>>>> Revert last patch.
>>>> (Output_section::sort_attached_input_sections): Likewise.
>>>
>>> It doesn't fix regressions with x32 gold:
>>>
>>> `echo g++ -mx32 -W -Wall -Werror -D_LARGEFILE_SOURCE
>>> -D_FILE_OFFSET_BITS=64 -fmerge-constants -static-libstdc++
>>> -static-libgcc -o incremental_test_2 | sed -e
>>> 's/-Wp,-D_FORTIFY_SOURCE=[0-9][0-9]*//'` -Wl,--incremental-update
>>> -Bgcctestdir/ two_file_test_tmp_2.o two_file_test_1b_ndebug.o
>>> two_file_test_2_ndebug.o two_file_test_main_ndebug.o
>>> gcctestdir/ld: internal error in convert_types, at
>>> /export/gnu/import/git/binutils/gold/gold.h:192
>>> collect2: error: ld returned 1 exit status
>>> make[3]: *** [incremental_test_2] Error 1
>>
>> I don't really see how that could be related to this patch series. I
>> don't have an x32 system so I also can't debug this. Can you show a
>> backtrace at the point of failure? You can set a breakpoint on
>> gold::do_gold_unreachable.
>>
>> Ian
>
Backtrace with -O0:
(gdb) bt
#0 gold::do_gold_unreachable (
filename=0x8367b0 "/export/gnu/import/git/binutils/gold/gold.h",
lineno=192,
function=0x83781b <unsigned int gold::convert_types<unsigned int,
unsigned long long>(unsigned long long)::__FUNCTION__>
"convert_types")
at /export/gnu/import/git/binutils/gold/gold.cc:102
#1 0x0043f4d4 in gold::convert_types<unsigned int, unsigned long long> (
from=18446744073709551050)
at /export/gnu/import/git/binutils/gold/gold.h:192
#2 0x004e4eb1 in gold::Sized_relobj<32, false>::do_set_section_offset (
this=0xc83160, shndx=7, off=18446744073709551050)
at /export/gnu/import/git/binutils/gold/object.h:1937
#3 0x004d95af in gold::Relobj::set_section_offset (this=0xc83160, shndx=7,
off=18446744073709551050)
at /export/gnu/import/git/binutils/gold/object.h:1172
#4 0x00680bdb in
gold::Output_section::Input_section::set_address_and_file_offset
(this=0xffff8a90, address=4195370, file_offset=250,
section_file_offset=816)
at /export/gnu/import/git/binutils/gold/output.cc:2156
#5 0x00690eec in gold::Output_section::add_input_section<32, false> (
this=0xc5f350, layout=0xffff9670, object=0xc83160, shndx=7,
secname=0xf7ff867e ".text._Z4f13iv", shdr=..., reloc_shndx=0,
have_sections_script=false)
at /export/gnu/import/git/binutils/gold/output.cc:2514
---Type <return> to continue, or q <return> to quit---
#6 0x0061ed1c in gold::Layout::layout<32, false> (this=0xffff9670,
object=0xc83160, shndx=7, name=0xf7ff867e ".text._Z4f13iv", shdr=...,
reloc_shndx=0, off=0xffff8c80)
at /export/gnu/import/git/binutils/gold/layout.cc:1177
#7 0x0063987d in gold::Sized_relobj_file<32, false>::layout_section (
this=0xc83160, layout=0xffff9670, shndx=7,
name=0xf7ff867e ".text._Z4f13iv", shdr=..., reloc_shndx=0, reloc_type=0)
at /export/gnu/import/git/binutils/gold/object.cc:1161
#8 0x00636065 in gold::Sized_relobj_file<32, false>::do_layout (
this=0xc83160, symtab=0xffff94f0, layout=0xffff9670, sd=0xc61ad0)
at /export/gnu/import/git/binutils/gold/object.cc:1665
#9 0x00578ab9 in gold::Object::layout (this=0xc83160, symtab=0xffff94f0,
layout=0xffff9670, sd=0xc61ad0)
at /export/gnu/import/git/binutils/gold/object.h:570
#10 0x006e641c in gold::Add_symbols::run (this=0xc83440)
at /export/gnu/import/git/binutils/gold/readsyms.cc:634
#11 0x0076d0c7 in gold::Workqueue::find_and_run_task (this=0xffff92d0,
thread_number=0) at /export/gnu/import/git/binutils/gold/workqueue.cc:319
#12 0x0076d713 in gold::Workqueue::process (this=0xffff92d0, thread_number=0)
at /export/gnu/import/git/binutils/gold/workqueue.cc:495
#13 0x0040347a in main (argc=37, argv=0xffffcbb4)
at /export/gnu/import/git/binutils/gold/main.cc:252
(gdb)
--
H.J.