Компилятор¶
Компилятор Ü это утилита командной строки, которая используется для компиляции/компоновки Ü кода.
Есть несколько версий компилятора Ü.
Компилятор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.