[PATCH] PR gold/17729: [gold] gold failed to build x32 libgo

H.J. Lu hjl.tools@gmail.com
Tue Jan 6 23:40:00 GMT 2015


On Tue, Jan 6, 2015 at 3:18 PM, Cary Coutant <ccoutant@google.com> wrote:
>> +  if (size == 32)
>> +    {
>> +      // For X32
>> +      // cmp %fs:NN,%esp
>> +      cmp_insn = "\x64\x3b\x24\x25";
>> +      cmp_insn_len = 4;
>> +      // lea NN(%rsp),%r10d
>> +      // lea NN(%rsp),%r11d
>> +      lea_r10_insn = "\x44\x8d\x94\x24";
>> +      lea_r11_insn = "\x44\x8d\x9c\x24";
>> +      nop_insn_len = 7;
>> +    }
>> ...
>
> The rest of this patch is OK, but in do_calls_non_split(), I'd prefer
> something like this (note also the depedency between nop_size and the
> test against fnsize for the cmp instruction):
>
> --- a/gold/x86_64.cc
> +++ b/gold/x86_64.cc
> @@ -4457,6 +4457,14 @@ Target_x86_64<size>::do_ehframe_datarel_base() const
>  // code.  We have to change the function so that it always ensures
>  // that it has enough stack space to run some random function.
>
> +static const unsigned char cmp_insn_32[] = { 0x64, 0x3b, 0x24, 0x25 };
> +static const unsigned char lea_r10_insn_32[] = { 0x44, 0x8d, 0x94, 0x24 };
> +static const unsigned char lea_r11_insn_32[] = { 0x44, 0x8d, 0x9c, 0x24 };
> +
> +static const unsigned char cmp_insn_64[] = { 0x64, 0x48, 0x3b, 0x24, 0x25 };
> +static const unsigned char lea_r10_insn_64[] = { 0x4c, 0x8d, 0x94, 0x24 };
> +static const unsigned char lea_r11_insn_64[] = { 0x4c, 0x8d, 0x9c, 0x24 };
> +
>  template<int size>
>  void
>  Target_x86_64<size>::do_calls_non_split(Relobj* object, unsigned int shndx,
> @@ -4467,25 +4475,40 @@
> Target_x86_64<size>::do_calls_non_split(Relobj* object, unsigned int
> shndx,
>                                         std::string* from,
>                                         std::string* to) const
>  {
> +  const char* const cmp_insn = reinterpret_cast<const char*>
> +      (size == 32 ? cmp_insn_32 : cmp_insn_64);
> +  const char* const lea_r10_insn = reinterpret_cast<const char*>
> +      (size == 32 ? lea_r10_insn_32 : lea_r10_insn_64);
> +  const char* const lea_r11_insn = reinterpret_cast<const char*>
> +      (size == 32 ? lea_r11_insn_32 : lea_r11_insn_64);
> +
> +  const size_t cmp_insn_len =
> +      (size == 32 ? sizeof(cmp_insn_32) : sizeof(cmp_insn_64));
> +  const size_t lea_r10_insn_len =
> +      (size == 32 ? sizeof(lea_r10_insn_32) : sizeof(lea_r10_insn_64));
> +  const size_t lea_r11_insn_len =
> +      (size == 32 ? sizeof(lea_r11_insn_32) : sizeof(lea_r11_insn_64));
> +  const size_t nop_len = (size == 32 ? 7 : 8);
> +
>    // The function starts with a comparison of the stack pointer and a
>    // field in the TCB.  This is followed by a jump.
>
>    // cmp %fs:NN,%rsp
> -  if (this->match_view(view, view_size, fnoffset, "\x64\x48\x3b\x24\x25", 5)
> -      && fnsize > 9)
> +  if (this->match_view(view, view_size, fnoffset, cmp_insn, cmp_insn_len)
> +      && fnsize > nop_len + 1)
>      {
>        // We will call __morestack if the carry flag is set after this
>        // comparison.  We turn the comparison into an stc instruction
>        // and some nops.
>        view[fnoffset] = '\xf9';
> -      this->set_view_to_nop(view, view_size, fnoffset + 1, 8);
> +      this->set_view_to_nop(view, view_size, fnoffset + 1, nop_len);
>      }
>    // lea NN(%rsp),%r10
>    // lea NN(%rsp),%r11
>    else if ((this->match_view(view, view_size, fnoffset,
> -                            "\x4c\x8d\x94\x24", 4)
> +                            lea_r10_insn, lea_r10_insn_len)
>             || this->match_view(view, view_size, fnoffset,
> -                               "\x4c\x8d\x9c\x24", 4))
> +                               lea_r11_insn, lea_r11_insn_len))
>            && fnsize > 8)
>      {
>        // This is loading an offset from the stack pointer for a

This is what I checked in.  I'd like to backport it to 2.25 branch.
OK for 2.25 branch?

Thanks.

-- 
H.J.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Handle-stack-split-for-x32.patch
Type: text/x-patch
Size: 25448 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/binutils/attachments/20150106/fe206a54/attachment.bin>


More information about the Binutils mailing list