llvm-project
8d971c03 - Reapply "[TableGen] Introduce MatcherList to manage a linked list of Matchers. NFC (#177875)"

Commit
4 days ago
Reapply "[TableGen] Introduce MatcherList to manage a linked list of Matchers. NFC (#177875)" With fixes to the slice_after functions to avoid dereferencing the before_begin() iterator. Deferencing the iterator casts a pointer to the BeforeBegin object to Matcher*, but the BeforeBegin object is not a Matcher. This caused a failure when built with gcc. Original commit message: The previous memory management involved passing around references to the std::unique_ptr next pointer in each Matcher. Scopes and SwitchOpcode/SwitchType did not use std::unique_ptr internally, but would sometimes need to have the pointers to their children moved to temporary std::unique_ptrs that may be modified and then put back into the Scope/Switch. Other code used manual deletion. This patch introduces a MatcherList object that encapsulates list management and ownership. The interface is based on std::forward_list using the libcxx implementation for reference. Once a Matcher is added to a MatcherList it can only be in that list or spliced into another list. This ensures it is always owned by a list that will be responsible for deleting it. Scope and SwitchOpcode/Type children are now MatcherLists rather than Matcher*. A nice side effect of this is that we no longer need a Size field in each Matcher to store the size of Scope/Switch children during emission. This field was only used for the Matcher that the Scope/Switch children pointed to. Now we can store it in the MatcherList instead. There is no change to the generated output. There's still a little bit of cleanup that can be done in follow ups. For example, renaming "TheMatcher" and merging FactorScope and FactorNodes together.
Author
Committer
Parents
Loading