Hello, I have been trying to compile a few small programs [ http://www.esm.psu.edu/~ajm138/fortranexamples.html] using llvm-gfortran. Since I run my own pass on the generated bitcode, I have had to split the compilation process into using llvm-gfortran, opt and then llvm-ld (for linking, as I do with C/C++ programs). For now, I'll drop the `opt' statement. Here's what I see while compiling: $ llvm-gfortran -c sample.f -emit-llvm -o sample.o $ lli sample.o 'main' function not found in module $ llvm-dis < sample.o | grep main | wc -l 0 $ llvm-dis < sample.o | grep MAIN | wc -l 1 $ llvm-ld -native sample.o -L ~/apps/llvm-gcc/lib64/ -lgfortran /usr/lib/../lib64/crt1.o: In function `_start': (.text+0x21): undefined reference to `main' collect2: ld returned 1 exit status llvm-ld: I am not very familiar with Fortran programs. I saw a few programs that had a "MAIN" subroutine defined, some others that did not. Am I missing something while compiling the code? Is there a different way to compile bitcode (from Fortran programs) to a native binary? Thanks, Ashay -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110831/13dc93ea/attachment.html>
Hi Ashay, Do you need specifically llvm-gfortran that is based on gcc 4.2? Since that, DragonEgg has been introduced - a powerful plugin to gcc that makes it possible to utilize regular gcc compilers as frontends to llvm: http://dragonegg.llvm.org/ It generates Fortran90 programs for me very well. - D. 2011/9/1 Ashay Rane <ashay.rane at tacc.utexas.edu>:> Hello, > I have been trying to compile a few small programs > [http://www.esm.psu.edu/~ajm138/fortranexamples.html] using llvm-gfortran. > Since I run my own pass on the generated bitcode, I have had to split the > compilation process into using llvm-gfortran, opt and then llvm-ld (for > linking, as I do with C/C++ programs). For now, I'll drop the `opt' > statement. Here's what I see while compiling: > $ llvm-gfortran -c sample.f -emit-llvm -o sample.o > $ lli sample.o > 'main' function not found in module > $ llvm-dis < sample.o | grep main | wc -l > 0 > $ llvm-dis < sample.o | grep MAIN | wc -l > 1 > $ llvm-ld -native sample.o -L ~/apps/llvm-gcc/lib64/ -lgfortran > /usr/lib/../lib64/crt1.o: In function `_start': > (.text+0x21): undefined reference to `main' > collect2: ld returned 1 exit status > llvm-ld: > I am not very familiar with Fortran programs. I saw a few programs that had > a "MAIN" subroutine defined, some others that did not. Am I missing > something while compiling the code? Is there a different way to compile > bitcode (from Fortran programs) to a native binary? > Thanks, > Ashay > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > >
I successfully compiled your first sample program: [marcusmae at zacate recursive]$ make dragonegg-gfortran -fplugin=/opt/kgen/lib64/dragonegg.so -fplugin-arg-dragonegg-emit-ir -emit-llvm -S recursive.f -o recursive.bc llc -march=x86-64 recursive.bc -o recursive.s gfortran recursive.s -o recursive [marcusmae at zacate recursive]$ ./recursive Enter number of repeats 10 x = 1 x = 2 x = 3 x = 4 x = 5 x = 6 x = 7 x = 8 x = 9 x = 10 Everything is in attached archive. - D. 2011/9/1 Dmitry N. Mikushin <maemarcus at gmail.com>:> Hi Ashay, > > Do you need specifically llvm-gfortran that is based on gcc 4.2? Since > that, DragonEgg has been introduced - a powerful plugin to gcc that > makes it possible to utilize regular gcc compilers as frontends to > llvm: http://dragonegg.llvm.org/ > > It generates Fortran90 programs for me very well. > > - D. > > 2011/9/1 Ashay Rane <ashay.rane at tacc.utexas.edu>: >> Hello, >> I have been trying to compile a few small programs >> [http://www.esm.psu.edu/~ajm138/fortranexamples.html] using llvm-gfortran. >> Since I run my own pass on the generated bitcode, I have had to split the >> compilation process into using llvm-gfortran, opt and then llvm-ld (for >> linking, as I do with C/C++ programs). For now, I'll drop the `opt' >> statement. Here's what I see while compiling: >> $ llvm-gfortran -c sample.f -emit-llvm -o sample.o >> $ lli sample.o >> 'main' function not found in module >> $ llvm-dis < sample.o | grep main | wc -l >> 0 >> $ llvm-dis < sample.o | grep MAIN | wc -l >> 1 >> $ llvm-ld -native sample.o -L ~/apps/llvm-gcc/lib64/ -lgfortran >> /usr/lib/../lib64/crt1.o: In function `_start': >> (.text+0x21): undefined reference to `main' >> collect2: ld returned 1 exit status >> llvm-ld: >> I am not very familiar with Fortran programs. I saw a few programs that had >> a "MAIN" subroutine defined, some others that did not. Am I missing >> something while compiling the code? Is there a different way to compile >> bitcode (from Fortran programs) to a native binary? >> Thanks, >> Ashay >> >> _______________________________________________ >> LLVM Developers mailing list >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >> >> >-------------- next part -------------- A non-text attachment was scrubbed... Name: recursive.tar.gz Type: application/x-gzip Size: 6315 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110901/1269a22f/attachment-0001.bin>
Hello> I am not very familiar with Fortran programs. I saw a few programs that had > a "MAIN" subroutine defined, some others that did not. Am I missing > something while compiling the code? Is there a different way to compile > bitcode (from Fortran programs) to a native binary?For Fortran MAIN is indeed something similar to C main, but not exactly the same. You have to link the runtime library (libgfortran.a) in order to get "proper" main, mak sure all stuff is initialized properly, etc. -- With best regards, Anton Korobeynikov Faculty of Mathematics and Mechanics, Saint Petersburg State University
Hello,
Sorry for the late reply. Using dragonegg worked well, thanks all!
Just as a note... I had to use llvm-ld during the link step because gfortran
could not link bitcode. Here's an example of the error shown when using
gfortran instead of llvm-ld:
$ ${GCC_4_5_0}/bin/gfortran hw.f -c -fplugin=${DRAGONEGG_PLUGIN}/dragonegg.so
-o hw.o -flto -emit-llvm -S
$ ${LLVM_2_9}/bin/opt -mem2reg hw.o -o hw.o
$ ${GCC_4_5_0}/bin/gfortran
-fplugin=${DRAGONEGG_PLUGIN}/dragonegg.so ${GCC_4_5_0}/lib64/libgfortran.a
hw.o -o hw
hw.o: file not recognized: File format not recognized
collect2: ld returned 1 exit status
$ file hw.o
hw.o: data
Instead, using llvm-ld:
$ ${LLVM_2_9}/bin/llvm-ld -native hw.o -o hw
${GCC_4_5_0}/lib64/libgfortran.a -lm
llvm-gcc had the gold plugin. I wonder if there is any equivalent of that
for dragonegg to be able to compile bitcode and native object code in a
transparent manner.
Thanks again!
Ashay
On Wed, Aug 31, 2011 at 4:29 PM, Anton Korobeynikov <anton at
korobeynikov.info> wrote:
> Hello
>
> > I am not very familiar with Fortran programs. I saw a few programs
that
> had
> > a "MAIN" subroutine defined, some others that did not. Am I
missing
> > something while compiling the code? Is there a different way to
compile
> > bitcode (from Fortran programs) to a native binary?
> For Fortran MAIN is indeed something similar to C main, but not
> exactly the same.
> You have to link the runtime library (libgfortran.a) in order to get
> "proper" main, mak sure all stuff is initialized properly, etc.
>
> --
> With best regards, Anton Korobeynikov
> Faculty of Mathematics and Mechanics, Saint Petersburg State University
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20110912/1395d7ce/attachment.html>