Skip to content

OpeLa Compiler MultiArch

Kota UCHIDA edited this page Sep 2, 2021 · 12 revisions

OpeLa トップページ

OpeLa コンパイラ(opelac)は当初 x86-64 専用のコンパイラとして開発されましたが、2020/12/25 現在は AArch64 にも対応しています。 このページは OpeLa コンパイラのマルチアーキテクチャ対応状況を説明します。

コンパイラオプション

opelac は -target-arch <arch> オプションで出力アーキテクチャを変更できます。 現在対応しているのは x86_64(デフォルト)と aarch64 です。

AArch64 対応について

AArch64 は Arm プロセッサの動作モードの名前です。64 ビットレジスタが使えるモードです。

opelac が対応しているのは M1 Mac です。 AArch64 が使えるコンピュータは他にも Raspberry Pi 等がありますが、opelac が出力するアセンブラは今のところ Mach-O 形式専用なので、M1 Mac でしか動作しません。

マルチアーキテクチャ対応に関する雑記

複数のアーキテクチャに対応する際、考慮すべきポイントは次の通りです。

  • 命令セット:x86-64 で実行できる命令セットか、AArch64 で実行できる命令セットか
  • 実行可能ファイル形式:ELF か Mach-O か
  • OS システムコール:どのように OS のシステムコールを呼ぶか

Mach-O の資料

可変長引数

int printf(const char* format, ...);... は引数省略の記号で、可変長引数を表すのに使われる。 ... には 0 個以上の引数を渡せる。

OpeLa で上記の関数の型は func (format *byte, ...) int のように書く。

SystemV AMD64 ABI では可変長引数かどうかに関わらず、先頭から 6 個まではレジスタ渡し。

AArch64 でよく使われる EABI でも同様らしいが、M1 Mac が採用する ABI はそれとは異なっており、可変長引数は全てスタックで渡す。 printf の例では format が x0 レジスタで渡され、それ以降の引数はスタックで渡す事になる。

Clone this wiki locally