Re: buildbot vs --enable-targets=all

Luis Machado via Gdb <[email protected]>
Newsgroups gmane.comp.gdb.devel,gmane.comp.gnu.binutils
Message-ID <[email protected]>
On 8/3/22 12:49, Mark Wielaard wrote:
> Hi Luis,
> 
> On Wed, 2022-08-03 at 12:35 +0100, Luis Machado wrote:
>> On 8/3/22 11:38, Mark Wielaard wrote:
>>> On Mon, 2022-07-25 at 21:59 -0400, Jeffrey Walton wrote:
>>>> On Mon, Jul 25, 2022 at 8:26 AM Mark Wielaard <[email protected]>
>>>> wrote:
>>>>> On fedora-s390x and debian-ppc64 one of the gdb selftests fails
>>>>> https://builder.sourceware.org/buildbot/#builders/75/builds/783
>>>>> https://builder.sourceware.org/buildbot/#builders/76/builds/772
>>>>>
>>>>> Running selftest arm-record.
>>>>> Process record and replay target doesn't support syscall number
>>>>> -2036195
>>>>> Process record does not support instruction 0x7f70ee1d at
>>>>> address 0x0.
>>>>> Self test failed: self-test failed at ../../binutils-
>>>>> gdb/gdb/arm-
>>>>> tdep.c:14407
>>>>>
>>>>> Which is:
>>>>>
>>>>>     /* 32-bit Thumb-2 instructions.  */
>>>>>     {
>>>>>       arm_insn_decode_record arm_record;
>>>>>
>>>>>       memset (&arm_record, 0, sizeof (arm_insn_decode_record));
>>>>>       arm_record.gdbarch = gdbarch;
>>>>>
>>>>>       static const uint16_t insns[] = {
>>>>>         /* 1d ee 70 7f     mrc    15, 0, r7, cr13, cr0, {3} */
>>>>>         0xee1d, 0x7f70,
>>>>>       };
>>>>>
>>>>>       enum bfd_endian endian = gdbarch_byte_order_for_code
>>>>> (arm_record.gdbarch);
>>>>>       instruction_reader_thumb reader (endian, insns);
>>>>>       int ret = decode_insn (reader, &arm_record, THUMB2_RECORD,
>>>>>                              THUMB2_INSN_SIZE_BYTES);
>>>>>
>>>>>       SELF_CHECK (ret == 0);
>>>>>       SELF_CHECK (arm_record.mem_rec_count == 0);
>>>>>       SELF_CHECK (arm_record.reg_rec_count == 1);
>>>>>       SELF_CHECK (arm_record.arm_regs[0] == 7);
>>>>>     }
>>>>>
>>>>> This seems a big endian issue given the instructions are given
>>>>> as two
>>>>> 16bit numbers.
>>>>
>>>> [...]
>>>>> For ARM, this does not look right (to me):
>>>>>       static const uint16_t insns[] = {
>>>>>         /* 1d ee 70 7f     mrc    15, 0, r7, cr13, cr0, {3} */
>>>>>         0xee1d, 0x7f70,
>>>>>       };
>>>>
>>>> I think you are supposed to use .inst.n and .inst.w because they
>>>> handle endianness properly.
>>>
>>> I couldn't figure out how to do that. Could you give an example?
>>> It looks like the instruction_reader_thumb only takes an array of
>>> uint16_t (even though the instructions are 32bit long). But I might
>>> be
>>> looking at the wrong code.
>>>
>>> So the following fixes it for me on s390x and ppc64
>>>
>>> diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
>>> index d4c5beb5e06..ef0da73398d 100644
>>> --- a/gdb/arm-tdep.c
>>> +++ b/gdb/arm-tdep.c
>>> @@ -14471,7 +14471,7 @@ arm_record_test (void)
>>>    
>>>        static const uint16_t insns[] = {
>>>          /* 1d ee 70 7f    mrc    15, 0, r7, cr13, cr0, {3} */
>>> -      0xee1d, 0x7f70,
>>> +      0x7f70, 0xee1d,
>>>        };
>>>    
>>>        enum bfd_endian endian = gdbarch_byte_order_for_code
>>> (arm_record.gdbarch);
>>>
>>> But obviously that breaks things on little-endian architectures.
>>> We could define the insns[] differently using
>>>
>>>    #if _BYTE_ORDER == _LITTLE_ENDIAN
>>>         0xee1d, 0x7f70,
>>>    #else
>>>         0x7f70, 0xee1d,
>>>    #endif
>>>
>>> But that might not be what you meant.
>>>
>> I wonder what's going wrong here given we're using
>> gdbarch_byte_order_for_code to read things.
>>
>> Technically it should read in the right order.
> 
> Yes, if the code bytes were in the right order. Like when you read them
> from disk or from a process running in that byte order. But here they
> are constructed in memory in the byte order of the host architecture as
> an uint16_t array. So when using the gdbarch_byte_order_for_code order
> to reconstruct those instructions it is not using the host byte order
> (if they don't match).
> 
> I think what Jeffrey means is that there is a different way to
> construct the bytes in memory using .inst.n and .inst.w, but I don't
> fully understand how that works.
> 
> Cheers,
> 
> Mark

Ah, I see. And s390/ppc being potentially big endian, this fails.

I managed to reproduce this on my end by forcing GDB to use big endian. Could you please file a PR for this one and cc me?

I'll try to come up with a fix.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.