Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Group globals for comparison and updating of ids #836

Merged
merged 10 commits into from
Nov 25, 2022

Conversation

stilscher
Copy link
Member

@stilscher stilscher commented Sep 19, 2022

This PR a fix for the way globals are handled in the version comparison and when updating the ids. Globals are now identified only by their name. The associated declaration and at most one definition of a global are grouped together, when collecting them for comparison. In case a definition exists, it is sufficient to consider the definition only, since declarations share the same varinfo with the defnition.
We checked in cabs2cil that also only at most one declaration is created for a global, even though the cil documentation does not state this clearly. Therefore, when grouping entities belonging to a global, only a single declaration can be collected. In case multiple are found in the CIL file, an error is thrown. I updated the cil documentation about GVarDecls in goblint/cil@729a1ff for future reference.

This PR also fixes the incremental tests 03/02 and 03/03 which previously failed when the cfg comparison was enabled.

Closes #627

@stilscher stilscher added the bug label Sep 19, 2022
@stilscher stilscher marked this pull request as ready for review September 20, 2022 14:01
@stilscher stilscher requested a review from jerhard September 20, 2022 14:01
@sim642
Copy link
Member

sim642 commented Sep 21, 2022

We checked in cabs2cil that also only at most one declaration is created for a global, even though the cil documentation does not state this clearly. Therefore, when grouping entities belonging to a global, only a single declaration can be collected. In case multiple are found in the CIL file, an error is thrown.

Is that also preserved by Mergecil? Because even if Cabs2cil on each file does produce at most one declaration (in addition to a definition), then maybe Mergecil leaves all the declarations?

@michael-schwarz
Copy link
Member

We also checked that, and Mergecil preserves that invariant.

src/incremental/compareCIL.ml Outdated Show resolved Hide resolved
src/incremental/updateCil.ml Outdated Show resolved Hide resolved
Copy link
Member

@michael-schwarz michael-schwarz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As soon as Simmo's comments are addressed, I think we can merge this.

@jerhard
Copy link
Member

jerhard commented Sep 28, 2022

Is that also preserved by Mergecil? Because even if Cabs2cil on each file does produce at most one declaration (in addition to a definition), then maybe Mergecil leaves all the declarations?

In mergecilit is checked with hashmaps emittedVarDefn, and emittedVarDecls that no duplicate variable definitions and declarations are inserted. For functions, if the function is not static or inline, this is also checked with a hashmap emittedFunDefn. static functions are not explicitely merged, but from my understanding there should be no need to.

Definitions of inline functions are only merged when merge_inlines is true, and their function bodies (not looking at the function's name) are the same.

@jerhard
Copy link
Member

jerhard commented Sep 28, 2022

The question thus is whether

  • when merge_inlines is false, there can be multiple inline function definitions with the same name?
  • when merge_inlines is true, there can be multiple inline function definitions with the same name, but different bodies?

@sim642
Copy link
Member

sim642 commented Sep 28, 2022

From what I recall, duplicate inline functions, which are not merged, just get renamed with suffixes. At least I remember seeing large numbers of copies of inline functions in the HTML view of such programs.

@michael-schwarz
Copy link
Member

From what I recall, duplicate inline functions, which are not merged, just get renamed with suffixes. At least I remember seeing large numbers of copies of inline functions in the HTML view of such programs.

Yes, I think that is the behavior when merge_inlines is false.

@stilscher stilscher self-assigned this Oct 20, 2022
@michael-schwarz
Copy link
Member

What is the status here? It would be nice to get this so we can merge #609 which will hopefully give a nice performance boost (that the students from our practical starting on Thursday could measure for instance.

@stilscher
Copy link
Member Author

I created a small example to test the open questions that @jerhard posted above. It seems that the merger is not behaving correctly. If merge_inline is disabled a function definition and an inline function definition with the same name but in a different translation unit do not get merged but are not renamed either. This is also the case when merge_inline is enabled but the function bodies are not the same. I will take a look at the merger and try to fix it, in a way that multiple function definitions either get a unique name or are merged.

@jerhard
Copy link
Member

jerhard commented Oct 31, 2022

If merge_inline is disabled a function definition and an inline function definition with the same name but in a different translation unit do not get merged but are not renamed either. This is also the case when merge_inline is enabled but the function bodies are not the same.

Does this already lead to problems with the current master branch? Do the changes in this branch cause additional problematic cases?

@jerhard jerhard merged commit 4974baf into master Nov 25, 2022
@jerhard jerhard deleted the fix-incr-global-comparison branch November 25, 2022 14:12
@sim642 sim642 added this to the v2.2.0 milestone Nov 25, 2022
sim642 added a commit to sim642/opam-repository that referenced this pull request Sep 13, 2023
CHANGES:

* Add `setjmp`/`longjmp` analysis (goblint/analyzer#887, goblint/analyzer#970, goblint/analyzer#1015, goblint/analyzer#1019).
* Refactor race analysis to lazy distribution (goblint/analyzer#1084, goblint/analyzer#1089, goblint/analyzer#1136, goblint/analyzer#1016).
* Add thread-unsafe library function call analysis (goblint/analyzer#723, goblint/analyzer#1082).
* Add mutex type analysis and mutex API analysis (goblint/analyzer#800, goblint/analyzer#839, goblint/analyzer#1073).
* Add interval set domain and string literals domain (goblint/analyzer#901, goblint/analyzer#966, goblint/analyzer#994, goblint/analyzer#1048).
* Add affine equalities analysis (goblint/analyzer#592).
* Add use-after-free analysis (goblint/analyzer#1050, goblint/analyzer#1114).
* Add dead code elimination transformation (goblint/analyzer#850, goblint/analyzer#979).
* Add taint analysis for partial contexts (goblint/analyzer#553, goblint/analyzer#952).
* Add YAML witness validation via unassume (goblint/analyzer#796, goblint/analyzer#977, goblint/analyzer#1044, goblint/analyzer#1045, goblint/analyzer#1124).
* Add incremental analysis rename detection (goblint/analyzer#774, goblint/analyzer#777).
* Fix address sets unsoundness (goblint/analyzer#822, goblint/analyzer#967, goblint/analyzer#564, goblint/analyzer#1032, goblint/analyzer#998, goblint/analyzer#1031).
* Fix thread escape analysis unsoundness (goblint/analyzer#939, goblint/analyzer#984, goblint/analyzer#1074, goblint/analyzer#1078).
* Fix many incremental analysis issues (goblint/analyzer#627, goblint/analyzer#836, goblint/analyzer#835, goblint/analyzer#841, goblint/analyzer#932, goblint/analyzer#678, goblint/analyzer#942, goblint/analyzer#949, goblint/analyzer#950, goblint/analyzer#957, goblint/analyzer#955, goblint/analyzer#954, goblint/analyzer#960, goblint/analyzer#959, goblint/analyzer#1004, goblint/analyzer#558, goblint/analyzer#1010, goblint/analyzer#1091).
* Fix server mode for abstract debugging (goblint/analyzer#983, goblint/analyzer#990, goblint/analyzer#997, goblint/analyzer#1000, goblint/analyzer#1001, goblint/analyzer#1013, goblint/analyzer#1018, goblint/analyzer#1017, goblint/analyzer#1026, goblint/analyzer#1027).
* Add documentation for configuration JSON schema and OCaml API (goblint/analyzer#999, goblint/analyzer#1054, goblint/analyzer#1055, goblint/analyzer#1053).
* Add many library function specifications (goblint/analyzer#962, goblint/analyzer#996, goblint/analyzer#1028, goblint/analyzer#1079, goblint/analyzer#1121, goblint/analyzer#1135, goblint/analyzer#1138).
* Add OCaml 5.0 support (goblint/analyzer#1003, goblint/analyzer#945, goblint/analyzer#1162).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Function forward-declarations mishandled in incremental compare and update
4 participants