Игорь Пашев - Post a comment

Nov. 29th, 2010

[info]igorpashev

11:18 pm

gcc заменяет printf с простой строкой на puts.

С -O2 выкидывает куски кода внутри 100%-ложных условий (if (0) {...}).

Круто, чо :-)

test.c:

#include <stdlib.h>
#include <stdio.h>

const int DEBUG = 0;

int main ( int argc, char *argv[] )
{
    if (DEBUG) {
        printf("Debug!\n");
    }
    return EXIT_SUCCESS;
}



gcc -save-temps test.c -o test:
    .file	"test.c"
.globl DEBUG
	.section	.rodata
	.align 4
	.type	DEBUG, @object
	.size	DEBUG, 4
DEBUG:
	.zero	4
.LC0:
	.string	"Debug!"
	.text
.globl main
	.type	main, @function
main:
	leal	4(%esp), %ecx
	andl	$-16, %esp
	pushl	-4(%ecx)
	pushl	%ebp
	movl	%esp, %ebp
	pushl	%ecx
	subl	$4, %esp
	movl	DEBUG, %eax
	testl	%eax, %eax
	je	.L2
	subl	$12, %esp
	pushl	$.LC0
	call	puts
	addl	$16, %esp
.L2:
	movl	$0, %eax
	movl	-4(%ebp), %ecx
	leave
	leal	-4(%ecx), %esp
	ret
	.size	main, .-main
	.ident	"GCC: (GNU) 4.4.4"
	.section	.note.GNU-stack,"",@progbits

gcc -O2 -save-temps test.c -o test:
	.file	"test.c"
	.text
	.p2align 4,,15
.globl main
	.type	main, @function
main:
	pushl	%ebp
	movl	%esp, %ebp
	xorl	%eax, %eax
	popl	%ebp
	ret
	.size	main, .-main
.globl DEBUG
	.section	.rodata
	.align 4
	.type	DEBUG, @object
	.size	DEBUG, 4
DEBUG:
	.zero	4
	.ident	"GCC: (GNU) 4.4.4"
	.section	.note.GNU-stack,"",@progbits

Read Comments

Reply:

From:
(will be screened)
Identity URL: 
имя пользователя:    
Вы должны предварительно войти в LiveJournal.com
 
E-mail для ответов: 
Вы сможете оставлять комментарии, даже если не введете e-mail.
Но вы не сможете получать уведомления об ответах на ваши комментарии!
Внимание: на указанный адрес будет выслано подтверждение.
Username:
Password:
Subject:
No HTML allowed in subject
Message: