hubert.reinterpretcast added inline comments.

================
Comment at: clang/lib/CodeGen/CodeGenModule.cpp:1135
+    llvm::MD5 Md5;
+    Md5.update(getModule().getSourceFileName());
+    llvm::MD5::MD5Result R;
----------------
tmsriram wrote:
> hubert.reinterpretcast wrote:
> > davidxl wrote:
> > > rnk wrote:
> > > > davidxl wrote:
> > > > > Source filenames are not guaranteed to be unique, or it does contain 
> > > > > the path as well?
> > > > It appears to contain the path as the compiler receives it on the 
> > > > command line. However, it is possible to design a build where this 
> > > > string is not unique:
> > > > ```
> > > > cd foo
> > > > clang -c name_conflict.c 
> > > > cd ../bar
> > > > clang -c name_conflict.c
> > > > clang foo/name_conflict.o bar/name_conflict.o
> > > > ```
> > > > 
> > > > I don't think we should try to handle this case, but we should document 
> > > > the limitation somewhere. Some build systems do operate changing the 
> > > > working directory as they go.
> > > > 
> > > > Can you add some to the clang/docs/UsersManual.rst file? I'd expect it 
> > > > to show up here:
> > > > https://clang.llvm.org/docs/UsersManual.html#command-line-options
> > > > 
> > > > You can elaborate that the unique names are calculated using the source 
> > > > path passed to the compiler, and in a build system where that is not 
> > > > unique, the function names may not be unique.
> > > > 
> > > > ---
> > > > 
> > > > I have also used this construct in the past for building single-file 
> > > > ABI compatibility test cases:
> > > > 
> > > > ```
> > > > // foo.cpp
> > > > #ifdef PART1
> > > > // ...
> > > > #elif defined(PART2)
> > > > // ...
> > > > #endif
> > > > 
> > > > $ cc -c foo.cpp -DPART1
> > > > $ cc -c foo.cpp -DPART2
> > > > ```
> > > yes, the first example was the scenario I meant. I agree name conflict 
> > > due that case should be really rare. If yes, we can always use content 
> > > based uniqueid -- by appending llvm::getUniqueModuleId -- but that is 
> > > probably overkill.
> > > yes, the first example was the scenario I meant. I agree name conflict 
> > > due that case should be really rare.
> > Except for projects where it is the rule and not the exception. One pattern 
> > where this occurs is when each subdirectory implements one class and there 
> > are multiple classes that implement the same interface. In each directory, 
> > the implementation of each class is separated into files by grouping 
> > methods of the class. The set of filenames in one such directory may well 
> > be the same as the set in another.
> I am not sure much can be done here other than try using getUniqueModuleId.  
> Just to be clear, even if the file names are the same, the actual conflict 
> happens only when the "make " is done from the leaf directory.  Doing:
> 
> cc a/name_conflict.cpp -c
> cc b/name_conflict.cpp -c 
> 
> should still produce unique names.
Understood. I do happen to have been working on a project that does the whole 
`$(MAKE) -C a/` thing with such a project layout. Content based hashing is 
unfortunate for other reasons: The hash would be unstable during the course of 
maintenance on the codebase. I guess the limitation is okay for the intended 
use case of the patch.


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

https://reviews.llvm.org/D73307



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

Reply via email to