[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