From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17363 invoked by alias); 18 Oct 2002 04:59:09 -0000 Mailing-List: contact gcc-help-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-help-owner@gcc.gnu.org Received: (qmail 17355 invoked from network); 18 Oct 2002 04:59:08 -0000 Received: from unknown (HELO mail.ivivity.com) (64.238.111.99) by sources.redhat.com with SMTP; 18 Oct 2002 04:59:08 -0000 Received: by ATLOPS with Internet Mail Service (5.5.2653.19) id <414L5M6M>; Fri, 18 Oct 2002 00:59:07 -0400 Message-ID: From: Dinesh Nagpure To: "'gcc-help@gcc.gnu.org'" Subject: wrong code generation : Date: Thu, 17 Oct 2002 21:59:00 -0000 MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" X-SW-Source: 2002-10/txt/msg00215.txt.bz2 Greetings, While building Linux kernel v 2.4.16 for RM5231A processor I am facing some problems in the way code is generated for memcpy. I see some unaligned accesses beging done and also the inline code for memcpy doesn't seem to be given proper destination address. I also tried the -mmemcpy switch without much success, here is what I see with -mmemcpy. The offending code is in console_init( ) as below: void __init console_init(void) { memset(ldiscs, 0, sizeof(ldiscs)); (void) tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY); memset(&tty_std_termios, 0, sizeof(struct termios)); memcpy(tty_std_termios.c_cc, INIT_C_CC, NCCS); printk("tty_std_termios is at %p\n", &tty_std_termios); | few more printk( ) calls etc. } Here is the code generated for the function console_init( ) 80206d00 : 80206d00: 27bdffc8 addiu sp,sp,-56 80206d04: 24060400 li a2,1024 80206d08: 3c048029 lui a0,0x8029 80206d0c: 2484b140 addiu a0,a0,-20160 80206d10: afbf0034 sw ra,52(sp) 80206d14: afbe0030 sw s8,48(sp) 80206d18: afb7002c sw s7,44(sp) 80206d1c: afb60028 sw s6,40(sp) 80206d20: afb50024 sw s5,36(sp) 80206d24: afb40020 sw s4,32(sp) 80206d28: afb3001c sw s3,28(sp) 80206d2c: afb20018 sw s2,24(sp) 80206d30: afb10014 sw s1,20(sp) 80206d34: afb00010 sw s0,16(sp) 80206d38: 3c108029 lui s0,0x8029 80206d3c: 2610b114 addiu s0,s0,-20204 80206d40: 0c078bc0 jal 801e2f00 80206d44: 00002821 move a1,zero 80206d48: 3c058022 lui a1,0x8022 80206d4c: 24a59480 addiu a1,a1,-27520 80206d50: 0c06117c jal 801845f0 80206d54: 00002021 move a0,zero 80206d58: 02002021 move a0,s0 80206d5c: 00002821 move a1,zero 80206d60: 0c078bc0 jal 801e2f00 80206d64: 24060028 li a2,40 80206d68: 24060017 li a2,23 80206d6c: 3c05801f lui a1,0x801f 80206d70: 24a5fcc8 addiu a1,a1,-824 80206d74: 0c0789c8 jal 801e2720 80206d78: 26040011 addiu a0,s0,17 /* this bugs me a lot */ 80206d7c: 3c04801f lui a0,0x801f 80206d80: 2484fcdc addiu a0,a0,-804 80206d84: 0c046ddd jal 8011b774 80206d88: 02002821 move a1,s0 80206d8c: 3c11801f lui s1,0x801f 80206d90: 2631fcf8 addiu s1,s1,-776 80206d94: 92050011 lbu a1,17(s0) The destination address for memcpy is c_cc array in the termios structure : typedef unsigned char cc_t; typedef unsigned long speed_t; typedef unsigned long tcflag_t; /* * The ABI says nothing about NCC but seems to use NCCS as * replacement for it in struct termio */ #define NCCS 23 struct termios { tcflag_t c_iflag; /* input mode flags */ tcflag_t c_oflag; /* output mode flags */ tcflag_t c_cflag; /* control mode flags */ tcflag_t c_lflag; /* local mode flags */ // cc_t c_cc[NCCS]; /* control characters */ /* * Seems nonexistent in the ABI, but Linux assumes existence ... */ cc_t c_line; /* line discipline */ cc_t c_cc[NCCS]; /* control characters */ }; Source for memcpy( ) is in termios.h as: #define INIT_C_CC "\003\034\177\025\1\0\0\0\021\023\032\0\022\017\027\026\004\0" As a result memcpy( ) fails to copy to the destination and c_cc remains all zeros from memset( ). I see memcpy( ) tries to do some alignment but apparently fails. If I flip the c_line and c_cc positions then memcpy( ) does work. I am using gcc-3.0.2 and binutils-2.11.92.0.7. To me this seems to be some gcc code generation issue. Will someone pls tell me if the toolchain I am using is good enough or else what should I be using? I don't see any additional flags also that would slove my problem. Thanks, Dinesh