[clang][cli] Parse Lang and CodeGen options separately

Authored by jansvoboda11 on Jan 15 2021, 8:55 AM.


[clang][cli] Parse Lang and CodeGen options separately

This patch moves the parsing of {Lang,CodeGen}Options from parseSimpleArgs to the original Parse{Lang,CodeGen}Args functions.

This ensures all marshalled LangOptions are being parsed after the call setLangDefaults, which in turn enables us to marshall LangOptions that somehow depend on the defaults. (In a future patch.)

Now, CodeGenOptions need to be parsed after LangOptions, because -cl-mad-enable (a CodeGenOpt) depends on the value of -cl-fast-relaxed-math and -cl-unsafe-math-optimizations (LangOpts).

Unfortunately, this removes the nice property that marshalled options get parsed in the exact order they appear in the .td file. Now we cannot be sure that a TableGen record referenced in ImpliedByAnyOf has already been parsed. This might cause an ordering issues (i.e. reading value of uninitialized variable). I plan to mitigate this by moving each XxxOpt group from parseSimpleArgs back to their original parsing function. With this setup, if an option from group A references option from group B in TableGen, the compiler will require us to make the CompilerInvocation member for B visible in the parsing function for A. That's where we notice that B didn't get parsed yet.

Reviewed By: Bigcheese

Differential Revision: https://reviews.llvm.org/D94682