Компилятор

Компилятор Ü это утилита командной строки, которая используется для компиляции/компоновки Ü кода.

Есть несколько версий компилятора Ü.

Компилятор0 написан на C++. Компилятор1 написан на Ü и скомпилирован Компилятором0. Компилятор2 это код Компилятора1, скомпилированный Компилятором1. Разницы между этими версиями почти что нету, они должны работать одинаково. Если это не так, это ошибка в одной из версий компилятора.

Использование

В простейшем случае компилятору надо передать один или несколько входных файлов и указать один выходной файл, как в примере ниже:

Compiler source.u -o source.o

По умолчанию тип входного файла это исходник Ü, тип выходного файла - объектный файл.

Возможности

Компилятор Ü может конечно же компилировать файлы исходного кода Ü. Но этим его возможности не ограничиваются.

Возможно скомпилировать множество исходных файлов в файлы биткода LLVM и затем скомбинировать их и запустить оптимизацию времени компоновки (через отдельный запуск компилятора).

Также компилятор Ü может порождать исполняемые файлы и разделяемые библиотеки. Но это работает только если он был скомпилирован с включением LLD (что обычно так).

Интерфейс командной строки

Входные файлы перечисляются без всяких опций - напрямую. Ожидается как минимум один входной файл.

Тип входного файла указывается через опцию --input-filetype. Поддерживаются типы source (значение по умолчанию) - для исходных файлов Ü, bc - для файлов биткода LLVM, ll - для файлов ассемблера LLVM.

Выходной файл указывается при помощи опции -o. Тип выходного файла указывается через опцию --filetype. Поддерживаются типы obj (значение по умолчанию) - для объектных файлов, bc - для файлов биткода LLVM, ll - для файлов ассемблера LLVM, asm - для файлов ассемблера, exe - для исполняемых файлов, dll - для разделяемых библиотек, null - для случая, когда никакой файл не должен быть создан. В последнем случае не нужно указывать имя выходного файла.

Уровень оптимизации указывается при помощи опции -O. Поддерживаются уровни O0, O1, O2, Os, Oz. Они похожи на аналогичные опции компиляторов gcc или clang.

Опция --lto-mode влияет на оптимизацию времени компоновки. Значение none не делает ничего для оптимизации времени компоновки. Значение prelink предназначено для сборки отдельных исходных файлов Ü в биткод LLVM. Значение link предназначено для запуска оптимизации времени компоновки для множества входных файлов биткода LLVM.

Опция --internalize делает публичные символы (функции, глобальные переменные) приватными, что даёт возможность их встраивания или удаления при оптимизации. Она полезна вместе с --lto-mode=link. Список символов, которые не должны быть сделаны приватными, может быть указан через опцию --internalize-preserve. Опция --internalize-hidden работает схожим образом, но делает приватными только скрытые символы. Опция --internalize-symbols-from делает приватными все символы из указанного входного файла.

Опция -g включает создание отладочной информации. Рекомендуется использовать её с -O0, чтобы порождённый код можно было нормально отлаживать - без оптимизаций, мешающих отладке.

Опции --target-arch, --target-vendor, --target-os, --target-environment указывают части целевой системы/архитектуры, для которой компилируется код. Значение по умолчанию обычно равно хост-системе.

Опции --override-data-layout и --override-target-triple предназначены для переопределения настроек расположения памяти или целевой системы/архитектуры для входных файлов LLVM биткода или ассемблера. Их использование не рекомендуется.

Опция --mangling-scheme предоставляет контроль над схемой кодирования имён функций/глобальных переменных. Умолчательное значение это auto - выбрать схему кодирование на базе целевой системы/архитектуры. Значение itanium-abi выбирает схему Itanium ABI, используемую в большинстве Unix-систем. Значение msvc выбирает MSVC схему (с подвариантом, определяемым целевой архитектурой). Также возможны значения msvc32 и msvc64. В общем не рекомендуется изменять умолчательную схему кодирования имён, если только нету необходимости к этому ради взаимодействия с внешним кодом.

Опция -MF указывает путь к выходному файлу зависимостей. Такой файл содержит список зависимых файлов, которые импортируются или встраиваются. Он использует формат, совместимый с ninja.

Опция --include-dir добавляет директорию для поиска файлов для импорта/встраивания. Возможно указать множество директорий. Дополнительно может быть указан префикс для указанной директории - после ::.

Опция --source-dir добавляет директорию, файлы из которой считаются исходниками или приватно-импортируемыми заголовочными файлами. Может быть указано более одной директории. Эта опция влияет на видимость функций с прототипами в файлах из этих директорий.

Если указана опция --prevent-imports-outside-given-directories, будет порождена ошибка, если импортируется/встраивается файл, находящийся вне указанных директорий включения и директорий исходников.

Опция --allow-unused-names разрешает неиспользуемые имена - переменные, функции, поля классов, и т. д. Если эта опция не указана, порождается ошибка если какое-то имя не используется.

Опция --halt-mode управляет поведением оператора halt. Значение trap (умолчательное) обозначает использование инструкции llvm.trap для halt. Значение abort обозначает вызов функции abort из C. Значение configurable_handler даёт возможность во времени выполнения выставить функцию-обработчик halt. Значение unreachable заставляет считать оператор halt недостижимым, что ведёт к неопределённому поведению, если он таки достижим.

Опция --no-system-alloc отключает использование системных функций выделения памяти (malloc/HeapAlloc) в скомпилированном коде.

Опция --disable-async-calls-inlining отключает безусловное встраивание вызовов async функций. По умолчанию вызовы async функций встраиваются, что порождает более быстрый, но (возможно) более объёмный код.

Опция --verify-module включает проверки корректности промежуточных LLVM модулей, порождённых в ходе компиляции/компоновки. В общем она нужна только для обнаружения возможных ошибок компилятора.

Опции --print-llvm-asm и --print-llvm-asm-initial позволяют вывести сгенерированный LLVM ассемблер до и после оптимизаций/трансформаций.

Опция --print-prelude-code позволяет вывести содержимое сгенерированного компилятором псевдофайла прелюдии. Это может быть полезно для отладки.

Опция -Wl позволяет указать аргументы для внутреннего компоновщика (LLD). Она используется при порождении исполняемых файлов и разделяемых библиотек.

Опция --sysroot используется для указания корневой системной директории для внутреннего компоновщика, что может быть необходимо для кросс-компиляции.

Дополнительные опции командной строки

Доступны также иные опции, объявляемые библиотекой LLVM, используемой в компиляторе Ü. Запустите Compiler --help чтобы узнать их. Доступные опции могут зависеть от конфигурации сборки компилятора и версии библиотеки LLVM.