On Mon, Aug 10, 2026 at 4:54 PM Brian Cain <[email protected]>
wrote:

>
> On 8/10/2026 4:32 PM, Taylor Simpson wrote:
>
>
>
> On Mon, Aug 10, 2026 at 3:12 PM Brian Cain <[email protected]>
> wrote:
>
>>
>> On 8/10/2026 3:53 PM, Taylor Simpson wrote:
>>
>>
>>
>> On Mon, Aug 10, 2026 at 1:34 PM Brian Cain <[email protected]>
>> wrote:
>>
>>>
>>> On 8/10/2026 1:28 PM, Taylor Simpson wrote:
>>> > Change disassembly of control regs from C{num}/{name} to {name}
>>> > Change disassembly of system regs from S{num}/r{num} to {name}
>>> >
>>> > Signed-off-by: Taylor Simpson <[email protected]>
>>> > ---
>>> >   target/hexagon/printinsn.c      | 22 ++++++++++++++++++----
>>> >   target/hexagon/gen_printinsn.py | 14 ++++++++------
>>> >   2 files changed, 26 insertions(+), 10 deletions(-)
>>> >
>>> > diff --git a/target/hexagon/printinsn.c b/target/hexagon/printinsn.c
>>> > index a7e46f4bcd..b55d3b0b35 100644
>>> > --- a/target/hexagon/printinsn.c
>>> > +++ b/target/hexagon/printinsn.c
>>> > @@ -23,18 +23,32 @@
>>> >   #include "internal.h"
>>> >   #include "decode.h"
>>> >
>>> > +static char regstr[10];
>>> > +
>>> >   static const char *sreg2str(unsigned int reg)
>>> >   {
>>> > -    if (reg < TOTAL_PER_THREAD_REGS) {
>>> > -        return hexagon_regnames[reg];
>>> > +#ifndef CONFIG_USER_ONLY
>>> > +    if (reg < NUM_SREGS) {
>>> > +        return hexagon_sregnames[reg];
>>> >       } else {
>>> > -        return "???";
>>> > +        snprintf(regstr, sizeof(regstr), "S%d", reg);
>>> > +        return regstr;
>>> >       }
>>> > +#else
>>> > +    snprintf(regstr, sizeof(regstr), "S%d", reg);
>>> > +    return regstr;
>>> > +#endif
>>> >   }
>>> >
>>> >   static const char *creg2str(unsigned int reg)
>>> >   {
>>> > -    return sreg2str(reg + HEX_REG_SA0);
>>> > +    unsigned int gpr = reg + HEX_REG_SA0;
>>> > +    if (gpr < TOTAL_PER_THREAD_REGS) {
>>> > +        return hexagon_regnames[gpr];
>>> > +    } else {
>>> > +        snprintf(regstr, sizeof(regstr), "C%d", reg);
>>> > +        return regstr;
>>> > +    }
>>> >   }
>>> >
>>>
>>>
>>> Seems like this change also depends on some kind of mutex around
>>> regstr[] so that we know it's not being used concurrently by multiple
>>> threads.  Translation is single-threaded but if we gained another caller
>>> we wouldn't remember to come back and remediate this.
>>>
>>> I suppose we could take an input buffer/length.  Or maybe we just add
>>> another static _regnames[] array to solve the lifetime/race problems?
>>>
>>>
>> How about putting a regstr field in the Insn struct (and pass Insn* to
>> these two functions)?
>>
>>
>> A character array?  Sure: seems like that should work.
>>
>> But if we have a static array for the others why not leverage that here
>> too?  We can statically fill these values, right?
>>
>
> These are for cases where there is some sort of error and the reg number
> is larger than NUM_SREGS/TOTAL_PER_THREAD_REGS.  So, we wouldn't know how
> to size these without looking at the number of bits in the encoding of each
> instruction that has one of these.  However, that could change over time if
> the architecture adds new instructions.
>
> Ah, okay, right.
>
> Okay - any solution that mitigates the race should suffice, then.
>

I'll go with static arrays with 256 entries.  Stand by for v2 of the patch.

Reply via email to