v.g.vassilev added a comment.

In https://reviews.llvm.org/D34444#812418, @rjmccall wrote:

> In https://reviews.llvm.org/D34444#795175, @v.g.vassilev wrote:
>
> > @rjmccall, thanks for the prompt and thorough reply.
> >
> > In https://reviews.llvm.org/D34444#793311, @rjmccall wrote:
> >
> > > Okay.  In that case, I see two problems, one major and one potentially 
> > > major.
> >
> >
> >
> >
> >   This is a very accurate diagnosis which took us 5 years to discover on an 
> > empirical basis ;)
>
>
> You could've asked at any time. :)


True. I am not really sure I knew what to ask, though ;)

> 
> 
>>> The major problem is that, as Richard alludes to, you need to make sure you 
>>> emit any on-demand definitions that Sema registered with CodeGen during the 
>>> initial CGM's lifetime but used in later CGMs.
>> 
>> 
>> 
>>   We bring the CGM state to the subsequent CGMs. See 
>> https://github.com/vgvassilev/clang/blob/cling-patches/lib/CodeGen/ModuleBuilder.cpp#L138-L160
> 
> That's quite brittle, because that code is only executed in a code path that 
> only you are using, and you're not adding any tests.  I would greatly prefer 
> a change to IRGen's core assumptions, as suggested.

I am open to changing this code as well. That should probably be another review.

> 
> 
>>> The potentially major problem is that it is not possible in general to 
>>> automatically break up a single translation unit into multiple translation 
>>> units, for two reasons.  The big reason is that there is no way to 
>>> correctly handle entities with non-external linkage that are referenced 
>>> from two parts of the translation unit without implicitly finding some way 
>>> to promote them to external linkage, which might open a huge can of worms 
>>> if you have multiple "outer" translation units.
>> 
>> 
>> 
>>   We do not have an multiple 'outer' translation units. We have just one 
>> ever growing TU (which probably invalidates my previous statement that we 
>> have a distinct TUs) which we send to the RuntimeDyLD allowing only JIT to 
>> resolve symbols from it.  We aid the JIT when resolving symbols with 
>> internal linkage by changing all internal linkage to external (We haven't 
>> seen issues with that approach).
> 
> Ah, okay.  Yes, that is a completely different translation model from having 
> distinct TUs.
> 
> IRGen will generally happily emit references to undefined internal objects; 
> instead of hacking the linkage, you could just clean that up as a post-pass.  
> Although hacking the linkage as post-pass is reasonable, too.  In either 
> case, you can recognize uses of internal-linkage objects that haven't been 
> defined yet and report that back to the user.
> 
>>>   The lesser reason is that the prefix of a valid translation unit is not 
>>> necessarily a valid translation unit: for example, a static or inline 
>>> function can be defined at an arbitrary within the translation unit, i.e. 
>>> not necessarily before its first use.  But if your use case somehow defines 
>>> away these problems, this might be fine.
>> 
>> 
>> 
>>   If we end up with a module containing no definition of a symbol and such 
>> is required, then we complain. So indeed we are defining away this issue.
> 
> Ok.
> 
>>> As a minor request, if you are going to make HandleTranslationUnit no 
>>> longer the final call on CodeGenerator, please either add a new method that 
>>> *is* a guaranteed final call or add a new method that does the whole "end a 
>>> previous part of the translation unit and start a new one" step.
>> 
>> 
>> 
>>   We can have this but it would be a copy of `HandleTranslationUnit`.  The 
>> `StartModule` interface is the antagonist routine to `ReleaseModule`. If you 
>> prefer we could merge `StartModule` into `ReleaseModule` adding a flag (or 
>> reading the value of `isIncrementalProcessingEnabled`).
> 
> I feel it is important that there be a way to inform an ASTConsumer that no 
> further requests will be made of it, something other than calling its 
> destructor.  I would like you to make sure that the ASTConsumer interface 
> supports that and that that call is not made too soon in your alternate 
> processing mode.

Do you have a preference of a name of this new interface?


Repository:
  rL LLVM

https://reviews.llvm.org/D34444



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

Reply via email to