Войти
ПрограммированиеФорумОбщее

Помогите настроить таргеты компиляции Clang (6 стр)

Страницы: 13 4 5 6 7 8 Следующая »
#75
15:09, 1 ноя. 2019

CgReligion

Не
Внешние функции в случае soft, а для softfp их нет

Насчёт пробы платформы... Интелевская архитектура уже побеждена. x86 и x64 (для Windows, Mac и Linux) - работают как часы. Сейчас на очереди ARM32 )


#76
12:26, 2 ноя. 2019

Так
Много интересных новостей

Во-первых, Delphi таки поддерживает нормальное соглашение, когда аргументы передаются с плавающей точкой через регистры.
Во-вторых, линкуется таргет armv7-none-linux-androideabi (armv7m-none-linux-androideabi не линкуется).

Но по дефолту (или если выставить -mfloat-abi=softfp) числа с плавающей точкой передаются неправильно. А если выставить hard - Delphi не линкует.
Возникает вопрос. Что с этим можно сделать?
https://godbolt.org/z/KZkkO6

Нужно вариант посередине превратить в тот, что справа :)

#77
13:07, 2 ноя. 2019

Попробовал локально менять атрибуты
Не помогло:
https://godbolt.org/z/iIIaNw

#78
(Правка: 14:51) 14:18, 2 ноя. 2019

DevilDevil

Аргументы с плавающей точкой, что в варианте с -mfloat-abi=softfp, что в варианте -mfloat-abi=hard в обоих случаях передаются через регистры. Только в первом случае они передаются через целочисленные регистры, как того требует ABI. Соответственно, во втором случае параметры передаются в функцию сразу через вещественные регистры без дополнительного копирования. Оптимизация при этом может делать такой код, что по ассемблерному листингу первое от второго практически не отличается.

> Не. Внешние функции в случае soft, а для softfp их нет.
Да, оно так. Особенно, если задано -mfpu=vfpv3 и прочие варианты или -mfpu=neon. Для младших CPU это может быть иначе. Особенно для архитектур с литерой m.

Возможно, имеет смысл явно указывать флаг архитектуры -march=armv7-a или -mthumb. Тогда значения таргета практически не учитываются, а ABI принимается равным armeabi-v7a (тоже самое что androideabi). Можно попробовать какие-нибудь вариации:

-target armv7a-none-linux-androideabi -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3 -O3
-target armv7a-none-linux-androideabi -mthumb -mfloat-abi=softfp -mfpu=vfpv3 -O3
-target armv7a-none-linux-androideabi -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3 -mthumb -O3
#79
15:08, 2 ноя. 2019

CgReligion

Так в том и дело
softfp жуётся, но нужен "hard", т.е. когда числа с плавающей точкой передаются через соответствующие регистры, а не через регистры общего назначения.

Твои варианты я попробовал, но к нужному результату они не приводят.

Я пока решил собирать с hard-ом и патчить *.o, якобы он был собран без него. Решение так себе. Но лучше у меня пока нет :)

#80
(Правка: 16:44) 16:24, 2 ноя. 2019

DevilDevil

Вообще есть свидетельства очевидца, что следующая команда строит корректно связываемый с Delphi XE6 объектный файл. Но функции там не используют вещественные числа. Поэтому сначала возможно стоит попытаться собрать без использования типа float, определив таким образом в нем ли вообще дело.

clang -target arm-linux-androideabi -mfloat-abi=softfp -mfpu=neon -marm -march=armv7-a \
      -mtune=cortex-a8 -с

Ещё через readelf можно посмотреть в чём отличия файлов, которые нужно связать.

$(NDK)\prebuilt\windows\bin\arm-linux-androideabi-readelf.exe -hA file1.obj
$(NDK)\prebuilt\windows\bin\arm-linux-androideabi-readelf.exe -hA file2.obj
#81
19:03, 2 ноя. 2019

CgReligion

Так я пробовал уже
Дело именно в float-abi
Наверное дело в том, что на заре поддержки ARM в Delphi, вещественные числа ещё не передавались в соответствующих регистрах. И с тех пор они инфраструктуру не поменяли.

В целом мне удалось пропатчивать .o, чтобы он выглядел как softfp. С iOS, видимо, ещё придётся помучиться :). Что интересно, если вызывать экспортируемые из *.o функции, где используются регистры - всё передаётся как надо, через регистры. Забавно :)

#82
19:23, 2 ноя. 2019

CgReligion

Может скажешь, что в ARM предпочтительнее: add или adds? Если разумеется, результат флагов не важен. В интернете на эту тему встречаются разные мнения.

#83
(Правка: 21:00) 20:55, 2 ноя. 2019

DevilDevil

Думаю, что такой низкий уровень только для кодогенератора имеет значение. И только он сможет инструкции оптимально раскидать, сдваивая их там где нужно в промышленном масштабе. Очевидно, в первом приближении, кодогенератору нужно советовать использовать add и прочие инструкции с наименьшим числом действий.

#84
21:15, 2 ноя. 2019

CgReligion

Я часть кода на ассемблере пишу
Поэтому и спросил :)

#85
23:48, 2 ноя. 2019

Какая-то херня с метками под iOS. Причём только при живой компиляции. В годболте всё отлично. Под Андроидом всё отлично.

clang -target armv7m-none-ios-gnueabi -mfpu=neon -mfloat-abi=hard -mthumb -fPIC -c -O3 "test.c"
// test.c
__attribute__ ((naked))
void func()
{
    __asm__ volatile
    (
        "eor r0, 0 \n\t" 
        "cmp r0, 0 \n\t"
        "beq .done \n\t" /*!!!*/
        "eor r0, 0 \n\t"
    ".done: \n\t"
    "bx lr \n\t"
  );
}

Ошибка именно на прыжках. В данном примере можно закомментировать beq - и всё соберётся на ура.

Вот вывод компилятора (я тоже сначала думал про cmp):

test.c:8:22: error: unsupported relocation on symbol
        "cmp r0, 0 \n\t"
                    ^
<inline asm>:3:2: note: instantiated into assembly here
        beq .done
        ^
1 error generated.

#86
(Правка: 15:02) 15:01, 3 ноя. 2019

DevilDevil

В примере выше нужно точку перед меткой на L заменить.

#87
15:41, 3 ноя. 2019

CgReligion

А что не так с точкой?
Пробовал нижнее подчёркивание - то же самое
Он не перепутает локальные метки с глобальными функциями?

#88
(Правка: 16:54) 16:40, 3 ноя. 2019

DevilDevil

В документации по GNU-ассемблеру написано, что у каждой целевой платформы могут быть свои префикс для локальных меток. Для GNU-таргета это L (или .L иногда). Если в таргете ABI поменять с gnueabi на eabi, то пример выше скомпилируется.

#89
(Правка: 16:59) 16:48, 3 ноя. 2019

CgReligion

Не, с eabi/gnu не собирается
".L" тоже не собирается

Страницы: 13 4 5 6 7 8 Следующая »
ПрограммированиеФорумОбщее