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