From: Pedro Alves <palves@redhat.com>
To: Philipp Rudo <prudo@linux.vnet.ibm.com>, Yao Qi <qiyaoltc@gmail.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [RFC 4/7] Share code in initialize_tdesc_ functions
Date: Wed, 17 May 2017 15:43:00 -0000 [thread overview]
Message-ID: <148caa86-619a-9941-071b-7f38c817db33@redhat.com> (raw)
In-Reply-To: <20170516140217.1f2d3c64@ThinkPad>
On 05/16/2017 01:02 PM, Philipp Rudo wrote:
> Hi Yao,
>
> On Thu, 11 May 2017 21:55:04 +0100
> Yao Qi <qiyaoltc@gmail.com> wrote:
>
>> diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
>> index 754f15b..a81ae0d 100644
>> --- a/gdb/target-descriptions.c
>> +++ b/gdb/target-descriptions.c
>
> [...]
>
>> @@ -54,7 +57,10 @@ typedef struct tdesc_reg
>> char *name;
>>
>> /* The register number used by this target to refer to this
>> - register. This is used for remote p/P packets and to determine
>> + register. Positive number means it is got by increasing
>> + the previous register number by one. Negative number means
>> + it is got from "regnum" attribute in the xml file.
>> + This is used for remote p/P packets and to determine
>> the ordering of registers in the remote g/G packets. */
>> long target_regnum;
>
> I'm not really sure if I like your idea with positive/negative regnums. It
> could easily lead to hard to find bugs because someone forgot a '-' somewhere.
> I would prefer an extra field like
>
> bool explicit_regnum;
> or
> bool automatic_regnum;
>
> [...]
>
>> +/* Return the unique name of FEATURE. The uniqueness means different
>> + target description features have different values. This is used
>> + to differentiate different features with the same name. */
>> +
>> +static std::string
>> +tdesc_feature_unique_name (const struct tdesc_feature* feature)
>> +{
>> + std::string name = std::string (feature->name);
>> +
>> + if (name.compare ("org.gnu.gdb.arm.m-profile") == 0)
>> + {
>> + struct tdesc_reg *reg;
>> +
>> + for (int ix = 0;
>> + VEC_iterate (tdesc_reg_p, feature->registers, ix, reg);
>> + ix++)
>> + if (reg->type != NULL && strcmp (reg->type, "arm_fpa_ext") == 0)
>> + {
>> + name.append ("_fpa");
>> + break;
>> + }
>> + }
>> + else if (name.compare ("org.gnu.gdb.arm.vfp") == 0)
>> + {
>> + name.append ("_");
>> + name.append (std::to_string (VEC_length (tdesc_reg_p,
>> + feature->registers) - 1));
>> + }
>> + else if (name.compare ("org.gnu.gdb.i386.core") == 0)
>> + {
>> + struct tdesc_reg *reg = NULL;
>> +
>> + for (int ix = 0;
>> + VEC_iterate (tdesc_reg_p, feature->registers, ix, reg);
>> + ix++)
>> + {
>> + if (strcmp (reg->name, "ebp") == 0
>> + || strcmp (reg->name, "rbp") == 0)
>> + break;
>> + }
>> +
>> + name.append ("_");
>> + if (strcmp (reg->name, "ebp") == 0)
>> + name.append ("i386");
>> + else
>> + {
>> + if (strcmp (reg->type, "data_ptr") == 0)
>> + name.append ("amd64");
>> + else
>> + name.append ("x32");
>> + }
>> + }
>> + else if (name.compare ("org.gnu.gdb.power.core") == 0)
>> + {
>> + struct tdesc_reg *reg = NULL;
>> + struct tdesc_reg *reg_mq = NULL;
>> + struct tdesc_reg *reg_r0 = NULL;
>> +
>> + /* Four variants. */
>> + for (int ix = 0;
>> + VEC_iterate (tdesc_reg_p, feature->registers, ix, reg);
>> + ix++)
>> + {
>> + if (strcmp (reg->name, "r0") == 0)
>> + reg_r0 = reg;
>> + if (strcmp (reg->name, "mq") == 0)
>> + reg_mq = reg;
>> +
>> + if (reg_r0 != NULL && reg_mq != NULL)
>> + break;
>> + }
>> +
>> + name.append ("_");
>> + if (reg_mq == NULL)
>> + name.append (std::to_string (reg_r0->bitsize));
>> + else
>> + {
>> + if (reg_mq->target_regnum == -124)
>> + name.append ("601");
>> + else
>> + name.append ("rs6000");
>> + }
>> + }
>> + else if (name.compare ("org.gnu.gdb.power.fpu") == 0)
>> + {
>> + struct tdesc_reg *reg = NULL;
>> +
>> + /* Three variants. */
>> + for (int ix = 0;
>> + VEC_iterate (tdesc_reg_p, feature->registers, ix, reg);
>> + ix++)
>> + {
>> + if (strcmp (reg->name, "fpscr") == 0)
>> + break;
>> + }
>> +
>> + name.append ("_");
>> +
>> + if (reg->target_regnum == -71)
>> + name.append ("rs6000");
>> + else
>> + name.append (std::to_string (reg->bitsize));
>> + }
>> + else if (name.compare ("org.gnu.gdb.power.linux") == 0)
>> + {
>> + struct tdesc_reg *reg = NULL;
>> +
>> + for (int ix = 0;
>> + VEC_iterate (tdesc_reg_p, feature->registers, ix, reg);
>> + ix++)
>> + {
>> + if (strcmp (reg->name, "orig_r3") == 0)
>> + break;
>> + }
>> +
>> + name.append (std::to_string (reg->bitsize));
>> + }
>> + else if (name.compare ("org.gnu.gdb.s390.linux") == 0)
>> + {
>> + struct tdesc_reg *reg = NULL;
>> + struct tdesc_reg *reg_orig_r2 = NULL;
>> + struct tdesc_reg *reg_sc = NULL;
>> + struct tdesc_reg *reg_lb = NULL;
>> +
>> + /* Six variants. */
>> + for (int ix = 0;
>> + VEC_iterate (tdesc_reg_p, feature->registers, ix, reg);
>> + ix++)
>> + {
>> + if (strcmp (reg->name, "orig_r2") == 0)
>> + reg_orig_r2 = reg;
>> + if (strcmp (reg->name, "last_break") == 0)
>> + reg_lb = reg;
>> + if (strcmp (reg->name, "system_call") == 0)
>> + reg_sc = reg;
>> +
>> + if (reg_orig_r2 != NULL && reg_sc != NULL && reg_lb != NULL)
>> + break;
>> + }
>> +
>> + name.append ("_");
>> + name.append (std::to_string (reg_orig_r2->bitsize));
>> +
>> + if (reg_lb != NULL)
>> + {
>> + name.append ("_");
>> +
>> + if (reg_sc == NULL)
>> + name.append ("v1");
>> + else
>> + name.append ("v2");
>> + }
>> + }
>> + else if (name.compare ("org.gnu.gdb.s390.core") == 0)
>> + {
>> + struct tdesc_reg *reg = NULL;
>> + struct tdesc_reg *reg_r0 = NULL;
>> + struct tdesc_reg *reg_r0l = NULL;
>> +
>> + /* Six variants. */
>> + for (int ix = 0;
>> + VEC_iterate (tdesc_reg_p, feature->registers, ix, reg);
>> + ix++)
>> + {
>> + if (strcmp (reg->name, "r0") == 0)
>> + reg_r0 = reg;
>> + if (strcmp (reg->name, "r0l") == 0)
>> + reg_r0l = reg;
>> +
>> + if (reg_r0 != NULL && reg_r0l != NULL)
>> + break;
>> + }
>> +
>> + name.append ("_");
>> + if (reg_r0l != NULL)
>> + name.append ("s64");
>> + else
>> + name.append (std::to_string (reg_r0->bitsize));
>> + }
>> + else if (name.compare ("org.gnu.gdb.mips.cpu") == 0
>> + || name.compare ("org.gnu.gdb.mips.cp0") == 0
>> + || name.compare ("org.gnu.gdb.mips.fpu") == 0
>> + || name.compare ("org.gnu.gdb.mips.dsp") == 0
>> + || name.compare ("org.gnu.gdb.mips.linux") == 0)
>> + {
>> + struct tdesc_reg *reg = VEC_index (tdesc_reg_p, feature->registers, 0);
>> +
>> + name.append (std::to_string (reg->bitsize));
>> + }
>> +
>> + std::replace (name.begin (), name.end (), '.', '_');
>> + std::replace (name.begin (), name.end (), '-', '_');
>> +
>> + return name;
>> +}
>> +
>
> This function is actually the part I like least of your implementation. Its
> way to long and barely readable. The way I understand, it is needed to create
> unique macro and function names. So why don't you simply use the filename of
> the XML file where the feature is defined? It already is unique. Or use an
> gdbarch hook so every architecture can decide for itself how to name them?
Agreed. I was reading the patch and thinking how there must be a better
way to handle this.
Thanks,
Pedro Alves
next prev parent reply other threads:[~2017-05-17 15:43 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-11 15:55 [RFC 0/7] Make GDB builtin target descriptions more flexible Yao Qi
2017-05-11 15:55 ` [RFC 5/7] Centralize i386 linux target descriptions Yao Qi
2017-05-11 15:55 ` [RFC 2/7] Add unit test to builtin tdesc generated by xml Yao Qi
2017-05-16 12:00 ` Philipp Rudo
2017-05-16 15:46 ` Yao Qi
2017-05-17 9:09 ` Philipp Rudo
2017-05-17 16:06 ` Pedro Alves
2017-05-30 8:00 ` Philipp Rudo
2017-06-01 17:53 ` Philipp Rudo
2017-05-17 15:41 ` Pedro Alves
2017-05-18 9:54 ` Yao Qi
2017-05-18 11:34 ` Pedro Alves
2017-05-19 15:47 ` Yao Qi
2017-05-22 8:51 ` Yao Qi
2017-05-11 15:55 ` [RFC 6/7] Lazily and dynamically create i386-linux target descriptions Yao Qi
2017-05-11 18:14 ` John Baldwin
2017-05-11 21:03 ` Yao Qi
2017-05-17 15:43 ` Pedro Alves
2017-05-18 15:12 ` Yao Qi
2017-05-19 10:15 ` Pedro Alves
2017-05-19 14:27 ` Yao Qi
2017-05-11 15:55 ` [RFC 1/7] Move initialize_tdesc_mips* calls from mips-linux-nat.c to mips-linux-tdep.c Yao Qi
2017-05-11 15:55 ` [RFC 3/7] Adjust the order of 32bit-linux.xml and 32bit-sse.xml in i386/i386-linux.xml Yao Qi
2017-05-11 15:55 ` [RFC 7/7] Remove builtin tdesc_i386_*_linux Yao Qi
2017-05-16 12:02 ` Philipp Rudo
2017-05-17 15:46 ` Pedro Alves
2017-05-11 16:06 ` [RFC 0/7] Make GDB builtin target descriptions more flexible Eli Zaretskii
2017-05-11 20:56 ` Yao Qi
2017-05-11 20:55 ` [RFC 4/7] Share code in initialize_tdesc_ functions Yao Qi
2017-05-16 12:02 ` Philipp Rudo
2017-05-17 15:43 ` Pedro Alves [this message]
2017-05-18 11:21 ` Yao Qi
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=148caa86-619a-9941-071b-7f38c817db33@redhat.com \
--to=palves@redhat.com \
--cc=gdb-patches@sourceware.org \
--cc=prudo@linux.vnet.ibm.com \
--cc=qiyaoltc@gmail.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