llvm自体には基本的にはWindows/aarch64 (COFF/aarch64) の初期サポートがすでに入っていたのだけど、Unwind InformationとかExceptiion Handlerのサポートは入ってなかった。そのため、C++のコードをコンパイルしようとしても以下のようなInternal Compiler Errorでclangとかがクラッシュする状況だった。
clang version 6.0.1-5 (tags/RELEASE_601/final)
Target: aarch64-pc-windows-msvc
Thread model: posix
InstalledDir: /usr/bin
...
fatal error: error in backend: Funclet EH is not implemented for this target clang: error: clang frontend command failed with exit code 70 (use -v to see invocation)
clang version 6.0.1-5 (tags/RELEASE_601/final)
Target: aarch64-pc-windows-msvc
Thread model: posix
InstalledDir: /usr/bin
clang: note: diagnostic msg: PLEASE submit a bug report to http://llvm.org/bugs/ and include the crash backtrace, preprocessed source, and associated run script.
clang: note: diagnostic msg:
********************
PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang: note: diagnostic msg: /tmp/test-1a3737.cpp
clang: note: diagnostic msg: /tmp/test-1a3737.sh
clang: note: diagnostic msg:
先月くらいからいろいろLLVMにコードが入り始めており (ex.
https://reviews.llvm.org/D49637)、基本的なUnwind Informationとかをllvmが生成できるようになってきている。そのため、rustにも
Windows/aarch64対応が入った。ただし、rustup等でインストール可能ではなく、自分でビルドする必要がある。
rustc.exe --target aarch64-pc-windows-msvc -O hello.rs
で生成されたバイナリをみると確かにaarch64のコードが生成されている
Microsoft (R) COFF/PE Dumper Version 14.15.26726.0
Copyright (C) Microsoft Corporation. All rights reserved.
PE signature found
File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
AA64 machine (ARM64)
8 number of sections
5B7D2340 time date stamp Wed Aug 22 19:38:00 2018
0 file pointer to symbol table
0 number of symbols
F0 size of optional header
22 characteristics
Executable
Application can handle large (>2GB) addresses
...
main:
str lr,[sp,#-0x10]!
mov x3,x1
adrp x8,0000000140001000
adrp x1,anon.4a7df3b253b8104c34e7c5ba0fd9252b.0.llvm.9631437952416841302
sxtw x2,w0
add x8,x8,#0x30
add x1,x1,#0
add x0,sp,#8
str x8,[sp,#8]
bl _ZN3std2rt19lang_start_internal17hac3e63ad7889c515E
ldr lr,[sp],#0x10
ret
なお、Microsoft Visual Studio 15.8に入っているaarch64アセンブラ (armasm64) はそれ単体だとUnwind Informationを生成できないので、Cプリプロセッサを使ってマクロを読み込んでUnwind Informationを生成しないといけないという面白状態 (それもドキュメントがないのだけど、dotNETとかChakraのコードを読めば理解できる) なのだが、Cプリプロセッサ通さなくてもいいようにしてほしいと願ってる。
0 件のコメント:
コメントを投稿