Backport below patches: patch:0003: add missing else patch:0004: optimize if construction patch:0005: fix typo in comments Original discussions for the patches are listed below: Link: https://sourceware.org/pipermail/libabigail/2022q4/004878.html Link: https://sourceware.org/pipermail/libabigail/2022q4/004879.html Link: https://sourceware.org/pipermail/libabigail/2022q4/004880.html Signed-off-by: Xiaole He <hexiaole@kylinos.cn>
97 lines
2.7 KiB
Diff
97 lines
2.7 KiB
Diff
From ead3e6317af191324d9044400152e9c881fc3126 Mon Sep 17 00:00:00 2001
|
|
From: Xiaole He <hexiaole@kylinos.cn>
|
|
Date: Sun, 16 Oct 2022 06:47:03 +0000
|
|
Subject: [PATCH 2/3] abg-reader: optimize if construction
|
|
|
|
In 'build_enum_type_decl' function of 'src/abg-reader.cc', the
|
|
'for loop' walk through all the child nodes of the '<enum-decl>' for
|
|
seeking '<underlying-type>' and '<enumerator>':
|
|
|
|
/* original src/abg-reader.cc begin */
|
|
static enum_type_decl_sptr
|
|
build_enum_type_decl(read_context& ctxt,
|
|
const xmlNodePtr node,
|
|
bool add_to_current_scope)
|
|
{
|
|
...
|
|
for (xmlNodePtr n = xmlFirstElementChild(node);
|
|
n;
|
|
n = xmlNextElementSibling(n))
|
|
{
|
|
if (xmlStrEqual(n->name, BAD_CAST("underlying-type")))
|
|
{
|
|
...
|
|
}
|
|
|
|
if (xmlStrEqual(n->name, BAD_CAST("enumerator")))
|
|
{
|
|
...
|
|
}
|
|
}
|
|
...
|
|
}
|
|
/* original src/abg-reader.cc end */
|
|
|
|
Here uses 2 separate 'if' statements for seeking, that is, for any
|
|
child node of the '<enum-decl>', there involves 2 'if' comparations.
|
|
Because the child node of the '<enum-decl>' is either
|
|
'<underlying-type>' or '<enumerator>', there would be a slight
|
|
optimization when use 'if-else if' construction instead, like below:
|
|
|
|
/* optimized src/abg-reader.cc begin */
|
|
for (xmlNodePtr n = xmlFirstElementChild(node);
|
|
n;
|
|
n = xmlNextElementSibling(n))
|
|
{
|
|
if (xmlStrEqual(n->name, BAD_CAST("underlying-type")))
|
|
{
|
|
...
|
|
}
|
|
else if (xmlStrEqual(n->name, BAD_CAST("enumerator")))
|
|
{
|
|
...
|
|
}
|
|
}
|
|
/* optimized src/abg-reader.cc end */
|
|
|
|
Supposing there has the test case:
|
|
|
|
/* test case begin */
|
|
<abi-instr version='1.0'>
|
|
<enum-decl name='E' filepath='../../abitests/test-enum0-v0.cc' line='1' column='6' id='type-id-2'>
|
|
<underlying-type type-id='type-id-1'/>
|
|
<enumerator name='e0' value='0'/>
|
|
<enumerator name='e2' value='1'/>
|
|
</enum-decl>
|
|
</abi-instr>
|
|
/* test case end */
|
|
|
|
When parsing the '<underlying-type>' xml tag, for the original
|
|
'src/abg-reader.cc', there involves 2 'if' comparations. But involves
|
|
only 1 'if' comparation for the optimized 'src/abg-reader.cc'.
|
|
|
|
Signed-off-by: Xiaole He <hexiaole@kylinos.cn>
|
|
Tested-by: Xiaole He <hexiaole@kylinos.cn>
|
|
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
|
|
---
|
|
src/abg-reader.cc | 3 +--
|
|
1 file changed, 1 insertion(+), 2 deletions(-)
|
|
|
|
diff --git a/src/abg-reader.cc b/src/abg-reader.cc
|
|
index 1df3515..ebb55e9 100644
|
|
--- a/src/abg-reader.cc
|
|
+++ b/src/abg-reader.cc
|
|
@@ -4356,8 +4356,7 @@ build_enum_type_decl(read_context& ctxt,
|
|
base_type_id = CHAR_STR(a);
|
|
continue;
|
|
}
|
|
-
|
|
- if (xmlStrEqual(n->name, BAD_CAST("enumerator")))
|
|
+ else if (xmlStrEqual(n->name, BAD_CAST("enumerator")))
|
|
{
|
|
string name;
|
|
int64_t value = 0;
|
|
--
|
|
2.27.0
|
|
|