简体   繁体   中英

Error in Compiling haskell .ll file with llvm backend

I want to compile haskell using ghc front-end and llvm back-end.

I have following code in my haskell hello.hs file:

main = putStrLn "Hello World!"

I compile hello.hs with ghc using following command

ghc -fllvm -keep-llvm-files -force-recomp -hello.hs

which generate a hello.ll file along with other files. I then try to compile this .ll file into a .bc file.

llvm-as hello.ll -o hello.bc

and then this .bc file to executable file

llc hello.bc -o hello

which generate an executable file. The problem is when I run this file I found the following error

./hello: line 1: .file: command not found
./hello: line 2: .section: command not found
./hello: line 3: .globl: command not found
./hello: line 4: .align: command not found
./hello: line 5: .type: command not found
./hello: line 6: Main_main2_info:: command not found
./hello: line 8: subq: command not found
./hello: line 9: syntax error near unexpected token `('
./hello: line 9: `                 movq                                                                      
%r13, 112(%rsp)'

and when I use lli on .bc file I get

main function not found in module error

I am running ghc and llvm on docker. I have version 3.4 of llvm and version 7.6.3 of ghc.

A "similar" error occur when I try to to do this on mac. I don't know why I am getting this error.

The llc program doesn't create executables. It compiles LLVM bytecode to native assembly source (by default) or an object file. If you run:

llc hello.bc -o hello

and then inspect the resulting "hello" file with a text editor, you'll see that it's an Intel assembly file, and the syntax errors you're getting are because you're trying to run it as a shell script.

Instead, you can compile the LLVM bytecode directly to an object file:

llc hello.bc -filetype=obj -o hello.o

and then try to link it into an executable:

ld hello.o -o hello

This will generate a bunch of linkage errors because it needs to be linked with the Haskell runtime. It turns out that the best way to link in the Haskell runtime is to use ghc itself to do the linking:

ghc hello.o -o hello

Note that this command does not actually recompile the Haskell source. It just does the linking. If you want to see the linkage commands it runs, use:

ghc -v hello.o -o hello

and you'll understand why it's best to leave the linking to ghc !!

Finally, after all this, you should be able to run "hello". The full set of commands is:

$ ghc -fllvm -keep-llvm-files -fforce-recomp hello.hs                                                           
[1 of 1] Compiling Main             ( hello.hs, hello.o )                                                       
Linking hello ...
$ rm hello                                                                                               
$ llvm-as hello.ll -o hello.bc                                                                                  
$ llc hello.bc -filetype=obj -o hello.o                                                                         
$ ghc hello.o -o hello                                                                                          
$ ./hello                                                                                                       
Hello, world!  
$

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM