[PATCH] D140959: RFC: Multilib prototype
Michael Platings via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jan 25 08:57:43 PST 2023
michaelplatings added a comment.
How the multilib system matches user arguments is the main problem I've been struggling with.
These are the options I see:
1. Grant the multilib system full access to all cc1 arguments, as demonstrated by the current code. However declare the multilib system unstable - if you write a multilib specification, you are responsible for making sure it's updated when clang is updated. Clang plugins set the precedent for such an approach.
Advantage: It's powerful.
Disadvantages:
- Experience with clang plugins suggests instability will be a source of frequent pain.
- @lenary points out that the order of arguments can be significant.
- Requires some major refactoring of how arguments are processed before this can be done in a robust way (how I implemented it in the prototype is far from robust).
2. Pass to the multilib system only the arguments as provided by the user.
Advantage: Greatly reduced API surface.
Disadvantage: whoever writes a multilib specification will have to reinvent a lot of logic to infer attributes from --target, -march, -mcpu etc. but with inadequate tools to do so.
3. Normalise user arguments before passing them to the multilib system.
Advantages:
- Uses the existing arguments API.
- Powerful, if it can be done correctly.
Disadvantage:
- The normalisation process effectively becomes a new API.
- Normalisation appears hard to do correctly = likelihood of bugs.
- Identifying attributes from arguments is fiddly e.g. extracting Arm architecture extensions from the march argument.
- It's too easy to write a regex that could unintentionally match a newly introduced argument so the instability problem remains somewhat.
4. Hard-code the attributes and how they are detected in the same way they already are right now. For Arm this could be extended with Function Multi Versioning as @lenary pointed to, with namespacing to avoid potential clashes with other names. So you could have attributes like `[fsanitize=address, fno-exceptions, mfloat-abi=softfp, march=thumbv8.1m.main, arm:mve]`.
Advantages:
- This is similar to what we already do for multilib so it's well understood.
- Limited yet extensible API.
Disadvantages:
- Greatly limits the expressiveness of the multilib system.
- Any time someone wants to base their multilib on a new attribute it requires a change to Clang.
- Some regular expressions still required for forward compatibility e.g. with future versions of Armv8-M.
5. A combination of (1) and (4) as proposed by @lenary.
Advantages:
- Stability where predefined attributes are available.
- The power to access unstable arguments if necessary.
Disadvantages:
- Same as for (1) - requires some major refactoring of how arguments are processed before this can be done in a robust way (how I implemented it in the prototype is far from robust).
- Greater maintenance burden.
None of these options are great but (4) is low risk and extensible so I'm currently investigating that.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D140959/new/
https://reviews.llvm.org/D140959
More information about the cfe-commits
mailing list