замена fputs на fwrite

Jun 06, 2005 4 Replies

Привет All!



gcc 3.4.1 (и, видимо, последующие тоже) умеет заменять вызовы fputs на fwrite. Что-то я в документации не смог найти, как ему запретить делать такие замены. Подскажите, пожалуйста.



Всего наилучшего, [Team PCAD 2000] Алексей М. ... Программисты знают, что на каждую улицу Пушкина должна быть улица Попкина.


Hello Alex.

06 Jun 05 13:45, you wrote to all:

AM> gcc 3.4.1 (и, видимо, последующие тоже) умеет заменять вызовы AM> fputs на fwrite. Что-то я в документации не смог найти, как ему AM> запретить делать такие замены. Подскажите, пожалуйста.

1377: fputs("Hello", stdout); \ 5 0d18 6091 0000 lds r22,__iob+2 \ 6 0d1c 7091 0000 lds r23,(__iob+2)+1 \ 7 0d20 80E0 ldi r24,lo8(.LC0) \ 8 0d22 90E0 ldi r25,hi8(.LC0) \ 9 0d24 0E94 0000 call fputs

avr-gcc (GCC) 4.1.0 20050403 (experimental)

Ты о чём? Ты уверен, что это не в stdio.h подмена?

Alexey

Привет Alexey!

06 Jun 05 16:20, Alexey Boyko писал Alex Mogilnikov:

AM>> gcc 3.4.1 (и, видимо, последующие тоже) умеет заменять вызовы AM>> fputs на fwrite. Что-то я в документации не смог найти, как ему AM>> запретить делать такие замены. Подскажите, пожалуйста.

AB> 1377: fputs("Hello", stdout); AB> \ 5 0d18 6091 0000 lds r22,__iob+2 AB> \ 6 0d1c 7091 0000 lds r23,(__iob+2)+1 AB> \ 7 0d20 80E0 ldi r24,lo8(.LC0) AB> \ 8 0d22 90E0 ldi r25,hi8(.LC0) AB> \ 9 0d24 0E94 0000 call fputs

AB> avr-gcc (GCC) 4.1.0 20050403 (experimental)

AB> Ты о чём?

О том, что оптимизатор в gcc 3.4.1 в некоторых случаях заменяет вызов fputs на вызов fwrite.

============ test.c ============= include <stdio.h>

void f(void) { fputs("Hello", stdout); } ================================= ============ test.s ============= .file "test.c" .section .rodata.str1.4,"aMS",%progbits,1 .align 2 .LC0: .ascii "Hello\000" .text .align 2 .global f .type f, %function f: @ args = 0, pretend = 0, frame = 0 @ frame_needed = 0, uses_anonymous_args = 0 @ link register save eliminated. ldr r3, .L2 ldr r2, [r3, #0] ldr r0, .L2+4 ldr r3, [r2, #8] mov r1, #1 mov r2, #5 @ lr needed for prologue b fwrite .L3: .align 2 .L2: .word _impure_ptr .word .LC0 .size f, .-f .ident "GCC: (GNU) 3.4.1" =================================

AB> Ты уверен, что это не в stdio.h подмена?

Уверен. После препроцессора получается вот это:

========= test.C ========= void f(void) { fputs("Hello", (_impure_ptr->_stdout)); } ==========================

Hу и с -O0 вызывается fputs.

Оптимизатор, конечно, все делает правильно, и не проблема дать линкеру работоспособную fwrite, но на случай, если мне такого почему-то не захочется, хотелось бы знать, можно ли данную замену запретить (кроме -O0).

Всего наилучшего, [Team PCAD 2000] Алексей М. ... Дареному письму в клуджи не смотрят.

Hello Alex.

07 Jun 05 12:02, you wrote to me:

AM> mov r1, #1 AM> mov r2, #5 AM> @ lr needed for prologue AM> b fwrite

прикольно.

AM> { AM> fputs("Hello", (_impure_ptr->_stdout)); AM> }

Кстати, это он так, наверное, только с константами будет делать.

AM> запретить (кроме -O0).

Hе, не знаю. Можно по исходникам полазить, но у меня нет исходников 3.4.1 под рукой.

Alexey

Привет Alexey!

09 Jun 05 14:49, Alexey Boyko писал Alex Mogilnikov:

AB> прикольно.

AB> Кстати, это он так, наверное, только с константами будет делать.

Да, конечно.

AM>> запретить (кроме -O0).

AB> Hе, не знаю. Можно по исходникам полазить, но у меня нет исходников AB> 3.4.1 под рукой.

Hу, нет. Это лениво. Я думал, может кто-то сразу знает...

Всего наилучшего, [Team PCAD 2000] Алексей М. ... О сколько нам открытий чудных готовит открывашки крюк!

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required