From patchwork Tue May 5 18:06:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Giuliano Procida X-Patchwork-Id: 39222 From: gprocida@google.com (Giuliano Procida) Date: Tue, 5 May 2020 19:06:09 +0100 Subject: [PATCH 1/4] Add XML reader test for incomplete function types. In-Reply-To: <20200505180612.232158-1-gprocida@google.com> References: <20200505180612.232158-1-gprocida@google.com> Message-ID: <20200505180612.232158-2-gprocida@google.com> This commit illustrates a bug caused by early caching of type names. * tests/data/Makefile.am: Add new test files. * tests/data/test-abidiff-exit/test-fun-param-v0.c: New test. * tests/data/test-abidiff-exit/test-fun-param-v0.o: Ditto. * tests/data/test-abidiff-exit/test-fun-param-v0.abi: Ditto. * tests/data/test-abidiff-exit/test-fun-param-v1.c: Ditto. * tests/data/test-abidiff-exit/test-fun-param-v1.o: Ditto. * tests/data/test-abidiff-exit/test-fun-param-v1.abi: Ditto. * tests/data/test-abidiff-exit/test-fun-param-report.txt: New test report showing incorrect type "void ()*:. * tests/test-abidiff-exit.cc: Run new test case. Signed-off-by: Giuliano Procida --- tests/data/Makefile.am | 7 +++ .../test-fun-param-report.txt | 15 ++++++ .../test-abidiff-exit/test-fun-param-v0.abi | 44 +++++++++++++++++ .../test-abidiff-exit/test-fun-param-v0.c | 7 +++ .../test-abidiff-exit/test-fun-param-v0.o | Bin 0 -> 2992 bytes .../test-abidiff-exit/test-fun-param-v1.abi | 46 ++++++++++++++++++ .../test-abidiff-exit/test-fun-param-v1.c | 7 +++ .../test-abidiff-exit/test-fun-param-v1.o | Bin 0 -> 3000 bytes tests/test-abidiff-exit.cc | 9 ++++ 9 files changed, 135 insertions(+) create mode 100644 tests/data/test-abidiff-exit/test-fun-param-report.txt create mode 100644 tests/data/test-abidiff-exit/test-fun-param-v0.abi create mode 100644 tests/data/test-abidiff-exit/test-fun-param-v0.c create mode 100644 tests/data/test-abidiff-exit/test-fun-param-v0.o create mode 100644 tests/data/test-abidiff-exit/test-fun-param-v1.abi create mode 100644 tests/data/test-abidiff-exit/test-fun-param-v1.c create mode 100644 tests/data/test-abidiff-exit/test-fun-param-v1.o diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index a1b9bf64..461d9481 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -151,6 +151,13 @@ test-abidiff-exit/test-decl-struct-v0.o \ test-abidiff-exit/test-decl-struct-v1.c \ test-abidiff-exit/test-decl-struct-v1.o \ test-abidiff-exit/test-decl-struct-report.txt \ +test-abidiff-exit/test-fun-param-v0.c \ +test-abidiff-exit/test-fun-param-v0.o \ +test-abidiff-exit/test-fun-param-v0.abi \ +test-abidiff-exit/test-fun-param-v1.c \ +test-abidiff-exit/test-fun-param-v1.o \ +test-abidiff-exit/test-fun-param-v1.abi \ +test-abidiff-exit/test-fun-param-report.txt \ \ test-diff-dwarf/test0-v0.cc \ test-diff-dwarf/test0-v0.o \ diff --git a/tests/data/test-abidiff-exit/test-fun-param-report.txt b/tests/data/test-abidiff-exit/test-fun-param-report.txt new file mode 100644 index 00000000..6bfbcf0d --- /dev/null +++ b/tests/data/test-abidiff-exit/test-fun-param-report.txt @@ -0,0 +1,15 @@ +Functions changes summary: 0 Removed, 1 Changed, 0 Added function +Variables changes summary: 0 Removed, 0 Changed, 0 Added variable + +1 function with some indirect sub-type change: + + [C] 'function void reg(ops*)' at test-fun-param-v1.c:7:1 has some indirect sub-type changes: + parameter 1 of type 'ops*' has sub-type changes: + in pointed to type 'struct ops' at test-fun-param-v1.c:1:1: + type size hasn't changed + 1 data member change: + type of 'void ()* ops::bind_class' changed: + in pointed to type 'function type void (void*, unsigned int, unsigned long int)': + parameter 4 of type 'void*' was added + parameter 5 of type 'unsigned long int' was added + diff --git a/tests/data/test-abidiff-exit/test-fun-param-v0.abi b/tests/data/test-abidiff-exit/test-fun-param-v0.abi new file mode 100644 index 00000000..816f74c8 --- /dev/null +++ b/tests/data/test-abidiff-exit/test-fun-param-v0.abi @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/data/test-abidiff-exit/test-fun-param-v0.c b/tests/data/test-abidiff-exit/test-fun-param-v0.c new file mode 100644 index 00000000..aa1198c9 --- /dev/null +++ b/tests/data/test-abidiff-exit/test-fun-param-v0.c @@ -0,0 +1,7 @@ +struct ops { + void(*foo)(void); + void(*bind_class)(void *, unsigned int, unsigned long); + int(*bar)(int); +}; + +void reg(struct ops* o) { (void)o; } diff --git a/tests/data/test-abidiff-exit/test-fun-param-v0.o b/tests/data/test-abidiff-exit/test-fun-param-v0.o new file mode 100644 index 0000000000000000000000000000000000000000..64218730b3fa188f61752ebbc917f49a75a92785 GIT binary patch literal 2992 zcmbtW&2QsW5T6(4!>OBW+E7R+5=LTG7GWnXXlWO92^6|5yINI9dqkC;IF3bPSGH5S zAU*^LSPp2BkPs3l_J+ir0~f?U!2yW_LPDID+e#c@#(ppByt)?{HSf**X6DVu`*7cV z`Py!QF%ZPyGTfI03UIf4pYJ7X51OzHH}-D*zIW^Gd$(Wv=~sk{iAqgYSWNiLpk??% za1=p{G1W#;83qBcLbXo@$r4PdeuliN*j5OvsD6t=14`w@yz&mIlHon#KE?s6>O!$X z%z~OsWz|DLyMqJ$R2pEhSn~WB%IX&=)I!GvR+$wh(qmu$g4#M}RC$oN!sjFOFpvYb z#Lm~7no?h_FR|rH;~~^GnWAdiCG9zFOJhwerUr_diu=t?T(pQlJqwgpV66>MJ_nk% zj~(BwFD$rNr8ntj?-lfhGme&ev@n#IjUj-CVRduVy(3)qh9OF7n7yxrA!uu z7UupGl|n@Tx@Jg}oq-Z|7e@u2#F4ST>opvcV}e`DAa#Yn7JXFDU3Y^&`*qoqxt2GEE7x!6JL}KtTjqwju5WZVy7>3BZcO5-?`*q{?}T0-MJw!&wof)M z8W*3@4OcgYR&>+vkHWwYrjarA-|+l_5nJ}yiNHqwus^nVCaDTSnK4PSso|5NRo$K;YkTnc@=({Lxedyx$4Y4rO=a z0>{ZdyYG7$oZ^1NZxbA~-kBu-`fZ*Evo#W$OYnx;eqy zgmWCG^GI;9a}t9&uwn~L8?TrdI%CTmIQG;%^!#Cfx`elEJ9Lic)cCykE?&^A%h>ZB z;esK+><5#HgHMa;2eD(~`(Q+|)qkBkIitfNK2i=({C`fX=uf>B{S?dfI5RtcT$XR> zV~7(b-^8ojUY=zCH8h}e^I!ef(N|uRVv6{`k&q$TmcAnNh3;i+h`pD7`Qa|d>0A*c z&NzL6h_>-3uSvMc!5>J-kZgN^IvFGLKRMXV_!2AIQk{AE|G_VX@TdIgm6P)y={y!b7CphTZ2KD`5S{3FC@O_3+E2@QDs9|gc?5ns%2A)e=do*yVW zUs)1DvNFunKmrpo@bCwZm*Oi3Y$cR!U*_lnld^WWq7-w}>{mizZFd^q39 literal 0 HcmV?d00001 diff --git a/tests/data/test-abidiff-exit/test-fun-param-v1.abi b/tests/data/test-abidiff-exit/test-fun-param-v1.abi new file mode 100644 index 00000000..dcc91d19 --- /dev/null +++ b/tests/data/test-abidiff-exit/test-fun-param-v1.abi @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/data/test-abidiff-exit/test-fun-param-v1.c b/tests/data/test-abidiff-exit/test-fun-param-v1.c new file mode 100644 index 00000000..e47f49cc --- /dev/null +++ b/tests/data/test-abidiff-exit/test-fun-param-v1.c @@ -0,0 +1,7 @@ +struct ops { + void(*foo)(void); + void(*bind_class)(void *, unsigned int, unsigned long, void *, unsigned long); + int(*bar)(int); +}; + +void reg(struct ops* o) { (void) o; } diff --git a/tests/data/test-abidiff-exit/test-fun-param-v1.o b/tests/data/test-abidiff-exit/test-fun-param-v1.o new file mode 100644 index 0000000000000000000000000000000000000000..c84e4f0fe209d872c2309acefceba2cce51a998f GIT binary patch literal 3000 zcmbtV-D@LN6hAkUk4dMAX=Amef+MWd6=%{`S<{uS(Q3EVWhugnFH&Zb$z(8@DKnGW zRYVXGR}i`&s31P*vu{57qW&YkxZs1Zf)5KmxaUmn&EDKjU-XdNd(Q8ibI-^9m=9mQ zwp(Bf1TnY*4D#~lfp9TX>DdbN87~cn#22EY z1eO`oT?Dm$6agz#yJV0p!L;gE$m^Qx#K4OBk0>;tRL;yRpOPvYJ|ph-R3r|n`dqO> z%$%N0Wj#Q__yGs{>omZ8u@rsKuTStTHW8B+9 zA3Z8dY;A>H^%9U=B?T680jDb%49g&k{U+JWb5zFyZ1&=ch_$vt8FiMwd^uaHUXrpX zEMxA^P$^UdpsPfpYzfNPT^u!d8b`+dsn>AK4h(KGgVak>t3M8{BPVu7*71g&Z6cIb zpgM_xZp)>Gj|v+4jl(4HL$7C2?}t(7n=?pjoW!kR)OCg}KZ^XJ*BV44ujL=bQ8(y0 zt)6$>8V0W82EG#v;p+7p=FZ0R=9ax_ZE2iqs@ zOV*|5Ov^W|zLVSxyMs6iqj6%5!*_$QXQhri^b&B9KkN>jB*`!B>dww(^Ql)nH*ms9 zU~98|QAq(yei;8m?7cUDoiy0$d__OSjy;AL{fV-Ezf^C0QrM}LchO)1=Z4qQr-cj>&{73Hixp{NhKl>PSso|5NTmDfxxrJ1Tl(FB=E;4BH-=Lh;~Tc zjf)&7dwJjYB%I=Y$K}rzoQv>o!lJZ zUBWqyC-XpXsdtis-E&e0Y!@$>9eYE^?s@LmKMcZtgu0A(TsQWPXVmz(gg#zR*<~1n zo^ZhsV0WX@$is)l4x`kw@pZ70)aky%oxH(eAD<|XC;mUDRrIIcihhdaI-HrFKQ5~` z^a;cXQ*Ywy++Lkj|1~tAbMs&QH_%sIlVXbaf07`PYD?b``cii!n~dd$>MqCWT#=nP z3b>`)Nm*+41DSvw9)ckunYa#>} z_+@yF1c}u6hp5YoZ}I~r`b6>R9Z=&RAx3M8Jdw>P_!1V6r^{<`NKl+LYf6-UUM~zKu spYr$zJYjn8=}lGrX;1P>{f&}B67T**I@>E+H_!io=l{KM X-Patchwork-Id: 39218 From: gprocida@google.com (Giuliano Procida) Date: Tue, 5 May 2020 19:06:10 +0100 Subject: [PATCH 2/4] abg-reader.cc: Late canonicalise all types. In-Reply-To: <20200505180612.232158-1-gprocida@google.com> References: <20200505180612.232158-1-gprocida@google.com> Message-ID: <20200505180612.232158-3-gprocida@google.com> The XML reader has ability to canonicalise types both immediately after creation and after a translation unit (or corpus) has been read. The latter is referred to as late canonicalisation and needs to be chosen for a variety of reasons. Early canonicalisation doesn't appear to bring any performance advantages and doing things with incomplete types is the cause of at least one diff reporting bug. * src/abg-reader.cc: (maybe_canonicalize_type): Rename this function to canonicalize_type_later and make it unconditionally schedule its type argument for later canonicalisation. (perform_late_type_canonicalizing): Update doc comment. (read_context::build_or_get_type_decl): Substitute call to maybe_canonicalize_type with call to canonicalize_type_later. (build_function_decl): Ditto. (build_class_decl): Ditto. (build_union_decl): Ditto. (build_class_tdecl): Ditto. (build_type_tparameter): Ditto. (build_type_composition): Ditto. (build_template_tparameter): Ditto. (handle_type_decl): Ditto. (handle_qualified_type_decl): Ditto. (handle_pointer_type_def): Ditto. (handle_reference_type_def): Ditto. (handle_function_type): Avoid canonicalising null type. Substitute call to maybe_canonicalize_type with call to canonicalize_type_later. (handle_array_type_def): Ditto. (handle_enum_type_decl): Substitute call to maybe_canonicalize_type with call to canonicalize_type_later. (handle_typedef_decl): Ditto. (handle_class_decl): Ditto. (handle_union_decl): Ditto. Signed-off-by: Giuliano Procida --- src/abg-reader.cc | 104 ++++++++++++++-------------------------------- 1 file changed, 32 insertions(+), 72 deletions(-) diff --git a/src/abg-reader.cc b/src/abg-reader.cc index 255a200f..a2bd3c5c 100644 --- a/src/abg-reader.cc +++ b/src/abg-reader.cc @@ -889,62 +889,21 @@ public: clear_decls_stack(); } - /// Test if a type should be canonicalized early. If so, - /// canonicalize it right away. Otherwise, schedule it for late - /// canonicalizing; that is, schedule it so that it's going to be - /// canonicalized when the translation unit is fully read. + /// Schedule all types for canonicalizing once the translation unit + /// is fully read. /// /// @param t the type to consider for canonicalizing. void - maybe_canonicalize_type(type_base_sptr t, - bool force_delay = false) + canonicalize_type_later(type_base_sptr t) { - if (!t) - return; + ABG_ASSERT(t); + ABG_ASSERT(!t->get_canonical_type()); - if (t->get_canonical_type()) - return; + // Check that class types have been properly added to their contexts. + if (class_decl_sptr c = is_class_type(t)) + ABG_ASSERT(c->get_scope()); - // If this class has some non-canonicalized sub type, then wait - // for the when we've read all the translation unit to - // canonicalize all of its non-canonicalized sub types and then we - // can canonicalize this one. - // - // Also, if this is a declaration-only class, wait for the end of - // the translation unit reading so that we have its definition and - // then we'll use that for canonicalizing it. - if (!force_delay - && !type_has_non_canonicalized_subtype(t) - && !is_class_type(t) - && !is_union_type(t) - && !is_wip_type(t) - // Below are types that *must* be canonicalized only after - // they are added to their context; but then this function - // might be called to early, before they are actually added to - // their context. - // - // TODO: make sure this function is called after types are - // added to their context, so that we can try to - // early-canonicalize some of these types, reducing the size - // of the set of types to put on the side, waiting for being - // canonicalized. - && !is_method_type(t) - && !is_reference_type(t) - && !is_pointer_type(t) - && !is_qualified_type(t) - && !is_typedef(t) - && !is_enum_type(t) - && !is_function_type(t)) - canonicalize(t); - else - { - // We do not want to try to canonicalize a class type that - // hasn't been properly added to its context. - if (class_decl_sptr c = is_class_type(t)) - ABG_ASSERT(c->get_scope()); - - schedule_type_for_late_canonicalizing(t); - } + schedule_type_for_late_canonicalizing(t); } /// Schedule a type for being canonicalized after the current @@ -955,9 +914,9 @@ public: schedule_type_for_late_canonicalizing(type_base_sptr t) {m_types_to_canonicalize.push_back(t);} - /// Perform the canonicalizing of types that ought to be done after - /// the current translation unit is read. This function is called - /// when the current corpus is fully built. + /// Perform the canonicalizing of types after the current + /// translation unit is read. This function is called when the + /// current corpus is fully built. void perform_late_type_canonicalizing() { @@ -1413,7 +1372,7 @@ read_context::build_or_get_type_decl(const string& id, if (add_decl_to_scope) pop_scope_or_abort(scope); - maybe_canonicalize_type(t, !add_decl_to_scope); + canonicalize_type_later(t); } return t; } @@ -3217,7 +3176,7 @@ build_function_decl(read_context& ctxt, ctxt.get_translation_unit()->bind_function_type_life_time(fn_type); - ctxt.maybe_canonicalize_type(fn_type, !add_to_current_scope); + ctxt.canonicalize_type_later(fn_type); ctxt.maybe_add_fn_to_exported_decls(fn_decl.get()); @@ -4653,7 +4612,7 @@ build_class_decl(read_context& ctxt, decl_base_sptr td = get_type_declaration(t); ABG_ASSERT(td); set_member_access_specifier(td, access); - ctxt.maybe_canonicalize_type(t, !add_to_current_scope); + ctxt.canonicalize_type_later(t); xml_char_sptr i= XML_NODE_GET_ATTRIBUTE(p, "id"); string id = CHAR_STR(i); ABG_ASSERT(!id.empty()); @@ -5012,7 +4971,7 @@ build_union_decl(read_context& ctxt, decl_base_sptr td = get_type_declaration(t); ABG_ASSERT(td); set_member_access_specifier(td, access); - ctxt.maybe_canonicalize_type(t, !add_to_current_scope); + ctxt.canonicalize_type_later(t); xml_char_sptr i= XML_NODE_GET_ATTRIBUTE(p, "id"); string id = CHAR_STR(i); ABG_ASSERT(!id.empty()); @@ -5268,7 +5227,7 @@ build_class_tdecl(read_context& ctxt, add_to_current_scope)) { if (c->get_scope()) - ctxt.maybe_canonicalize_type(c, /*force_delay=*/false); + ctxt.canonicalize_type_later(c); class_tmpl->set_pattern(c); } } @@ -5335,7 +5294,7 @@ build_type_tparameter(read_context& ctxt, ABG_ASSERT(result->get_environment()); - ctxt.maybe_canonicalize_type(result, /*force_delay=*/false); + ctxt.canonicalize_type_later(result); return result; } @@ -5389,8 +5348,7 @@ build_type_composition(read_context& ctxt, build_qualified_type_decl(ctxt, n, /*add_to_current_scope=*/true))) { - ctxt.maybe_canonicalize_type(composed_type, - /*force_delay=*/true); + ctxt.canonicalize_type_later(composed_type); result->set_composed_type(composed_type); break; } @@ -5517,7 +5475,7 @@ build_template_tparameter(read_context& ctxt, if (result) { ctxt.key_type_decl(result, id); - ctxt.maybe_canonicalize_type(result, /*force_delay=*/false); + ctxt.canonicalize_type_later(result); } return result; @@ -5607,7 +5565,7 @@ handle_type_decl(read_context& ctxt, { type_decl_sptr decl = build_type_decl(ctxt, node, add_to_current_scope); if (decl && decl->get_scope()) - ctxt.maybe_canonicalize_type(decl, /*force_delay=*/false); + ctxt.canonicalize_type_later(decl); return decl; } @@ -5640,7 +5598,7 @@ handle_qualified_type_decl(read_context& ctxt, build_qualified_type_decl(ctxt, node, add_to_current_scope); if (decl && decl->get_scope()) - ctxt.maybe_canonicalize_type(decl, /*force_delay=*/false); + ctxt.canonicalize_type_later(decl); return decl; } @@ -5657,7 +5615,7 @@ handle_pointer_type_def(read_context& ctxt, pointer_type_def_sptr decl = build_pointer_type_def(ctxt, node, add_to_current_scope); if (decl && decl->get_scope()) - ctxt.maybe_canonicalize_type(decl, /*force_delay=*/false); + ctxt.canonicalize_type_later(decl); return decl; } @@ -5674,7 +5632,7 @@ handle_reference_type_def(read_context& ctxt, reference_type_def_sptr decl = build_reference_type_def(ctxt, node, add_to_current_scope); if (decl && decl->get_scope()) - ctxt.maybe_canonicalize_type(decl, /*force_delay=*/false); + ctxt.canonicalize_type_later(decl); return decl; } @@ -5690,7 +5648,8 @@ handle_function_type(read_context& ctxt, { function_type_sptr type = build_function_type(ctxt, node, add_to_current_scope); - ctxt.maybe_canonicalize_type(type, /*force_delay=*/true); + if (type) + ctxt.canonicalize_type_later(type); return type; } @@ -5706,7 +5665,8 @@ handle_array_type_def(read_context& ctxt, { array_type_def_sptr decl = build_array_type_def(ctxt, node, add_to_current_scope); - ctxt.maybe_canonicalize_type(decl, /*force_delay=*/false); + if (decl) + ctxt.canonicalize_type_later(decl); return decl; } @@ -5722,7 +5682,7 @@ handle_enum_type_decl(read_context& ctxt, build_enum_type_decl_if_not_suppressed(ctxt, node, add_to_current_scope); if (decl && decl->get_scope()) - ctxt.maybe_canonicalize_type(decl, /*force_delay=*/false); + ctxt.canonicalize_type_later(decl); return decl; } @@ -5737,7 +5697,7 @@ handle_typedef_decl(read_context& ctxt, typedef_decl_sptr decl = build_typedef_decl(ctxt, node, add_to_current_scope); if (decl && decl->get_scope()) - ctxt.maybe_canonicalize_type(decl, /*force_delay=*/false); + ctxt.canonicalize_type_later(decl); return decl; } @@ -5788,7 +5748,7 @@ handle_class_decl(read_context& ctxt, class_decl_sptr decl = build_class_decl_if_not_suppressed(ctxt, node, add_to_current_scope); if (decl && decl->get_scope()) - ctxt.maybe_canonicalize_type(decl, /*force_delay=*/false); + ctxt.canonicalize_type_later(decl); return decl; } @@ -5806,7 +5766,7 @@ handle_union_decl(read_context& ctxt, union_decl_sptr decl = build_union_decl_if_not_suppressed(ctxt, node, add_to_current_scope); if (decl && decl->get_scope()) - ctxt.maybe_canonicalize_type(decl, /*force_delay=*/false); + ctxt.canonicalize_type_later(decl); return decl; } From patchwork Tue May 5 18:06:11 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Giuliano Procida X-Patchwork-Id: 39219 From: gprocida@google.com (Giuliano Procida) Date: Tue, 5 May 2020 19:06:11 +0100 Subject: [PATCH 3/4] abg-reader.cc: Strip out WIP type tracking. In-Reply-To: <20200505180612.232158-1-gprocida@google.com> References: <20200505180612.232158-1-gprocida@google.com> Message-ID: <20200505180612.232158-4-gprocida@google.com> This functionality was needed only for early canonicalisation of types and is now no longer used. * src/abg-reader.cc (read_context): Drop m_wip_types_map member. Drop clear_wip_classes_map, mark_type_as_wip, unmark_type_as_wip and is_wip_type methods. Signed-off-by: Giuliano Procida --- src/abg-reader.cc | 67 ----------------------------------------------- 1 file changed, 67 deletions(-) diff --git a/src/abg-reader.cc b/src/abg-reader.cc index a2bd3c5c..27bc9d51 100644 --- a/src/abg-reader.cc +++ b/src/abg-reader.cc @@ -119,7 +119,6 @@ private: unordered_map > m_types_map; unordered_map > m_fn_tmpl_map; unordered_map > m_class_tmpl_map; - unordered_map m_wip_types_map; vector m_types_to_canonicalize; string_xml_node_map m_id_xml_node_map; xml_node_decl_base_sptr_map m_xml_node_decl_map; @@ -518,66 +517,6 @@ public: clear_types_to_canonicalize() {m_types_to_canonicalize.clear();} - /// Clean the map of classes that are "Work In Progress"; that is, - /// the map of the class that are currently being built, but at not - /// yet fully built. - void - clear_wip_classes_map() - {m_wip_types_map.clear();} - - /// Mark a given type as being "Work In Progress"; that is, mark it - /// as being currently built. - /// - /// @param t the class to mark as being "Work In Progress". - void - mark_type_as_wip(const type_base_sptr t) - { - if (!t) - return; - string qname = get_type_name(t, /*qualified=*/true); - unordered_map::iterator it = m_wip_types_map.find(qname); - if (it == m_wip_types_map.end()) - m_wip_types_map[qname] = 1; - else - ++it->second; - } - - /// Mark a given class as being *NOT* "Work In Progress" anymore; - /// that is, mark it as being fully built. - /// - /// @param t the type to mark as being built. - void - unmark_type_as_wip(const type_base_sptr t) - { - if (!t) - return; - - string qname = get_type_name(t, /*qualified=*/true); - unordered_map::iterator it = m_wip_types_map.find(qname); - if (it == m_wip_types_map.end()) - return; - if (it->second) - --it->second; - if (it->second == 0) - m_wip_types_map.erase(it); - } - - /// Test if a type is being currently built; that is, if it's "Work - /// In Progress". - /// - /// @param t the type to consider. - bool - is_wip_type(const type_base_sptr t) const - { - if (!t) - return false; - - string qname = get_type_name(t, /*qualified=*/true); - unordered_map::const_iterator i = - m_wip_types_map.find(qname); - return i != m_wip_types_map.end(); - } - /// Test if two types are equal, without comparing them structurally. /// /// This either tests that type pointers are equal, or it tests @@ -3815,7 +3754,6 @@ build_function_type(read_context& ctxt, parms, size, align)); ctxt.get_translation_unit()->bind_function_type_life_time(fn_type); - ctxt.mark_type_as_wip(fn_type); ctxt.key_type_decl(fn_type, id); for (xmlNodePtr n = node->children; n ; n = n->next) @@ -3842,7 +3780,6 @@ build_function_type(read_context& ctxt, } fn_type->set_parameters(parms); - ctxt.unmark_type_as_wip(fn_type); return fn_type; } @@ -4538,7 +4475,6 @@ build_class_decl(read_context& ctxt, ctxt.push_decl_to_current_scope(decl, add_to_current_scope); ctxt.map_xml_node_to_decl(node, decl); - ctxt.mark_type_as_wip(decl); ctxt.key_type_decl(decl, id); // If this class has a naming typedef, get it and refer to it. @@ -4762,7 +4698,6 @@ build_class_decl(read_context& ctxt, } ctxt.pop_scope_or_abort(decl); - ctxt.unmark_type_as_wip(decl); return decl; } @@ -4945,7 +4880,6 @@ build_union_decl(read_context& ctxt, ctxt.push_decl_to_current_scope(decl, add_to_current_scope); ctxt.map_xml_node_to_decl(node, decl); - ctxt.mark_type_as_wip(decl); ctxt.key_type_decl(decl, id); for (xmlNodePtr n = node->children; !is_decl_only && n; n = n->next) @@ -5097,7 +5031,6 @@ build_union_decl(read_context& ctxt, } ctxt.pop_scope_or_abort(decl); - ctxt.unmark_type_as_wip(decl); return decl; } From patchwork Tue May 5 18:06:12 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Giuliano Procida X-Patchwork-Id: 39221 From: gprocida@google.com (Giuliano Procida) Date: Tue, 5 May 2020 19:06:12 +0100 Subject: [PATCH 4/4] Pass bind_function_type_life_time a complete type. In-Reply-To: <20200505180612.232158-1-gprocida@google.com> References: <20200505180612.232158-1-gprocida@google.com> Message-ID: <20200505180612.232158-5-gprocida@google.com> Calling bind_function_type_life_time with an incomplete function type is remaining cause of incomplete pretty representations of types being generated and cached and then later used in reports. This patch moves the call to this function to after the type is complete. Update test that illustrated incomplete function type. * src/abg-reader.cc: Move call to bind_function_type_life_time to end of function. * tests/data/test-abidiff-exit/test-fun-param-report.txt: Fix incomplete function type. Signed-off-by: Giuliano Procida --- src/abg-reader.cc | 2 +- tests/data/test-abidiff-exit/test-fun-param-report.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/abg-reader.cc b/src/abg-reader.cc index 27bc9d51..d7c48919 100644 --- a/src/abg-reader.cc +++ b/src/abg-reader.cc @@ -3753,7 +3753,6 @@ build_function_type(read_context& ctxt, : new function_type(return_type, parms, size, align)); - ctxt.get_translation_unit()->bind_function_type_life_time(fn_type); ctxt.key_type_decl(fn_type, id); for (xmlNodePtr n = node->children; n ; n = n->next) @@ -3780,6 +3779,7 @@ build_function_type(read_context& ctxt, } fn_type->set_parameters(parms); + ctxt.get_translation_unit()->bind_function_type_life_time(fn_type); return fn_type; } diff --git a/tests/data/test-abidiff-exit/test-fun-param-report.txt b/tests/data/test-abidiff-exit/test-fun-param-report.txt index 6bfbcf0d..295cce84 100644 --- a/tests/data/test-abidiff-exit/test-fun-param-report.txt +++ b/tests/data/test-abidiff-exit/test-fun-param-report.txt @@ -8,7 +8,7 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable in pointed to type 'struct ops' at test-fun-param-v1.c:1:1: type size hasn't changed 1 data member change: - type of 'void ()* ops::bind_class' changed: + type of 'void (void*, unsigned int, unsigned long int)* ops::bind_class' changed: in pointed to type 'function type void (void*, unsigned int, unsigned long int)': parameter 4 of type 'void*' was added parameter 5 of type 'unsigned long int' was added