[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
Mon Jul 16 17:37:51 PDT 2012
Dear LLVM,
This is probably a question for Fortran/DragonEGG experts:
Why Fortran's "call flush()" is converted to "call void bitcast (void
(...)* @_gfortran_flush_i4 to void (i8*)*)(i8* null) nounwind" ? Why it
needs bitcast?
I'm expecting something like "call void @_gfortran_flush_i4(i8* null)".
Otherwise, we will need to teach our call parsers to digg into bitcasts,
which is an undesired extra complexity.
Below is a test case (dragonegg/llvm as of r156703):
> cat flush.f90
program test
call flush()
end program test
> kernelgen-dragonegg flush.f90 -o- | opt -O3 -S -o -
; ModuleID = '<stdin>'
target datalayout =
"e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-unknown-linux-gnu"
@options.0.1537 = internal constant [8 x i32] [i32 68, i32 511, i32 0, i32
0, i32 0, i32 1, i32 0, i32 1], align 32
declare void @_gfortran_flush_i4(...)
define i32 @main(i32 %argc, i8** %argv) nounwind uwtable {
entry:
tail call void @_gfortran_set_args(i32 %argc, i8** %argv) nounwind
tail call void @_gfortran_set_options(i32 8, i32* getelementptr inbounds
([8 x i32]* @options.0.1537, i64 0, i64 0)) nounwind
tail call void bitcast (void (...)* @_gfortran_flush_i4 to void
(i8*)*)(i8* null) nounwind
ret i32 0
}
declare void @_gfortran_set_args(i32, i8**)
declare void @_gfortran_set_options(i32, i32*)
--
Thanks,
- Dima.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120717/6d98cd02/attachment.html>
More information about the llvm-dev
mailing list