>Когда рассовываются данные[...]
Угх... Тогда я отпал, я всегда объезжал эту тему, даже между паскальскими dll своего движка подстилая солому cdecl.
Могу посоветовать наш форум http://freepascal.ru/forum/ - там есть не только тролли и неадекваты, но и реально знающие люди, изучившие всю эту кухню на самом глубоком уровне.
Cheb
Какую тему?
Тему соглашений? :)
И что ты предлагаешь туда написать? Какие таргеты Clang проставить? )
Cheb
> но мне казалось, что Extended - это
Remarks
The Extended data type is not supported on some platforms (such as Win64 and iOS), but the $EXTENDEDCOMPATIBILITY directive enables you to use the Extended type in your code on all platforms. This directive provides 10 bytes of storage for compatibility, but does not provide the higher floating-point precision that is available with the Extended data type on the Win32 platform.
>Тему соглашений?
Тему дефолтных соглашений Паскаля. Я их трактую, как чёрный ящик: знаю, что что-то передаётся через какие-то регистры, знаю, как оформить ассемблерный инклюд, чтобы в нём обозначить регистры, которые я запортил - и на этом мои знания заканчиваются. Я даже полностью Asm функций никогда не писал, где надо самому параметры из регистров брать, помня, где какой.
>И что ты предлагаешь туда написать?
Найти на приведённом мной форуме специалиста по глубокому бурению Паскаля. Они там есть. И уже с их помощью вести дальнейшие изыскания.
>On Intel 32-bit Windows systems
~8o
..вот оно, оказывается, как. Я видел только часть картины.
А всё потому, что документирован Фри Паскаль... Не будем о грустном.
Загуглилась наша тема на SO. Не верит ТС в помощь от местных троллей.
https://stackoverflow.com/questions/58544443/clang-compiler-x86-8… t-long-double
entryway
Это моя тема
DevilDevil
> Это моя тема
Ну я понял.
Cheb
Я сам глубокий бурильщик паскаля. Вопрос то не в паскале. А как настроить Clang )
DevilDevil
Настраивать Clang не нужно. Он уже настроен и готов к работе. Генерировать 10-байтные вещественные числа он не умеет и никогда не будет уметь. Идея любого компилируемого языка и заключается в том, чтобы максимально точно воспроизвести низкоуровневые инструкции конкретного процессора высокоуровневыми языковыми конструкциями максимально близко к природе процессора. Любые преобразования типов на столь низком уровне нарушают гармонию работы последнего.
По поводу таргета уточную следующее. Полный вид он имеет такой:
triple == arch(sub)-vendor-sys-abi arch = i386, i686, x86_64, arm, arm64, aarch64, mips, ... sub = v7a, v7m, ... (for arm only) vendor = pc, apple, nvidia, ibm sys = none, linux, windows, darwin, cuda, ... abi = eabi, gnu, gnueabihf, android, macho, elf, elf64 ...
Параметр vendor обычно никогда не указывается, потому как в настоящее время не имеет никакого смысла. При этом darwin и apple — разные параметры. darwin — это возможное значение для параметра sys (OS). Если в таргете вторым параметром указать apple, тогда параметр sys будет неявно выбран некоторым неизвестным образом, потому как окажется не заданным. Так делать не надо. Кроме того, было замечено, что неверное задание параметра abi clang игнорирует, ничего не сообщает о нём, но компиляцию проводит успешно:
clang -target armv7-android-g -c main.c clang -target armv7-android-gn -c main.c clang -target armv7-android-gnu -c main.c clang -target armv7-android-gnue -c main.c clang -target armv7-android-gnuea -c main.c
AArch64 — это официальное название 64-битного набора инструкции от ARM. Apple называет AArch64 ARM64. То есть это одно и тоже.
Нужно ли указывать архитектуру явно после таргета?
Явное указание опций для CPU повышает вероятность того, что если указано что-то неверное, конфликт будет обнаружен без успешной компиляции.
CgReligion
Ну так 10 байт это и есть низкоуровневые инструкции. На уровне команд он использует tbyte ptr, т.е. обращается к 10-байтовым операндам, даже sizeof() равен 12 или 16.
Но это сейчас не актуальный вопрос. Актуальных вопроса по прежнему два: 1. Какие опции компилятора выставить, чтобы он не задействовал MMX/SSE операций, но при этом позволял бы делать их мне, например, через интрисинки? Я, например, хочу иногда их задействовать. Но float и double должны передаваться через стек. Пентиум 2 вообще ничего не знал об SSE. А сейчас i386-windows передаёт их через SSE.
2. Как всё таки настроить таргеты? Для мобильных платформ нужен arm64 или aarch64? Или без разницы? Для iOS sys должен быть darwin? Чем eabi отличается от gnu, от android, от elf64? Какой выставлять? Нужно ли для ARM-процессоров выставлять режим thumb-2? Или он устанавливается по умолчанию?
DevilDevil
>> Для мобильных платформ нужен arm64 или aarch64?
arm64 и aarch64 — задают одну и туже архитектуру AArch64.
>> Нужно ли для ARM-процессоров выставлять режим thumb-2?
По идее это должно зависеть от процессора под который собирается приложение. Вроде бы все процессоры armv7* (32-битные) поддерживают режим кодирования инструкций thumb-2.
>> Чем eabi отличается от gnu, от android, от elf64?
Очевидно они отличаются объектными файлами которые создаются компилятором согласно каждому из ABI. Выбирать ABI нужно исходя из возможностей linker'a и целевой платформы. Линкер соединяет объектные файлы file1.obj + file2.obj + file3.obj + ... поставляемые компилятором в исполняемый файл (приложение). Он, по идее, должен идти в комплекте с toolchain'ом для кроссплатформенной сборки. То есть clang может легко скомпилировать код для любой поддерживаемой им платформы, но получить исполняемый файл не может. Это дело линкера и прочих приблуд из тулчейна идущих с ним в комплекте.
Вообще кроссплатформенная сборка IOS приложения даже родным cctools весьма сложная задача. Теоретически --target=arm-apple-darwin при компиляции для IOS должен работать. Но потом обязательно возникнут непреодолимые проблемы при попытке получения исполняемого файла. clang — это только компилятор.
CgReligion
В ARM, как минимум в 32 битах, команды могут быть в 3 режимах: обычный, thumb и thumb-2. Поэтому вопрос актуальный. Как ему указать thumb-2 ). И какие режимы актуальны для 64 битных мобильных платформ? )
По поводу ABI. Я правильно понимаю, что это некий стандарт соглашений о вызове? Окей. Тогда какое ABI родное для той или иной платформы? И чем конкретно они отличаются? Моя задача - выбрать конкретное ABI. Как это сделать?
Насчёт линкера. Вроде в поставку Clang входит какой-то линкер. А даже если и нет, то какими линкерами принято линковать под те или иные платформы? И какое для этого нужно ABI )
По поводу float/double ты не ответил :)
>> Я правильно понимаю, что это некий стандарт соглашений о вызове?
Да, ABI — это соглашение о вызове функций, передаче параметров в функцию и из неё. Существует ещё, так называемое, EABI (embedded application binary interface). Последнее отвечает за тоже самое, но к соглашению добавляются точное определение формата файлов (COFF, ELF, ELF64, PE, Mach-O) и задание размера всех базовых типов. Так, например, для объектных файлов построенных компиляторами от разных производителей, но с одинаковым ABI гарантируется их бинарная совместимость.
>> Команды могут быть в 3 режимах: обычный, thumb и thumb-2.
Формат команд thumb задаётся опцией компилятора -mthumb или через -target thumbv7-darwin-gnueabihf. Какое из множеств инструкций thumb или thumb 2 в конечном итоге будет использовано для генерации кода зависит от таргета и возможной опции -mcpu=arch(sub). Но с высокой долей вероятности это всегда будет thumb 2.
>> Какими линкерами принято линковать под те или иные платформы?
По идее собираться нужно родным для данной платформы линкером. Просто собрать под IOS можно только через официальные инструменты от Apple. Всё остальное ведёт в страшные дебри toolchain-а cctools и множеству разных открытий. Раньше clang использовал линкер ld от gcc. Сейчас у него есть собственный lld за фасадом которого скрывается целых три линкера для разных платформ (ld.lld (Unix), ld (macOS), lld-link (Windows)).
А далее уже можно изучать тему к которой мы потихоньку подбирались.
>> Помогите настроить билд-сервер для Windows + Clang
https://gamedev.ru/flame/forum/?id=243821
В общем насчёт SSE я очень сильно ошибся. Он как и положено, передаёт float и double через стек. Другое дело, что внутри он может или не может использовать SSE. Мне нужно, чтобы по умолчанию не использовался SSE, поэтому я выставляю флаг -mno-sse. Кто знает, смогу ли я задействовать SSE-интрисинки в случае чего? Или смогу включить SSE-оптимизацию для конкретных функций? (Если да - то как?)
Подбор таргета и опций сейчас выглядит так. Кто видит неточность или ошибку - просьба сообщить.
set flags=-c -O3 if "%platform%"=="win32" ( set target=i386-windows-gnu -mno-sse ) else if "%platform%"=="win64" ( set target=x86_64-windows-gnu ) else if "%platform%"=="linux32" ( set target=i386-linux-gnu -mno-sse ) else if "%platform%"=="linux64" ( set target=x86_64-linux-gnu ) else if "%platform%"=="mac32" ( set target=i386-darwin-gnu -mno-sse ) else if "%platform%"=="mac64" ( set target=x86_64-macos-gnu ) else if "%platform%"=="android32" ( set target=armv7-a-linux-android -mthumb ) else if "%platform%"=="android64" ( set target=aarch64-linux-android ) else if "%platform%"=="ios32" ( set target=armv7-a-darwin-gnu -mthumb ) else if "%platform%"=="ios64" ( set target=arm64-darwin-gnu ) else ( echo error: unknown platform "%platform%" goto :done ) ... call clang -target %target% %flags% "%sourcefile%" -o"%targetfile%"
Такс.
Возникла трабла со стрековыми фреймами под MacOS.
Какими атрибутами их отключить?
https://godbolt.org/z/MBY0TZ
void func() { } _func: ## @func push ebp mov ebp, esp pop ebp ret _func: ## @func push rbp mov rbp, rsp pop rbp ret
Тема в архиве.