tahonermann added inline comments.

================
Comment at: clang/lib/Driver/Driver.cpp:5541-5545
+    if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o))
+      TempPath = FinalOutput->getValue();
+    else
+      TempPath = BaseInput;
+
----------------
ChuanqiXu wrote:
> dblaikie wrote:
> > ChuanqiXu wrote:
> > > dblaikie wrote:
> > > > dblaikie wrote:
> > > > > ChuanqiXu wrote:
> > > > > > dblaikie wrote:
> > > > > > > It'd be nice if we didn't have to recompute this/lookup `OPT_o` 
> > > > > > > here - any way we can use the object file output path here 
> > > > > > > (that's already handled `OPT_o` or using the base input name, 
> > > > > > > etc)?
> > > > > > I didn't understand this a lot. We don't compute anything here and 
> > > > > > we just use the object file output path here if `-o` is provided 
> > > > > > and we replace the suffix then. I feel this is simple enough.
> > > > > Computing the path to write to is what I'm referring to - and the 
> > > > > fact that this had a bug (was relative to the source path instead of 
> > > > > the CWD)/divergence from the `-o` path logic is the sort of thing I 
> > > > > want to avoid.
> > > > > 
> > > > > I'm not sure there's an easy way to do this - but looks like the 
> > > > > logic to name the .o file output is in `Driver::GetNamedOutputPath` 
> > > > > and gets stored in the `clang::driver::Compilation`.... which I guess 
> > > > > is where we are, but we're going through here with a 
> > > > > `PrecompileJobAction` insntead of the compile job action, I suppose.
> > > > > 
> > > > > Could we keep these two codepaths closer together?
> > > > > 
> > > > > It'd be really nice if we could reuse that in some way.
> > > > > 
> > > > > Hmm, actually, why doesn't this fall out of the existing algorithm 
> > > > > without modification?
> > > > > 
> > > > > Ah, I see, since the precompile action isn't "at top level" it gets a 
> > > > > temporary file name - so if we change only that, it seems to fall out 
> > > > > naturally:
> > > > > ```
> > > > > diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
> > > > > index c7efe60b2335..db878cbfff46 100644
> > > > > --- a/clang/lib/Driver/Driver.cpp
> > > > > +++ b/clang/lib/Driver/Driver.cpp
> > > > > @@ -5556,9 +5556,9 @@ const char 
> > > > > *Driver::GetNamedOutputPath(Compilation &C, const JobAction &JA,
> > > > >    }
> > > > >  
> > > > >    // Output to a temporary file?
> > > > > -  if ((!AtTopLevel && !isSaveTempsEnabled() &&
> > > > > +  if (((!AtTopLevel && !isSaveTempsEnabled() &&
> > > > >         !C.getArgs().hasArg(options::OPT__SLASH_Fo)) ||
> > > > > -      CCGenDiagnostics) {
> > > > > +      CCGenDiagnostics) && JA.getType() != types::TY_ModuleFile) {
> > > > >      StringRef Name = llvm::sys::path::filename(BaseInput);
> > > > >      std::pair<StringRef, StringRef> Split = Name.split('.');
> > > > >      const char *Suffix = types::getTypeTempSuffix(JA.getType(), 
> > > > > IsCLMode());
> > > > > ```
> > > > > 
> > > > > Without the need to reimplement/duplicate the `-o` handling logic?
> > > > Oh, I should say, this patch didn't actually have the flag support, but 
> > > > it'd be something like this ^ but with the command line argument test 
> > > > as well (so "other stuff that's already there && !(TY_ModuleFile && 
> > > > hasArg fmodule-output)")
> > > To be honest, I prefer the previous patch. I feel it has higher 
> > > readability. But this is a problem about taste and it doesn't have 
> > > standard answer. Someone's readability is redundancy for others : )
> > I think there's real functionality we're at risk of missing by having 
> > separate implementations.
> > 
> > For instance - how does this interact with Apple's multiarch support (eg: 
> > `clang++ test.cppm -fmodule-output -arch i386 -arch x86_64 -target 
> > x86_64_apple_darwin`) - from my testing, without specifying an output file, 
> > you get something semi-usable/not simply incorrect: `test-i386.pcm` and 
> > `test-x86_64.pcm`. But if you try to name the output file you get `foo.pcm` 
> > and then another `foo.pcm` that overwrites the previous one. I think this 
> > could be taken care of if the suffix handling code was delegated down 
> > towards the else block that starts with `SmallString<128> 
> > Output(getDefaultImageName());`
> > 
> > But maybe solving that ^ problem could come out of a more general solution 
> > to the next problem:
> > 
> > What if you specify multiple source files on the command line without `-c`? 
> > Without `-o` you get `test1.pcm` and `test2.pcm`, but with `-o foo` you get 
> > `foo.pcm` overwriting `foo.pcm`. Perhaps if the output file specified isn't 
> > a .o file, we should ignore the `-o` and use the input-filename based 
> > naming? I guess we could reject this situation outright, and require the 
> > user to run multiple separate compilations. Though keeping features 
> > composable is nice.
> > 
> > Perhaps this needs a bit more consideration of some of these cases?
> > 
> > 
> Oh, thanks for finding this. It is pretty bad that I didn't image we can 
> specify multiple input module units in one command line.
> 
> > What if you specify multiple source files on the command line without -c? 
> > Without -o you get test1.pcm and test2.pcm, but with -o foo you get foo.pcm 
> > overwriting foo.pcm. Perhaps if the output file specified isn't a .o file, 
> > we should ignore the -o and use the input-filename based naming? I guess we 
> > could reject this situation outright, and require the user to run multiple 
> > separate compilations. Though keeping features composable is nice.
> 
> Now the name of the module file will be the same with the input file no 
> matter if we specified `-o` or not. With `-o` specified, the module files 
> will be generated into the same directory with the output file. Without `-o` 
> specified, the module files will be generated in  the working directory. 
> It'll still be problematic if the user specify two inputs with the same name 
> in two different directory, the module file of the latter will overwrite the 
> former one. But I guess we don't need to handle such cases?
> 
> > For instance - how does this interact with Apple's multiarch support (eg: 
> > clang++ test.cppm -fmodule-output -arch i386 -arch x86_64 -target 
> > x86_64_apple_darwin) - from my testing, without specifying an output file, 
> > you get something semi-usable/not simply incorrect: test-i386.pcm and 
> > test-x86_64.pcm. But if you try to name the output file you get foo.pcm and 
> > then another foo.pcm that overwrites the previous one. I think this could 
> > be taken care of if the suffix handling code was delegated down towards the 
> > else block that starts with SmallString<128> Output(getDefaultImageName());
> 
> In the new implementation,  I image we'll generate  test-i386.pcm and 
> test-x86_64.pcm even if we specified `-o` with `-fmodule-output`. But the 
> weird thing is that when I tried to reproduce your example, the compiler told 
> me the other archs are ignored. I'm not sure if I set something wrong or I 
> must do it in Apple machine.
> 
> BTW, I am not sure if I misunderstand you, but the else block that starts 
> with `SmallString<128> Output(getDefaultImageName());` handles about IMAGE 
> types, which looks irreverent to me.
> how does this interact with Apple's multiarch support

Good question. What does split dwarf do in this case? Are differently named 
outputs generated or is a multi-arch dwarf file produced (assuming they exist)?

Rejecting the command line if it specifies multiple `-arch` options with 
`-fmodule-output=` seems fair to me (unless/until support for multi-arch .pcm 
files is added). How is this handled with `-split_dwarf_output`?

> I'm not sure if I set something wrong or I must do it in Apple machine.

I don't recall for sure, but I think Apple Clang is needed. We noticed 
differences between community Clang and Apple Clang while I was at Coverity, 
but I don't recall the details.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D137058/new/

https://reviews.llvm.org/D137058

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to