Ошибка переноса armcc на armclang: неизвестное имя регистра 'cp15:0:c9:c12:0'

Я пытаюсь перенести компиляцию исходного кода с armcc compiler v5.06 на armclang v6. И я вижу ошибки armclang, говорящие, что он не может распознавать регистры cp15. Похоже, что в armcc vs clang могут быть изменения в том, как объявлять регистры. Однако я не смог найти ничего в документации по миграции или в документации компилятора.

Вот фрагмент кода -

void reset_clock_count(void)
{
    register uint32_t reg_cp15_pmcr __asm("cp15:0:c9:c12:0");
    reg_cp15_pmcr |=  RESET_CYCLE_COUNTER;
}

И фрагмент ошибки -

error: unknown register name 'cp15:0:c9:c12:0' in asm
    register uint32_t reg_cp15_pmcr __asm("cp15:0:c9:c12:0");
                                          ^

Я вижу такие же ошибки для других мест в аналогичном объявленном реестре. Любой указатель на то, что могло пойти не так, будет полезным.

Изменить: фактический ответ ниже.

register uint32_t val;
__asm volatile ("mrc p15, 0, %0, c9, c13, 0": "=r"(val));
val |= RESET_CYCLE_COUNTER;
__asm volatile ("mcr p15, 0, %0, c9, c13, 0":: "r"(val));

1 ответ

Пожалуйста, сначала прочтите руководство, и это тоже упоминалось в комментариях.

To access the PMCR, read or write the CP15 registers with: 
MRC p15, 0, <Rt>, c9, c12, 0; Read Performance Monitor Control Register 
MCR p15, 0, <Rt>, c9, c12, 0; Write Performance Monitor Control Register

вырезать и вставить в мой код, выбрать регистр

MRC p15, 0, r0, c9, c12, 0

используя ассемблер GNU:

Disassembly of section .text:

00000000 <.text>:
   0:   ee190f1c    mrc 15, 0, r0, cr9, cr12, {0}

используя clang как ассемблер

Disassembly of section .text:

00000000 <.text>:
   0:   ee190f1c    mrc 15, 0, r0, cr9, cr12, {0}

Никаких предупреждений и ошибок.

Пожалуйста, сначала прочтите документацию.

Я не вижу, как этот синтаксис будет работать с любым инструментом, поскольку регистр не был указан. Но также помните, что встроенная сборка очень специфична для компилятора и никоим образом не предполагается переносимой. Так что, если armcc поддерживает этот странный синтаксис, нет никаких причин ожидать, что clang будет.

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

У вас есть намного больше работы, чтобы этот встроенный asm делал что-нибудь полезное в любом случае, вы добьетесь успеха быстрее с реальной сборкой.

.globl read_pmcr
read_pmcr:
    MRC p15, 0, r0, c9, c12, 0
    bx lr
    
.globl write_pmcr   
write_pmcr:
    MCR p15, 0, r0, c9, c12, 0
    bx lr

И, конечно же, перед началом сборки у вас должна быть соответствующая документация.

Другие вопросы по тегам