замена fputs на fwrite

Привет All!

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

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

Reply to
Alex Mogilnikov
Loading thread data ...

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

Reply to
Alexey Boyko

Привет 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] Алексей М. ... Дареному письму в клуджи не смотрят.

Reply to
Alex Mogilnikov

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

Reply to
Alexey Boyko

Привет Alexey!

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

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

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

Да, конечно.

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

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

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

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

Reply to
Alex Mogilnikov

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.