[cfe-dev] Checking if function have been emitted

John McCall via cfe-dev cfe-dev at lists.llvm.org
Wed Jan 4 10:12:10 PST 2017


> On Jan 4, 2017, at 4:41 AM, Piotr Padlewski <piotr.padlewski at gmail.com> wrote:
> 2017-01-03 16:42 GMT+01:00 John McCall <rjmccall at apple.com <mailto:rjmccall at apple.com>>:
> 
>> On Jan 3, 2017, at 7:23 AM, Piotr Padlewski <piotr.padlewski at gmail.com <mailto:piotr.padlewski at gmail.com>> wrote:
>> 
>> Maybe there is something I am missing, but I though vtables are being generated at the end of translation unit. 
>> If there is nothing clang emits after vtable (maybe except inline virtual functions if they are reffered by vtable), then if there is a direct call to inline function, the function has to be emitted before
>> vtables. 
> 
> This is a fixed-point(-ish) problem: emitting a v-table can require more virtual functions which can require more v-tables.  So we just add stuff to queues and drain all the queues in a loop.
> 
>> I would like to emit available_externally vtable only if all inline virtual functions has been emitted.
>> It seems that I find function like virtual default destructor, that should be emitted before vtables (because there is implicit destructor call), but isDeclaration() return true for it.
> 
> You cannot rely on exact order like this in the normal emission code.  IRGen does not and will not guarantee it.
> 
> You could make a separate pass after the lazy-emission loop.
> 
> John.
> 
> Thanks John, that would make sense. By 'separate pass' you mean do it in CodeGenModule::Release?

Immediately after EmitDeferred(), yes.  (But as a separate function, please.)

John.

> 
> Piotr
>  
>> 
>> Test case like:
>> 
>> struct A {
>>   virtual void foo();
>>   virtual ~A() {};
>> };
>> 
>> void test() {
>>   A a; // This will force emit of A's destructor.
>> }
>> 
>> 
>> 
>> 
>> 2017-01-03 3:55 GMT+01:00 Mehdi Amini <mehdi.amini at apple.com <mailto:mehdi.amini at apple.com>>:
>> 
>> > On Dec 30, 2016, at 10:38 AM, Piotr Padlewski via cfe-dev <cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>> wrote:
>> >
>> > Hi,
>> > I would like to check if there is inline virtual function that was not emitted.
>> >
>> > I tried to do something like this based on CodeGenModule::GetOrCreateLLVMFunction:
>> >
>> >       StringRef Name = CGM.getMangledName(VFunction);
>> >       auto *Entry = CGM.GetGlobalValue(Name);
>> >
>> >       // If function doesn't exist or doesn't have a definition.
>> >       if (!Entry || Entry->isDeclaration())
>> >         return true;
>> >
>> > But Entry->isDeclaration() returns True for functions that I would expect to be emited.
>> > What is the proper way of checking that?
>> 
>> isDeclaration() only returns true for a function that does not have a body / hasn’t been materialized yet. Do you observe that it is not the case in practice? Or are you trying to look if a function will be emitted by clang but hasn’t already?
>> 
>>>> Mehdi
>> 
>> 
> 
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20170104/e727bfb2/attachment.html>


More information about the cfe-dev mailing list