[cfe-dev] [RFC] Call ParseLangArgs for all inputs

Harald van Dijk via cfe-dev cfe-dev at lists.llvm.org
Thu Aug 27 04:17:19 PDT 2020


clang/lib/CodeGen/BackendUtil.cpp contains multiple checks for 
attributes of LangOpts. The option processing that sets up LangOpts is 
mostly done by ParseLangArgs, which is skipped for LLVM IR files. 
Because of this, there are code generation differences when the 
-save-temps command line option is used: that command line option causes 
LLVM IR to be emitted to file and a new process to be spawned to process 
that file, which does not process options the same way.

An example of this is

   typedef float __attribute__((ext_vector_type(2))) float2;
   float2 foo (float2 a, float2 b, float2 c) {
     return a * b + c;

This would generate different code with clang --target=mips 
-mcpu=mips32r5 -mfp64 -mmsa -O3 -ffp-contract=fast depending on whether 
-save-temps was also present, because the -ffp-contract=fast option 
affects instruction selection but was ignored for LLVM IR input files.

While CompilerInvocation::CreateFromArgs contained special exceptions 
for a few options that were handled by ParseLangArgs that also need to 
be handled for LLVM IR, there are many more, and just allowing 
ParseLangArgs to be called seems like the simpler fix.

I have created a patch for this and uploaded it as 
<https://reviews.llvm.org/D86695> to get feedback. Does this look like a 
good approach, or should instead the individual options that would have 
an effect even for LLVM IR inputs continue to be listed in 

If the approach I took is a good one, how should -std=* options behave? 
I decided to continue silently ignoring them for InputKind::Precompiled 
as I feel it is reasonable to include them, but generate an error for 
them for LLVM IR inputs as I feel it is unreasonable to include them. 
Does that make sense too, or should they continue to be silently ignored 
for LLVM IR inputs as well?

The patch I uploaded does not yet include tests as I am not sure what 
sort of tests should be included. Would a test that the 
-ffp-contract=fast option is now honored for LLVM IR input files 
suffice, or should I find more options that were also previously 
silently ignored, and figure out how to construct test cases for those too?

Harald van Dijk

More information about the cfe-dev mailing list