2017-09-28 1 views
2

ghc 프론트 엔드 및 llvm 백엔드를 사용하여 haskell을 컴파일하려고합니다.llvm 백엔드가있는 haskell .ll 파일 컴파일 중 오류가 발생했습니다.

내 하스켈 hello.hs 파일에 다음 코드를했다 : 나는 다음 명령을 사용하여 GHC와 hello.hs를 컴파일

main = putStrLn "Hello World!" 

을 기타와 함께 hello.ll 파일을 생성

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

파일. 그런 다음이 .ll 파일을 .bc 파일로 컴파일하려고합니다.

llvm-as hello.ll -o hello.bc 

한 후 실행 파일을 생성하는 실행 파일

llc hello.bc -o hello 

이 .bc 파일. 문제는 내가이 파일을 실행할 때 다음과 같은 오류

./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)' 

을 발견하고 내가 .bc 파일에 LLI를 사용할 때 내가 고정 표시기에 GHC과 LLVM을 실행하고

main function not found in module error 

를 얻을 수있다. 나는 llvm의 버전 3.4와 ghc의 버전 7.6.3을 가지고있다.

Mac에서이 작업을 수행하려고하면 "비슷한"오류가 발생합니다. 왜이 오류가 발생하는지 알 수 없습니다.

답변

2

llc 프로그램이 실행 파일을 만들지 않습니다. LLVM 바이트 코드를 원시 어셈블리 소스 (기본적으로) 또는 객체 파일로 컴파일합니다. 당신이 실행하는 경우 :

llc hello.bc -o hello 

을 다음 텍스트 편집기 결과 "안녕하세요"파일을 검사, 당신은 인텔 어셈블리 파일의 것을 볼 수 있습니다, 그리고 당신이 노력하고 있기 때문에 당신이 얻고있는 구문 오류가 있습니다 쉘 스크립트로 실행합니다.

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

를 한 후 실행으로 연결하려고 :

대신 오브젝트 파일에 직접 LLVM 바이트 코드를 컴파일 할 수 있습니다이 연결 오류의 무리를 생성합니다

ld hello.o -o hello 

Haskell 런타임과 링크되어야하기 때문입니다. 이 명령은 실제로 하스켈 소스를 컴파일하지 않는

ghc hello.o -o hello 

참고 : 그것은 하스켈 런타임에 연결하는 가장 좋은 방법은 연결을 할 ghc 자체를 사용하는 것으로 나타났다. 그것은 단지 연결을합니다. 당신이보고 싶은 경우 연결 사용, 그것은 실행 명령 :

ghc -v hello.o -o hello 

하고 ghc에 연결을두고하는 것이 좋습니다 당신은 왜 이해하게 될 것입니다!

마지막으로 "hello"를 실행할 수 있어야합니다.전체 명령 집합은 다음과 같습니다.

$ 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! 
$ 
+0

hello 파일을 실행할 때 (내가 여러 번 시도한 경우) 세그멘테이션 오류가 발생합니다. 어떤 버전의 ghc와 llvm을 사용하고 있습니까? –

+0

또한 "lli hello.bc"를 실행하려고하면 "main '함수가 모듈에 없습니다."라는 오류가 발생합니다. .bc 파일에 뭔가 빠졌습니까? –

관련 문제