[LLVMdev] [DragonEgg] Why Fortran's "call flush()" is converted to "call void bitcast (void (...)* @_gfortran_flush_i4 to void (i8*)*)(i8* null) nounwind" ?

Dmitry N. Mikushin maemarcus at gmail.com
Tue Jul 17 08:27:46 PDT 2012


OK, at our end the following workaround seems to be sufficient:

                    // Check if function is called (needs -instcombine
pass).
                    Function* callee = call->getCalledFunction();
                    if (!callee)
                    {
                        // Could be also a function called inside a bitcast.
                        // So try to extract function from the underlying
constant expression.
                        // Required to workaround GCC/DragonEGG issue:
                        //
http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-July/051786.html
                        ConstantExpr* expr =
dyn_cast<ConstantExpr>(call->getCalledValue());
                        if (!expr) continue;
                        callee = dyn_cast<Function>(expr->getOperand(0));
                    }

*Hopefully* there will be no more gcc-generated special cases :)

Thanks,
- D.

2012/7/17 Duncan Sands <baldrick at free.fr>

> Hi Anton,
>
>
> On 17/07/12 15:35, Anton Korobeynikov wrote:
>
>> actually there is a different fix, which is to not pay any attention to
>>> GCC
>>> function types when generating calls (and function prototypes), and
>>> instead
>>> do everything by querying GCC's CUMULATIVE_ARGS.
>>>
>> I tried to do this during llvm-gcc times and it turned out that there
>> might be different calls with different signatures in single module
>> e.g. function with N arguments is called in some cases with N - 1
>> first args and since the remaining one is unused everything is fine.
>> So, basically the function *is* varargs but it's not possible to
>> deduce this from the args...
>>
>> I don't recall all the details now though...
>>
>
> yes, it is a can of worms, but I'm hopeful it can be made to work anyway.
>
> Ciao, Duncan.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120717/4cfa6257/attachment.html>


More information about the llvm-dev mailing list