From: Alexander Ivchenko <aivchenk@gmail.com>
To: Ian Lance Taylor <iant@google.com>
Cc: binutils <binutils@sourceware.org>,
Sriraman Tallam <tmsriram@google.com>
Subject: Re: [gold] Merging string literals with bigger alignment
Date: Thu, 21 Mar 2013 12:24:00 -0000 [thread overview]
Message-ID: <CACysShh22grCuoa7-b3QV7D_Q-RBYrtLH8ifr2yRcS93+GRk1g@mail.gmail.com> (raw)
In-Reply-To: <CAKOQZ8wd_7bfSfMsm_WmJnSdT_J4qF-JM+3Ex=tU0iDJCOWETQ@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 1678 bytes --]
Hi,
Please, take a look at the attached patch that enables merging
of string literals with alignment bigger than the char size (alignment
is preserved).
Make check-gold passes, testcase is included.
thanks,
Alexander
2013/2/12 Ian Lance Taylor <iant@google.com>:
> On Tue, Feb 12, 2013 at 7:30 AM, Alexander Ivchenko <aivchenk@gmail.com> wrote:
>> The testcase in the patch from my first letter has those .c files. But
>> it's very simple anyway:
>>>cat merge_string_literals_1.c
>>
>> const char* bar1() {
>> return "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
>> }
>> const char* bar1_short() {
>> return "SSSSSS";
>> }
>>
>>>gcc -c merge_string_literals_1.c -O2
>>>readelf -S merge_string_literals_1.o | grep rodata
>> [ 5] .rodata.str1.8 PROGBITS 0000000000000000 00000058
>> [ 6] .rodata.str1.1 PROGBITS 0000000000000000 0000007d
>>
>>>objdump -s -j.rodata.str1.8 merge_string_literals_1.o
>>
>> merge_string_literals_1.o: file format elf64-x86-64
>>
>> Contents of section .rodata.str1.8:
>> 0000 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
>> 0010 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
>> 0020 41414141 00 AAAA.
>>
>> I mentioned .rodata.str1.4 before - that could happen if we compile
>> for 32 bits..
>
>
> Thanks. I see the code in GCC now. It's in ix86_constant_alignment
> in gcc/config/i386/i386.c. For a string constant of 31 bytes or more,
> GCC sets the alignment to the word size. This means that GCC may use
> vector instructions to load the string constant. So gold has to honor
> the alignment of each individual entry in the mergeable string
> section.
>
> Ian
[-- Attachment #2: merging_string_literals_02.patch --]
[-- Type: application/octet-stream, Size: 17833 bytes --]
diff --git a/gold/ChangeLog b/gold/ChangeLog
index 6913ace..e84e7dd 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,30 @@
+2013-03-19 Alexander Ivchenko <alexander.ivchenko@intel.com>
+
+ * output.cc (Output_section::add_merge_input_section): Allow
+ to merge sections if the alignment is more than character size.
+ * merge.h (Output_merge_string::Output_merge_string): Remove
+ assert.
+ * merge.cc (Output_merge_string<Char_type>::do_add_input_section): Use
+ add_with_length_and_alignment instead of add_with_length.
+ * stringpool.h (Stringpool_template<Stringpool_char>::new_key_offset):
+ Add new argument - alignment of the string.
+ (Stringpool_template<Stringpool_char>::add_with_length_and_alignment):
+ New method.
+ (Stringpool_template<Stringpool_char>::Hashkey): New class member -
+ alignment of the string. Constructors are updated accordingly.
+ * stringpool.cc (Stringpool_template<Stringpool_char>::new_key_offset):
+ Add new argument - alignment of the string.
+ (Stringpool_template<Stringpool_char>::set_string_offsets):
+ Updating offsets according to the given alignment.
+ * merge.h (Output_merge_string::Output_merge_string): Remove
+ assert.
+ * testsuite/Makefile.am (text_section_grouping): Test if string
+ literals are getting merged.
+ * testsuite/Makefile.in: Regenerate.
+ * testsuite/merge_string_literals_1.c: New file.
+ * testsuite/merge_string_literals_2.c: Ditto.
+ * testsuite/merge_string_literals.sh: Ditto.
+
2013-03-13 Alan Modra <amodra@gmail.com>
* powerpc.cc (is_branch_reloc): Forward declare.
diff --git a/gold/merge.cc b/gold/merge.cc
index dde43e9..47e8299 100644
--- a/gold/merge.cc
+++ b/gold/merge.cc
@@ -555,7 +555,9 @@ Output_merge_string<Char_type>::do_add_input_section(Relobj* object,
size_t len = string_length(p);
Stringpool::Key key;
- this->stringpool_.add_with_length(p, len, true, &key);
+ this->stringpool_.add_with_length_and_alignment(p, len,
+ this->addralign(),
+ true, &key);
merged_strings.push_back(Merged_string(i, key));
diff --git a/gold/merge.h b/gold/merge.h
index 625d731..82fe961 100644
--- a/gold/merge.h
+++ b/gold/merge.h
@@ -464,7 +464,6 @@ class Output_merge_string : public Output_merge_base
: Output_merge_base(sizeof(Char_type), addralign), stringpool_(),
merged_strings_lists_(), input_count_(0), input_size_(0)
{
- gold_assert(addralign <= sizeof(Char_type));
this->stringpool_.set_no_zero_null();
}
diff --git a/gold/output.cc b/gold/output.cc
index 22c0bf0..75ce840 100644
--- a/gold/output.cc
+++ b/gold/output.cc
@@ -2635,11 +2635,6 @@ Output_section::add_merge_input_section(Relobj* object, unsigned int shndx,
{
bool is_string = (flags & elfcpp::SHF_STRINGS) != 0;
- // We only merge strings if the alignment is not more than the
- // character size. This could be handled, but it's unusual.
- if (is_string && addralign > entsize)
- return false;
-
// We cannot restore merged input section states.
gold_assert(this->checkpoint_ == NULL);
diff --git a/gold/stringpool.cc b/gold/stringpool.cc
index 434b2d6..fb93ae6 100644
--- a/gold/stringpool.cc
+++ b/gold/stringpool.cc
@@ -214,15 +214,16 @@ Stringpool_template<Stringpool_char>::add(const Stringpool_char* s, bool copy,
template<typename Stringpool_char>
void
-Stringpool_template<Stringpool_char>::new_key_offset(size_t length)
+Stringpool_template<Stringpool_char>::new_key_offset(size_t length, uint64_t addralign)
{
section_offset_type offset;
if (this->zero_null_ && length == 0)
offset = 0;
else
{
- offset = this->offset_;
- this->offset_ += (length + 1) * sizeof(Stringpool_char);
+ // We don't do alignment for zero-length strings.
+ offset = length == 0 ? offset_ : align_address(this->offset_, addralign);
+ this->offset_ = offset + (length + 1) * sizeof(Stringpool_char);
}
this->key_to_offset_.push_back(offset);
}
@@ -234,6 +235,18 @@ Stringpool_template<Stringpool_char>::add_with_length(const Stringpool_char* s,
bool copy,
Key* pkey)
{
+ return this->add_with_length_and_alignment(s, length, 1, copy, pkey);
+}
+
+template<typename Stringpool_char>
+const Stringpool_char*
+Stringpool_template<Stringpool_char>::
+add_with_length_and_alignment(const Stringpool_char* s,
+ size_t length,
+ uint64_t addralign,
+ bool copy,
+ Key* pkey)
+{
typedef std::pair<typename String_set_type::iterator, bool> Insert_type;
// We add 1 so that 0 is always invalid.
@@ -244,7 +257,7 @@ Stringpool_template<Stringpool_char>::add_with_length(const Stringpool_char* s,
// When we don't need to copy the string, we can call insert
// directly.
- std::pair<Hashkey, Hashval> element(Hashkey(s, length), k);
+ std::pair<Hashkey, Hashval> element(Hashkey(s, length, addralign), k);
Insert_type ins = this->string_set_.insert(element);
@@ -254,7 +267,7 @@ Stringpool_template<Stringpool_char>::add_with_length(const Stringpool_char* s,
{
// We just added the string. The key value has now been
// used.
- this->new_key_offset(length);
+ this->new_key_offset(length, addralign);
}
else
{
@@ -271,7 +284,7 @@ Stringpool_template<Stringpool_char>::add_with_length(const Stringpool_char* s,
// canonicalize it by copying it into the canonical list. The hash
// code will only be computed once.
- Hashkey hk(s, length);
+ Hashkey hk(s, length, addralign);
typename String_set_type::const_iterator p = this->string_set_.find(hk);
if (p != this->string_set_.end())
{
@@ -280,7 +293,7 @@ Stringpool_template<Stringpool_char>::add_with_length(const Stringpool_char* s,
return p->first.string;
}
- this->new_key_offset(length);
+ this->new_key_offset(length, addralign);
hk.string = this->add_string(s, length);
// The contents of the string stay the same, so we don't need to
@@ -421,8 +434,8 @@ Stringpool_template<Stringpool_char>::set_string_offsets()
* charsize));
else
{
- this_offset = offset;
- offset += ((*curr)->first.length + 1) * charsize;
+ this_offset = align_address(offset, (*curr)->first.addralign);
+ offset = this_offset + ((*curr)->first.length + 1) * charsize;
}
this->key_to_offset_[(*curr)->second - 1] = this_offset;
last_offset = this_offset;
diff --git a/gold/stringpool.h b/gold/stringpool.h
index c51b143..0aadcef 100644
--- a/gold/stringpool.h
+++ b/gold/stringpool.h
@@ -229,6 +229,12 @@ class Stringpool_template
const Stringpool_char*
add_with_length(const Stringpool_char* s, size_t len, bool copy, Key* pkey);
+ // Add string S of length LEN characters and alignment ADDRALIGN
+ // to the pool. If COPY is true, S need not be null terminated.
+ const Stringpool_char*
+ add_with_length_and_alignment(const Stringpool_char* s, size_t len,
+ uint64_t addralign, bool copy, Key* pkey);
+
// If the string S is present in the pool, return the canonical
// string pointer. Otherwise, return NULL. If PKEY is not NULL,
// set *PKEY to the key.
@@ -315,7 +321,7 @@ class Stringpool_template
// Add a new key offset entry.
void
- new_key_offset(size_t);
+ new_key_offset(size_t length, uint64_t addralign);
// Copy a string into the buffers, returning a canonical string.
const Stringpool_char*
@@ -336,22 +342,30 @@ class Stringpool_template
const Stringpool_char* string;
// Length is in characters, not bytes.
size_t length;
+ // Preserve the alignment of the string in the input section.
+ uint64_t addralign;
+
size_t hash_code;
// This goes in an STL container, so we need a default
// constructor.
Hashkey()
- : string(NULL), length(0), hash_code(0)
+ : string(NULL), length(0), addralign(0), hash_code(0)
{ }
// Note that these constructors are relatively expensive, because
// they compute the hash code.
explicit Hashkey(const Stringpool_char* s)
- : string(s), length(string_length(s)), hash_code(string_hash(s, length))
+ : string(s), length(string_length(s)),
+ addralign(1), hash_code(string_hash(s, length))
{ }
Hashkey(const Stringpool_char* s, size_t len)
- : string(s), length(len), hash_code(string_hash(s, len))
+ : string(s), length(len), addralign(1), hash_code(string_hash(s, len))
+ { }
+
+ Hashkey(const Stringpool_char* s, size_t len, uint64_t align)
+ : string(s), length(len), addralign(align), hash_code(string_hash(s, len))
{ }
};
diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am
index 5b5c86b..b4e17a5 100644
--- a/gold/testsuite/Makefile.am
+++ b/gold/testsuite/Makefile.am
@@ -329,6 +329,18 @@ icf_sht_rel_addend_test: icf_sht_rel_addend_test_1.o icf_sht_rel_addend_test_2.o
icf_sht_rel_addend_test.stdout: icf_sht_rel_addend_test
$(TEST_NM) icf_sht_rel_addend_test > icf_sht_rel_addend_test.stdout
+check_SCRIPTS += merge_string_literals.sh
+check_DATA += merge_string_literals.stdout
+MOSTLYCLEANFILES += merge_string_literals
+merge_string_literals_1.o: merge_string_literals_1.c
+ $(CXXCOMPILE) -O2 -c -fPIC -g -o $@ $<
+merge_string_literals_2.o: merge_string_literals_2.c
+ $(CXXCOMPILE) -O2 -c -fPIC -g -o $@ $<
+merge_string_literals: merge_string_literals_1.o merge_string_literals_2.o gcctestdir/ld
+ $(CXXLINK) -Bgcctestdir/ merge_string_literals_1.o merge_string_literals_2.o -O2 -shared -nostdlib
+merge_string_literals.stdout: merge_string_literals
+ $(TEST_OBJDUMP) -s -j.rodata merge_string_literals > merge_string_literals.stdout
+
check_PROGRAMS += basic_test
check_PROGRAMS += basic_pic_test
basic_test.o: basic_test.cc
diff --git a/gold/testsuite/Makefile.in b/gold/testsuite/Makefile.in
index ec0acb9..c47dd34 100644
--- a/gold/testsuite/Makefile.in
+++ b/gold/testsuite/Makefile.in
@@ -85,6 +85,7 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_preemptible_functions_test.sh \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_string_merge_test.sh \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_sht_rel_addend_test.sh \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ merge_string_literals.sh \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ two_file_shared.sh weak_plt.sh \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ debug_msg.sh undef_symbol.sh \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_1.sh ver_test_2.sh \
@@ -119,6 +120,7 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_preemptible_functions_test.stdout \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_string_merge_test.stdout \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_sht_rel_addend_test.stdout \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ merge_string_literals.stdout \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ two_file_shared.dbg \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ weak_plt_shared.so debug_msg.err
@GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_4 = incremental_test \
@@ -140,6 +142,7 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_preemptible_functions_test \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_string_merge_test \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_sht_rel_addend_test \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ merge_string_literals \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ two_file_shared.dbg \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ alt/weak_undef_lib.so
@GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_5 = icf_virtual_function_folding_test \
@@ -3736,6 +3739,8 @@ icf_string_merge_test.sh.log: icf_string_merge_test.sh
@p='icf_string_merge_test.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
icf_sht_rel_addend_test.sh.log: icf_sht_rel_addend_test.sh
@p='icf_sht_rel_addend_test.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
+merge_string_literals.sh.log: merge_string_literals.sh
+ @p='merge_string_literals.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
two_file_shared.sh.log: two_file_shared.sh
@p='two_file_shared.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
weak_plt.sh.log: weak_plt.sh
@@ -4419,6 +4424,14 @@ uninstall-am:
@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Bgcctestdir/ -Wl,--icf=all icf_sht_rel_addend_test_1.o icf_sht_rel_addend_test_2.o
@GCC_TRUE@@NATIVE_LINKER_TRUE@icf_sht_rel_addend_test.stdout: icf_sht_rel_addend_test
@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_NM) icf_sht_rel_addend_test > icf_sht_rel_addend_test.stdout
+@GCC_TRUE@@NATIVE_LINKER_TRUE@merge_string_literals_1.o: merge_string_literals_1.c
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXCOMPILE) -O2 -c -fPIC -g -o $@ $<
+@GCC_TRUE@@NATIVE_LINKER_TRUE@merge_string_literals_2.o: merge_string_literals_2.c
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXCOMPILE) -O2 -c -fPIC -g -o $@ $<
+@GCC_TRUE@@NATIVE_LINKER_TRUE@merge_string_literals: merge_string_literals_1.o merge_string_literals_2.o gcctestdir/ld
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Bgcctestdir/ merge_string_literals_1.o merge_string_literals_2.o -O2 -shared -nostdlib
+@GCC_TRUE@@NATIVE_LINKER_TRUE@merge_string_literals.stdout: merge_string_literals
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_OBJDUMP) -s -j.rodata merge_string_literals > merge_string_literals.stdout
@GCC_TRUE@@NATIVE_LINKER_TRUE@basic_test.o: basic_test.cc
@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXCOMPILE) -O0 -c -o $@ $<
@GCC_TRUE@@NATIVE_LINKER_TRUE@basic_test: basic_test.o gcctestdir/ld
diff --git a/gold/testsuite/merge_string_literals.sh b/gold/testsuite/merge_string_literals.sh
new file mode 100755
index 0000000..486a895
--- /dev/null
+++ b/gold/testsuite/merge_string_literals.sh
@@ -0,0 +1,41 @@
+#!/bin/sh
+
+# merge_string_literals.sh -- test
+
+# Copyright 2013 Free Software Foundation, Inc.
+# Written by Alexander Ivchenko <alexander.ivchenko@intel.com>.
+
+# This file is part of gold.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+
+# The goal of this program is to check whether string literals from different
+# object files are merged together
+
+set -e
+
+check()
+{
+ number_of_occurrence=`grep $2 ./$1 -o| wc -l`
+ if [ $number_of_occurrence != $3 ]
+ then
+ echo "String literals were not merged"
+ exit 1
+ fi
+}
+
+# If string literals were merged, then "abcd" appears two times
+check merge_string_literals.stdout "abcd" 2
diff --git a/gold/testsuite/merge_string_literals_1.c b/gold/testsuite/merge_string_literals_1.c
new file mode 100644
index 0000000..079382f
--- /dev/null
+++ b/gold/testsuite/merge_string_literals_1.c
@@ -0,0 +1,31 @@
+// merge_string_literals_1.c -- a test case for gold
+
+// Copyright 2012 Free Software Foundation, Inc.
+// Written by Alexander Ivchenko <alexander.ivchenko@intel.com>
+
+// This file is part of gold.
+
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+// MA 02110-1301, USA.
+
+// The goal of this program is to check whether string literals from different
+// object files are merged together
+
+const char* bar1() {
+ return "abcdefghijklmnopqrstuvwxyz0123456789";
+}
+const char* bar1_short() {
+ return "abcdef";
+}
diff --git a/gold/testsuite/merge_string_literals_2.c b/gold/testsuite/merge_string_literals_2.c
new file mode 100644
index 0000000..d4876f8
--- /dev/null
+++ b/gold/testsuite/merge_string_literals_2.c
@@ -0,0 +1,31 @@
+// merge_string_literals_2.c -- a test case for gold
+
+// Copyright 2012 Free Software Foundation, Inc.
+// Written by Alexander Ivchenko <alexander.ivchenko@intel.com>
+
+// This file is part of gold.
+
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+// MA 02110-1301, USA.
+
+// The goal of this program is to check whether string literals from different
+// object files are merged together
+
+const char* bar2() {
+ return "abcdefghijklmnopqrstuvwxyz0123456789";
+}
+const char* bar2_short() {
+ return "abcdef";
+}
next prev parent reply other threads:[~2013-03-21 12:24 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-02-08 13:21 Alexander Ivchenko
2013-02-08 14:46 ` Ian Lance Taylor
2013-02-12 14:22 ` Alexander Ivchenko
2013-02-12 14:34 ` Ian Lance Taylor
2013-02-12 15:30 ` Alexander Ivchenko
2013-02-12 17:52 ` Ian Lance Taylor
2013-03-21 12:24 ` Alexander Ivchenko [this message]
2013-03-21 16:43 ` Cary Coutant
2013-03-22 14:39 ` Alexander Ivchenko
2013-03-22 16:34 ` Cary Coutant
2013-03-26 11:23 ` Alexander Ivchenko
2013-03-28 18:18 ` Cary Coutant
2013-03-29 19:07 ` H.J. Lu
2013-03-31 13:08 ` Alexander Ivchenko
2013-04-01 16:58 ` Cary Coutant
2013-04-02 13:57 ` Alexander Ivchenko
2013-04-02 17:07 ` Cary Coutant
2013-04-02 20:55 ` Ian Lance Taylor
2013-04-04 12:01 ` Alexander Ivchenko
2013-04-04 17:13 ` Cary Coutant
2013-04-29 10:44 ` Alexander Ivchenko
2013-04-29 17:16 ` Cary Coutant
2013-05-01 2:25 ` Alan Modra
2013-05-01 17:39 ` Cary Coutant
2013-05-01 17:43 ` Cary Coutant
2013-05-01 18:24 ` H.J. Lu
2013-05-01 18:28 ` H.J. Lu
2013-05-01 19:21 ` H.J. Lu
2013-05-01 19:33 ` Cary Coutant
2013-05-02 3:29 ` Alan Modra
2013-05-02 15:49 ` H.J. Lu
2013-05-02 16:01 ` Cary Coutant
2013-05-03 1:14 ` Alan Modra
2013-05-03 5:58 ` Cary Coutant
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CACysShh22grCuoa7-b3QV7D_Q-RBYrtLH8ifr2yRcS93+GRk1g@mail.gmail.com \
--to=aivchenk@gmail.com \
--cc=binutils@sourceware.org \
--cc=iant@google.com \
--cc=tmsriram@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).