Re: flag to know that we are compiling GDB for an arm target

Zied Guermazi <[email protected]>
Newsgroups gmane.comp.gdb.devel
Message-ID <[email protected]>
hi

I will put different solutions together with advantages disadvantages

- add a vector of registers to each instruction

     advantage: close to the logical model: a function is a set of 
instructions, an instruction changes a set of registers.

     disadvantage: consumes much memory (3 additional pointers, for an 
empty vector)

- extend the instruction class

     advantage: targets not needing the registers are not heavily impacted

     disadvantages: still an additional pointer is added

- Infer the ISA mode from mapping symbols

     advantages: no overhead in the data structure

     disadvantages: dwarf info are not always available.

- Compression methods (BTRACE_INSN_AUX, BTRACE_INSN_ISA)

     advantage: less memory overhead

     disadvantages: requires traveling the vector to find the register 
value and match it with the instruction

- use additional bits in btrace_insn_flag

     advantages: no memory overhead

     disadvantages: encode architecture specific info.


I will go for using additional bits (bit 1, bit 2 and bit 3) in 
btrace_insn_flag to encode the isa for armv7  as folowing

ocsd_isa_arm as  0x02

ocsd_isa_thumb2 as  0x04

ocsd_isa_tee as  0x06

ocsd_isa_jazelle as 0x08


Kind Regards

Zied Guermazi


On 22.03.21 09:29, Metzger, Markus T wrote:
> With class hierarchies, you'd end up allocating each object independently
> and adding a pointer to the overall cost.
>
> For calculating the target IP of any given recorded instruction, we'd just
> look at the next instruction in the trace, wouldn't we?
>
> Can we infer the ISA mode from mapping symbols?  Or we could annotate
> changes to the ISA mode in the trace.  Some time ago, Felix had proposed
> a new insn class BTRACE_INSN_AUX; instead of storing the PC, it would store
> an index into a string vector.  This could be generalized to store an index
> into some tagged auxiliary object vector.
>
> Or, more simply, add a new insn class BTRACE_INSN_ISA that stores an
> arch-specific ISA enum instead of the PC.
>
> We could further compress struct btrace_insn to store the iclass in 8b
> to make room for another 16b field.
>
> Or reserve some flags encoding space for arch-specific information
> like the ISA mode.
>
> Regards,
> Markus.
>
>> -----Original Message-----
>> From: Gdb <[email protected]> On Behalf Of Zied Guermazi
>> Sent: Montag, 22. März 2021 05:00
>> To: Simon Marchi <[email protected]>; [email protected]
>> Subject: Re: flag to know that we are compiling GDB for an arm target
>>
>> Thanks simon,
>>
>> it is elegant to solve it during instantiation.
>>
>> /Zied
>>
>> On 22.03.21 04:40, Simon Marchi wrote:
>>> On 2021-03-21 10:46 p.m., Zied Guermazi wrote:
>>>> hi Simon,
>>>>
>>>> I am extending btrace for armv7 and armv8. In armv7, due to some limitations
>> in the debug HW, GDB requires the current program status register CPSR to know
>> in which ISA mode it is, so that it can set breakpoints properly and calculate the
>> "landing" address for next, nexti, step commands
>>>> When we use the traces in replay mode we need to know and provide the cpsr
>> at any instruction.
>>>> there is a data structure (btrace_insn in btrace.h) that was extended to holds
>> cpsr register and possibly other registers (paving the way for data tracing).
>> currently it is a vector of registers, that will be (currently) empty of all
>> architectures except ARMv7 (see the struct below). We have typically thousands
>> to millions instances of this structure.
>>>>
>>>> struct btrace_insn
>>>> {
>>>>     /* The address of this instruction.  */
>>>>     CORE_ADDR pc;
>>>>
>>>>     /* The size of this instruction in bytes.  */
>>>>     gdb_byte size;
>>>>
>>>>    /* A vector of registers.  */
>>>>     std::vector<record_btrace_reg_entry> registers;
>>>>
>>>>     /* The instruction class of this instruction.  */
>>>>     enum btrace_insn_class iclass;
>>>>
>>>>     /* A bit vector of BTRACE_INSN_FLAGS.  */
>>>>     btrace_insn_flags flags;
>>>> };
>>>>
>>>>
>>>> the empty vector was judged to be a big overhead for Intel PT for example. I
>> am looking for a way to inhibit it, when we are not building GDB for armv7.
>>>> do you have any proposal for solving such a situation?
>>> Bearing in mind that I don't know this problem in detail, it sounds like
>>> if making btrace_insn bigger isn't an option, then you'll want to have a
>>> specific subclass for ARM (btrace_insn_arm), that adds the extra data.
>>> However, since btrace_insn is used in a vector of objects in
>>> btrace_function, then maybe you'll also need a specific
>>> btrace_function_arm (btrace_function would keep using a vector of
>>> btrace_insn, btrace_function_arm would use a vector of btrace_insn_arm.
>>> Similarly, you might need a btrace_thread_info_arm, because
>>> btrace_thread_info contains a vector of btrace_function.  But then it's
>>> not clear how that would interface with struct thread_info, to be able
>>> to choose the right kind at runtime.  I suppose that would involve a
>>> class hierarchy with some virtual functions, where on Intel
>>> btrace_thread_info is instantiated, and on ARM btrace_thread_info_arm is
>>> instantiated.  Ideally, all without introducing too much virtual
>>> function calls on the fast path.
>>>
>>> Simon
>> --
>>
>> *Zied Guermazi*
>> founder
>>
>> Trande UG
>> Leuschnerstraße 2
>> 69469 Weinheim/Germany
>>
>> Mobile: +491722645127
>> mailto:[email protected]
>>
>> *Trande UG*
>> Leuschnerstraße 2, D-69469 Weinheim; Telefon: +491722645127
>> Sitz der Gesellschaft: Weinheim- Registergericht: AG Mannheim HRB 736209
>> - Geschäftsführung: Zied Guermazi
>>
>> *Confidentiality Note*
>> This message is intended only for the use of the named recipient(s) and
>> may contain confidential and/or privileged information. If you are not
>> the intended recipient, please contact the sender and delete the
>> message. Any unauthorized use of the information contained in this
>> message is prohibited.
>>
> Intel Deutschland GmbH
> Registered Address: Am Campeon 10, 85579 Neubiberg, Germany
> Tel: +49 89 99 8853-0, www.intel.de <http://www.intel.de>
> Managing Directors: Christin Eisenschmid, Sharon Heck, Tiffany Doon Silva
> Chairperson of the Supervisory Board: Nicole Lau
> Registered Office: Munich
> Commercial Register: Amtsgericht Muenchen HRB 186928
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.