|  | ========================================== | 
|  | How to build Windows Itanium applications. | 
|  | ========================================== | 
|  |  | 
|  | Introduction | 
|  | ============ | 
|  |  | 
|  | This document contains information describing how to create a Windows Itanium toolchain. | 
|  |  | 
|  | Windows Itanium allows you to deploy Itanium C++ ABI applications on top of the MS VS CRT. | 
|  | This environment can use the Windows SDK headers directly and does not required additional | 
|  | headers or additional runtime machinery (such as is used by mingw). | 
|  |  | 
|  | Windows Itanium Stack: | 
|  |  | 
|  | * Uses the Itanium C++ abi. | 
|  | * libc++. | 
|  | * libc++-abi. | 
|  | * libunwind. | 
|  | * The MS VS CRT. | 
|  | * Is compatible with MS Windows SDK include headers. | 
|  | * COFF/PE file format. | 
|  | * LLD | 
|  |  | 
|  | Note: compiler-rt is not used. This functionality is supplied by the MS VCRT. | 
|  |  | 
|  | Prerequisites | 
|  | ============= | 
|  |  | 
|  | * The MS SDK is installed as part of MS Visual Studio. | 
|  | * Clang with support for the windows-itanium triple. | 
|  | * COFF LLD with support for the -autoimport switch. | 
|  |  | 
|  | Known issues: | 
|  | ============= | 
|  |  | 
|  | SJLJ exceptions, "-fsjlj-exceptions", are the only currently supported model. | 
|  |  | 
|  | link.exe (the MS linker) is unsuitable as it doesn't support auto-importing which | 
|  | is currently required to link correctly. However, if that limitation is removed | 
|  | then there are no other known issues with using link.exe. | 
|  |  | 
|  | Currently, there is a lack of a usable Windows compiler driver for Windows Itanium. | 
|  | A reasonable work-around is to build clang with a windows-msvc default target and | 
|  | then override the triple with e.g. "-Xclang -triple -Xclang x86_64-unknown-windows-itanium". | 
|  | The linker can be specified with: "-fuse-ld=lld". | 
|  |  | 
|  | In the Itanium C++ ABI the first member of an object is a pointer to the vtable | 
|  | for its class. The vtable is often emitted into the object file with the key function | 
|  | and must be imported for classes marked dllimport. The pointers must be globally | 
|  | unique. Unfortunately, the COFF/PE file format does not provide a mechanism to | 
|  | store a runtime address from another DLL into this pointer (although runtime | 
|  | addresses are patched into the IAT). Therefore, the compiler must emit some code, | 
|  | that runs after IAT patching but before anything that might use the vtable pointers, | 
|  | and sets the vtable pointer to the address from the IAT. For the special case of | 
|  | the references to vtables for __cxxabiv1::__class_type_info from typeinto objects | 
|  | there is no declaration available to the compiler so this can't be done. To allow | 
|  | programs to link we currently rely on the -auto-import switch in LLD to auto-import | 
|  | references to __cxxabiv1::__class_type_info pointers (see: https://reviews.llvm.org/D43184 | 
|  | for a related discussion). This allows for linking; but, code that actually uses | 
|  | such fields will not work as they these will not be fixed up at runtime. See | 
|  | _pei386_runtime_relocator which handles the runtime component of the autoimporting | 
|  | scheme used for mingw and comments in https://reviews.llvm.org/D43184 and | 
|  | https://reviews.llvm.org/D89518 for more. | 
|  |  | 
|  | Assembling a Toolchain: | 
|  | ======================= | 
|  |  | 
|  | The procedure is: | 
|  |  | 
|  | # Build an LLVM toolchain with support for Windows Itanium. | 
|  | # Use the toolchain from step 1. to build libc++, libc++abi, and libunwind. | 
|  |  | 
|  | It is also possible to cross-compile from Linux. | 
|  |  | 
|  | To build the libraries in step 2, refer to the `libc++ documentation <https://libcxx.llvm.org/VendorDocumentation.html#the-default-build>`_. | 
|  |  | 
|  | The next section discuss the salient options and modifications required for building and installing the | 
|  | libraries. This assumes that we are building libunwind and libc++ as DLLs and statically linking libc++abi | 
|  | into libc++. Other build configurations are possible, but they are not discussed here. | 
|  |  | 
|  | Common CMake configuration options: | 
|  | ----------------------------------- | 
|  |  | 
|  | * ``-D_LIBCPP_ABI_FORCE_ITANIUM'`` | 
|  |  | 
|  | Tell the libc++ headers that the Itanium C++ ABI is being used. | 
|  |  | 
|  | * ``-DCMAKE_C_FLAGS="-lmsvcrt -llegacy_stdio_definitions -D_NO_CRT_STDIO_INLINE"`` | 
|  |  | 
|  | Supply CRT definitions including stdio definitions that have been removed from the MS VS CRT. | 
|  | We don't want the stdio functions declared inline as they will cause multiple definition | 
|  | errors when the same symbols are pulled in from legacy_stdio_definitions.ib. | 
|  |  | 
|  | * ``-DCMAKE_INSTALL_PREFIX=<install path>`` | 
|  |  | 
|  | Where to install the library and headers. | 
|  |  | 
|  | Building libunwind: | 
|  | ------------------- | 
|  |  | 
|  | * ``-DLIBUNWIND_ENABLE_SHARED=ON`` | 
|  | * ``-DLIBUNWIND_ENABLE_STATIC=OFF`` | 
|  |  | 
|  | libunwind can be built as a DLL. It is not dependent on other projects. | 
|  |  | 
|  | * ``-DLIBUNWIND_USE_COMPILER_RT=OFF`` | 
|  |  | 
|  | We use the MS runtime. | 
|  |  | 
|  | The CMake files will need to be edited to prevent them adding GNU specific libraries to the link line. | 
|  |  | 
|  | Building libc++abi: | 
|  | ------------------- | 
|  |  | 
|  | * ``-DLIBCXXABI_ENABLE_SHARED=OFF`` | 
|  | * ``-DLIBCXXABI_ENABLE_STATIC=ON`` | 
|  | * ``-DLIBCXX_ENABLE_SHARED=ON'`` | 
|  | * ``-DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=ON`` | 
|  |  | 
|  | To break the symbol dependency between libc++abi and libc++ we | 
|  | build libc++abi as a static library and then statically link it | 
|  | into the libc++ DLL. This necessitates setting the CMake file | 
|  | to ensure that the visibility macros (which expand to dllexport/import) | 
|  | are expanded as they will be needed when creating the final libc++ | 
|  | DLL later, see: https://reviews.llvm.org/D90021. | 
|  |  | 
|  | * ``-DLIBCXXABI_LIBCXX_INCLUDES=<path to libcxx>/include`` | 
|  |  | 
|  | Where to find the libc++ headers | 
|  |  | 
|  | Building libc++: | 
|  | ---------------- | 
|  |  | 
|  | * ``-DLIBCXX_ENABLE_SHARED=ON`` | 
|  | * ``-DLIBCXX_ENABLE_STATIC=OFF`` | 
|  |  | 
|  | We build libc++ as a DLL and statically link libc++abi into it. | 
|  |  | 
|  | * ``-DLIBCXX_INSTALL_HEADERS=ON`` | 
|  |  | 
|  | Install the headers. | 
|  |  | 
|  | * ``-DLIBCXX_USE_COMPILER_RT=OFF`` | 
|  |  | 
|  | We use the MS runtime. | 
|  |  | 
|  | * ``-DLIBCXX_HAS_WIN32_THREAD_API=ON`` | 
|  |  | 
|  | Windows Itanium does not offer a POSIX-like layer over WIN32. | 
|  |  | 
|  | * ``-DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=ON`` | 
|  | * ``-DLIBCXX_CXX_ABI=libcxxabi`` | 
|  | * ``-DLIBCXX_CXX_ABI_INCLUDE_PATHS=<libcxxabi src path>/include`` | 
|  | * ``-DLIBCXX_CXX_ABI_LIBRARY_PATH=<libcxxabi build path>/lib`` | 
|  |  | 
|  | Use the static libc++abi library built earlier. | 
|  |  | 
|  | * ``-DLIBCXX_NO_VCRUNTIME=ON`` | 
|  |  | 
|  | Remove any dependency on the VC runtime - we need libc++abi to supply the C++ runtime. | 
|  |  | 
|  | * ``-DCMAKE_C_FLAGS=<path to installed unwind.lib>`` | 
|  |  | 
|  | As we are statically linking against libcxxabi we need to link | 
|  | against the unwind import library to resolve unwind references | 
|  | from the libcxxabi objects. | 
|  |  | 
|  | * ``-DCMAKE_C_FLAGS+=' -UCLOCK_REALTIME'`` | 
|  |  | 
|  | Prevent the inclusion of sys/time that MS doesn't provide. | 
|  |  | 
|  | Notes: | 
|  | ------ | 
|  |  | 
|  | An example build recipe is available here: https://reviews.llvm.org/D88124 |