Компилятор¶
Компилятор Ü это утилита командной строки, которая используется для компиляции/компоновки Ü кода.
Есть несколько версий компилятора Ü.
Компилятор0 написан на C++. Компилятор1 написан на Ü и скомпилирован Компилятором0. Компилятор2 это код Компилятора1, скомпилированный Компилятором1. Разницы между этими версиями почти что нету, они должны работать одинаково. Если это не так, это ошибка в одной из версий компилятора.
Использование¶
В простейшем случае компилятору надо передать один или несколько входных файлов и указать один выходной файл, как в примере ниже:
u.._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, используемой в компиляторе Ü.
Запустите u.._compiler --help чтобы узнать их.
Доступные опции могут зависеть от конфигурации сборки компилятора и версии библиотеки LLVM.