📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の5版が非表示)
200行目: 200行目:
|-
|-
! style="background-color:#fff2cc;"| 入力
! style="background-color:#fff2cc;"| 入力
| colspan="2" style="background-color:#fff2cc;"| ソースコード (.c, .cpp)
| colspan="2" style="background-color:#fff2cc; text-align:center;"| ソースコード (.c, .cpp)
|-
|-
! style="background-color:#e3f2fd;"| ① 解析
! style="background-color:#e3f2fd;"| ① 解析
223行目: 223行目:
|-
|-
! style="background-color:#f0f0f0;"| 中間生成物
! style="background-color:#f0f0f0;"| 中間生成物
| colspan="2" style="background-color:#f0f0f0;"| オブジェクトファイル (.o)
| colspan="2" style="background-color:#f0f0f0; text-align:center;"| オブジェクトファイル (.o)
|-
|-
! style="background-color:#e8f5e9;"| ⑥ リンク
! style="background-color:#e8f5e9;"| ⑥ リンク
230行目: 230行目:
|-
|-
! style="background-color:#c8e6c9;"| 出力
! style="background-color:#c8e6c9;"| 出力
| colspan="2" style="background-color:#c8e6c9;"| 実行ファイル (a.out, .exe等)
| colspan="2" style="background-color:#c8e6c9; text-align:center;"| 実行ファイル (例 : a.out, a.exe)
|}
|}
</center>
</center>
361行目: 361行目:
  # CMakeの設定
  # CMakeの設定
  cmake -G Ninja \
  cmake -G Ninja \
       -DCMAKE_BUILD_TYPE=Release \
       -DCMAKE_BUILD_TYPE=Release                           \
       -DCMAKE_INSTALL_PREFIX=<LLVMツールチェーンのインストールディレクトリ> \
       -DCMAKE_INSTALL_PREFIX=<LLVMツールチェーンのインストールディレクトリ> \
       -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld" \
       -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld" \
       -DLLVM_TARGETS_TO_BUILD="X86;AArch64" \
       -DLLVM_TARGETS_TO_BUILD="X86;AArch64"               \
       -DLLVM_DEFAULT_TARGET_TRIPLE=aarch64-linux-gnu \
       -DLLVM_DEFAULT_TARGET_TRIPLE=aarch64-linux-gnu       \
       -DLLVM_ENABLE_LLD=ON \
       -DLLVM_ENABLE_LLD=ON                                 \
       -DLLVM_ENABLE_LIBCXX=OFF \
       -DLLVM_ENABLE_LIBCXX=OFF                             \
       -DLLVM_ENABLE_ASSERTIONS=OFF \
       -DLLVM_ENABLE_ASSERTIONS=OFF                         \
       -DLLVM_OPTIMIZED_TABLEGEN=ON \
       -DLLVM_OPTIMIZED_TABLEGEN=ON                         \
      -DLLVM_USE_LINKER=lld \
       -DLLVM_PARALLEL_LINK_JOBS=2                         \
       -DLLVM_PARALLEL_LINK_JOBS=2 \
       ../llvm
       ../llvm
   
   
407行目: 406行目:
<br>
<br>


==== iOS ====
==== ARM EABIHF ====
以下の例では、iOSをターゲットとしたLLVMをクロスビルドおよびインストールしている。<br>
===== ABI / HF =====
ABIとは、コンパイルされたバイナリコード同士がどのように通信し合うかを定めるプロトコルである。<br>
ABIは関数を呼び出す際にどのレジスタを使うか、引数をどの順序でスタックに積むか、戻り値をどこに格納するか、構造体のメモリ配置はどうするか、といった細かい取り決めを規定している。<br>
<br>
異なるABIでコンパイルされたライブラリとプログラムは、例え同じCPUアーキテクチャであっても正しく連携できない。<br>
<br>
Hard Float ABIでは、浮動小数点演算の結果を浮動小数点専用のレジスタ (VFPレジスタ) を使用して関数間で受け渡す。<br>
<br>
EABIHFは32ビットARM用のABIである。<br>
* Raspberry Pi OS 32ビットでは、ARMv8でもEABIHF (hard-float) が使用可能。
* Raspberry Pi OS 64ビットでは、AAPCS64 (ARM Architecture Procedure Call Standard 64-bit) という別のABIを使用。
<br>
===== VFPレジスタ =====
Raspberry Pi 4以降でもVFPレジスタは存在するが、実装が進化している。<br>
* ARMv7以前 (Raspberry Pi 2 / 3等)
** VFP (Vector Floating Point) が独立したコプロセッサ
** VFPv3 / VFPv4として実装
** NEONと一部統合
*: <br>
* ARMv8-A (Raspberry Pi 4以降)
** 浮動小数点とSIMDが完全に統合
** 32個の128ビットレジスタ (V0-V31) として実装
** これらは以下のようにアクセス可能である。
*** 64ビット浮動小数点 : D0-D31
*** 32ビット浮動小数点 : S0-S31
*** 128ビットSIMD:V0-V31 (NEON)
<br>
32 / 64ビットで、利用できる機能やABIが異なるが、いずれにおいても浮動小数点演算用のレジスタは存在し、ハードウェアアクセラレーションが利用できる。<br>
<br>
===== ビルド / インストール =====
  mkdir build && cd build
  mkdir build && cd build
   
   
  cmake -G Ninja "Unix Makefiles"                                                          \
  cmake -G Ninja \
                -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=<LLVMのインストールディレクトリ> \
      -DCMAKE_BUILD_TYPE=Release                           \
                -DCMAKE_OSX_ARCHITECTURES="armv7;armv7s;arm64"                             \
      -DCMAKE_INSTALL_PREFIX=<LLVMツールチェーンのインストールディレクトリ> \
                -DCMAKE_TOOLCHAIN_FILE=<PATH_TO_LLVM>/cmake/platforms/iOS.cmake            \
      -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld"  \
                -DLLVM_BUILD_RUNTIME=Off -DLLVM_INCLUDE_TESTS=Off                         \
      -DLLVM_TARGETS_TO_BUILD="X86;ARM;AArch64"             \
                -DLLVM_INCLUDE_EXAMPLES=Off -DLLVM_ENABLE_BACKTRACES=Off                  \
      -DLLVM_DEFAULT_TARGET_TRIPLE=arm-linux-gnueabihf      \
                ../llvm
      -DLLVM_ENABLE_LLD=ON                                  \
      -DLLVM_ENABLE_LIBCXX=OFF                              \
      -DLLVM_ENABLE_ASSERTIONS=OFF                         \
      -DLLVM_OPTIMIZED_TABLEGEN=ON                          \
      -DLLVM_PARALLEL_LINK_JOBS=2                          \
      ../llvm
   
   
  ninja -j $(nproc)
  ninja -j $(nproc)
  ninja install
  ninja install
<br>
Hard Float ABI用のCMakeツールチェーンファイルの例を以下に示す。<br>
<syntaxhighlight lang="cmake">
# ターゲットシステムの設定
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
# システムルートのパス (Hard Float ABI用のシステムルート)
set(CMAKE_SYSROOT <Hard Float ABI用のシステムルートのフルパス>)
# LLVMツールチェーンのパス
set(LLVM_PATH <LLVMツールチェーンのインストールディレクトリ>)
# コンパイラの指定
set(CMAKE_C_COMPILER ${LLVM_PATH}/bin/clang)
set(CMAKE_CXX_COMPILER ${LLVM_PATH}/bin/clang++)
# ターゲットトリプルの設定
# Hard Float ABIを使用するため、末尾に"hf"を追加
set(CMAKE_C_COMPILER_TARGET arm-linux-gnueabihf)
set(CMAKE_CXX_COMPILER_TARGET arm-linux-gnueabihf)
# 検索パスの設定
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
# コンパイラフラグの設定
# Hard Float ABIを明示的に指定し、適切なFPUも指定する
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv8-a -mfpu=neon-vfpv4 -mfloat-abi=hard")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8-a -mfpu=neon-vfpv4 -mfloat-abi=hard")
# リンカーフラグ
# ライブラリパスをHard Float ABI用のディレクトリに変更
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath-link,${CMAKE_SYSROOT}/lib/arm-linux-gnueabihf")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath-link,${CMAKE_SYSROOT}/usr/lib/arm-linux-gnueabihf")
</syntaxhighlight>
<br>
==== ARM EABI ====
Soft Float ABIでは、浮動小数点の値も汎用レジスタを使って受け渡す。<br>
<br>
Soft Float ABIが必要になる場面は、古いARMプロセッサやFPU (浮動小数点演算ユニット) を持たない組み込みシステムである。<br>
ARMv5 や ARMv6の一部のバリアント、コスト重視の産業用制御システムなどがこのカテゴリに入る。<br>
これらのシステムでは、浮動小数点演算は全てソフトウェアでエミュレートされるため、VFPレジスタを使った受け渡しができない。<br>
<br>
ただし、FPUを持つプロセッサであっても、Soft Float ABIでコンパイルすることは可能である。<br>
この場合、FPUは利用されず全ての浮動小数点演算がソフトウェアで処理される。<br>
これは、既存のSoft Float ABI用のライブラリとの互換性を保ちたい場合等に用いられる。<br>
<br>
mkdir build && cd build
cmake -G Ninja \
      -DCMAKE_BUILD_TYPE=Release                          \
      -DCMAKE_INSTALL_PREFIX=<LLVMツールチェーンのインストールディレクトリ> \
      -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld" \
      -DLLVM_TARGETS_TO_BUILD="X86;ARM;AArch64"            \
      -DLLVM_DEFAULT_TARGET_TRIPLE=arm-linux-gnueabi      \
      -DLLVM_ENABLE_LLD=ON                                \
      -DLLVM_ENABLE_LIBCXX=OFF                            \
      -DLLVM_ENABLE_ASSERTIONS=OFF                        \
      -DLLVM_OPTIMIZED_TABLEGEN=ON                        \
      -DLLVM_PARALLEL_LINK_JOBS=2                          \
      ../llvm
ninja -j $(nproc)
ninja install
<br>
Soft Float ABI用のCMakeツールチェーンファイルの例を以下に示す。<br>
<syntaxhighlight lang="cmake">
# ターゲットシステムの設定
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
# システムルートのパス (Soft Float ABI用のシステムルート)
set(CMAKE_SYSROOT <Soft Float ABI用のシステムルートのフルパス>)
# LLVMツールチェーンのパス
set(LLVM_PATH <LLVMツールチェーンのインストールディレクトリ>)
# コンパイラの指定
set(CMAKE_C_COMPILER ${LLVM_PATH}/bin/clang)
set(CMAKE_CXX_COMPILER ${LLVM_PATH}/bin/clang++)
# ターゲットトリプルの設定
set(CMAKE_C_COMPILER_TARGET arm-linux-gnueabi)
set(CMAKE_CXX_COMPILER_TARGET arm-linux-gnueabi)
# 検索パスの設定
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
# コンパイラフラグの設定
# Soft Float ABIを明示的に指定する
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv7-a -mfloat-abi=softfp")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv7-a -mfloat-abi=softfp")
# リンカーフラグ
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath-link,${CMAKE_SYSROOT}/lib/arm-linux-gnueabi")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath-link,${CMAKE_SYSROOT}/usr/lib/arm-linux-gnueabi")
</syntaxhighlight>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:RHEL]][[カテゴリ:SUSE]]
[[カテゴリ:RHEL]][[カテゴリ:SUSE]]