Handle Duff's device and other unstructured switch statements#459
Merged
xavierleroy merged 5 commits intomasterfrom Nov 9, 2022
Merged
Handle Duff's device and other unstructured switch statements#459xavierleroy merged 5 commits intomasterfrom
switch statements#459xavierleroy merged 5 commits intomasterfrom
Conversation
Instead of passing a string that encodes the optional source-to-source transformations to perform, just pass one optional, named argument for each transformation. It is clearer and easier to extend this way.
This ensures that normalized switch statements remain normalized. However, if the label and the labeled statement are on different lines, add an extra line directive corresponding to the label before the labeled statement.
- New elaboration pass: SwitchNorm
- recognizes structured 'switch' statements and puts them in a
normalized form;
- if selected, transforms unstructured 'switch' statements into a
structured switch with goto actions + the original switch body
with appropriate labels and gotos.
- C2C treatment of 'switch' statements is simplified accordingly.
- New language support option `-funstructured-switch`.
- Some tests were added (test/regression/switch3.c).
…on, `-finput-charset` and other small fixes)
This can occur in debug mode if there are declarations before the
first case, as in
```
switch (x) {
int x;
case 0:
...
}
```
Without this commit, the code above is a structured switch if -g is not given,
and a non-structured switch if -g is given.
Co-authored-by: Michael Schmidt <github@mschmidt.me>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR introduces a new (unverified) elaboration pass, SwitchNorm, that recognizes structured
switchstatements and puts them in a normalized form. If selected (language support option-funstructured-switch), otherswitchstatements are turned into a structured switch withgotoactions, followed by the originalswitchbody with appropriate labels andgoto.For example, Duff's infamous code
becomes
Other examples can be found in test/regression/switch3.c.