Page 1 of 1

Говнокомпилер ARM-GCC

PostPosted: Tue, 15.12.2015 07:42:38
by TS-Labs
Шедевр для потомков: ISR.
Code: Select all
0000044c <EXTI1>:
44c:   b508         push   {r3, lr}
...
478:   bd08         pop   {r3, pc}


Если кто не понял шутку, вот лопата:
clipboard.png

Re: Говнокомпилер ARM-GCC

PostPosted: Tue, 15.12.2015 10:03:41
by VBI
push de
pop hl

Re: Говнокомпилер ARM-GCC

PostPosted: Tue, 15.12.2015 10:19:13
by g0blinish
сигавно!

Re: Говнокомпилер ARM-GCC

PostPosted: Tue, 15.12.2015 13:42:41
by psb
а што не то? чучуть лишнего пушит?

Re: Говнокомпилер ARM-GCC

PostPosted: Tue, 15.12.2015 19:51:54
by TS-Labs
Чучуть лишнего сразу в двух аспектах:
1. R3 сохраняется на стек аппаратно, и если компилер его пушит - это просто ебаный стыд, я даже наверное напишу им в спортлото.
2. Он сохраняется задолго до того, когда вообще портится. Например, есть проверка условия, после которой возможен вызов функции, а возможен и не вызов. Логично было бы пушать перед вызовом.

Re: Говнокомпилер ARM-GCC

PostPosted: Tue, 15.12.2015 19:53:17
by TS-Labs
VBI wrote:push de
pop hl

Нене, тут все как раз нормально: пушается Link Register, в котором адрес возврата, а попается РС.
Бредятина. И РС, и LR тоже аппаратно пушаются. Ваще какая-то хуйня. Есть мнение, что для функции не применились атрибуты типа ISR.

Re: Говнокомпилер ARM-GCC

PostPosted: Tue, 15.12.2015 21:34:16
by TS-Labs
Ну да, в libstm32pp не прописаны атрибуты :ohno:
Code: Select all
void BC1_IRQ() __attribute__ ((interrupt ("IRQ")));

Пиздец, получилось ваще адово:
Code: Select all
00000188 <EXTI1>:
 188:   4668         mov   r0, sp
 18a:   f020 0107    bic.w   r1, r0, #7
 18e:   468d         mov   sp, r1
 190:   b501         push   {r0, lr}
 ...
 1a8:   e8bd 4001    ldmia.w   sp!, {r0, lr}
 1ac:   4685         mov   sp, r0
 1ae:   4770         bx   lr

Re: Говнокомпилер ARM-GCC

PostPosted: Tue, 15.12.2015 23:14:58
by TS-Labs
В общем, после нудного разбирательства я продолждаю щитать, что топик.
Суть саспенса: требуется ISR без единой лишней инструкции (важна скорость отработки по крайней мере в начальной фазе), использующий аппаратно запушиваемые реги (r0-r3) в начальной фазе, вызывающий во 2й фазе сложные функции, использующие многарегов, но чтобы пуш этих регов был собсна во 2й фазе. Решил так:
Code: Select all
  void BC1_IRQ() __attribute__ ((naked));
  void BC1_IRQ_epi() __attribute__ ((noinline));
  void BC1_IRQ()
  {
    asm(...);
    asm ("push {lr} \n");
    BC1_IRQ_epi();
    asm ("pop {pc} \n");
  }

Code: Select all
000004f4 <EXTI1>:
...
     50a:   b500         push   {lr}
     50c:   f7ff ffae    bl   46c <_ZN9interrupt11BC1_IRQ_epiEv>
     510:   bd00         pop   {pc}
.........
     46c:   b5f8         push   {r3, r4, r5, r6, r7, lr}
...
     4ce:   bdf8         pop   {r3, r4, r5, r6, r7, pc}

Re: Говнокомпилер ARM-GCC

PostPosted: Tue, 15.12.2015 23:18:00
by TS-Labs
То есть, __attribute__ ((naked)) для самого ISR обеспечивает отсутствие пролога/эпилога компилятора (а также и инструкции возврата, хехе, потому требуется bx lr/pop {pc} в конце), а __attribute__ ((noinline)) для "хвоста" обеспечивает оформление оного в виде отдельной подпрограммы, обвешанной требуемыми пушами.
Свинство какое-то...

Re: Говнокомпилер ARM-GCC

PostPosted: Sun, 20.12.2015 22:29:48
by TS-Labs
Продолжаем нашу популярную рубрику.
Вот такой безобидный код генерирует 5000байт неебического говнокода, содержащего какие-то эксепшены, хуепшены, стеки, хуеки, пиздец короче запредельный.
Code: Select all
bool (*f)();
main()
{
  while(1)
    f();
}

Но не спешите проклинать ублюдочных разрабов - они вам просто делают хорошо. Ведь от вызова функции по поинтеру до try...catch - всего один шаг, не правда ли?
Неблагодарные пользовали, которым такое щясьте нахуй не упало могут избавиться от него при помощи опции компилятора -fno-exceptions.

Re: Говнокомпилер ARM-GCC

PostPosted: Mon, 21.12.2015 09:49:01
by psb
TS-Labs wrote:не правда ли?

не правда.

Re: Говнокомпилер ARM-GCC

PostPosted: Mon, 21.12.2015 13:22:47
by TS-Labs
<сарказм>
TS-Labs wrote:не правда ли?
</сарказм>