Skip to main content
hristo
Associate
August 18, 2008
Question

object code generation issue with codesourcery toolchain arm-2008q1

Posted on August 18, 2008 at 19:13

object code generation issue with codesourcery toolchain arm-2008q1

    This topic has been closed for replies.

    3 replies

    16-32micros
    Associate III
    May 17, 2011
    Posted on May 17, 2011 at 12:42

    Hi ,

    When you debug you code , I'm wondering how you are calling your function

    char *strncpy(char *pDest, const char *pSrc, size_t Num) in your main code?

    What is the value of Num ? I see in the assembly that lr = r2 at the beginning which should contain Num variable and tests if Num=0 then exits the function in that case.

    Cheers,

    STOne-32.

    hristo
    hristoAuthor
    Associate
    May 17, 2011
    Posted on May 17, 2011 at 12:42

    Hello !

    I encountered to following problem with object code for STM32 generated by codesourcery toolchain arm-2008q1, while trying to compile given C file. Here it is its contents:

    //strncpy.c

    char *strncpy(char *pDest, const char *pSrc, size_t Num)

    { char *pS;

    for (pS = pDest;0

    *pS++ = *pSrc++; /* Kopiert maximal Num Zeichen von pSrc */

    for (; 0

    *pS++ = '\0';

    return (pDest);

    }

    //End********************************************************************

    Object code generated by codesourcery toolchain is:

    080039fc :

    80039fc: b500 push {lr}

    80039fe: 4696 mov lr, r2

    8003a00: b1aa cbz r2, 8003a2e

    8003a02: 780b ldrb r3, [r1, #0]

    8003a04: b90b cbnz r3, 8003a0a

    8003a06: 4602 mov r2, r0

    8003a08: e00a b.n 8003a20

    8003a0a: 4602 mov r2, r0

    8003a0c: 7013 strb r3, [r2, #0]

    8003a0e: f11e 3eff adds.w lr, lr, #4294967295 ; 0xffffffff

     

    8003a12: d00c beq.n 8003a2e

    8003a14: f102 0201 add.w r2, r2, #1 ; 0x1

    8003a18: f811 3f01 ldrb.w r3, [r1, #1]!

    8003a1c: 2b00 cmp r3, #0

    8003a1e: d1f5 bne.n 8003a0c

    8003a20: f04f 0300 mov.w r3, #0 ; 0x0

    8003a24: f802 3b01 strb.w r3, [r2], #1

    8003a28: f11e 3eff adds.w lr, lr, #4294967295 ; 0xffffffff

     

    8003a2c: d1f8 bne.n 8003a20

    8003a2e: bd00 pop {pc}

    //**********************************************************************

    Used gcc options to compile are :

    CFLAGS_DEFAULT = -c -pipe -mthumb -mcpu=cortex-m3 -Wcomment -Wimplicit

    -Wreturn-type -Wunused -Wuninitialized

    -ffunction-sections -fdata-sections -fomit-frame-pointer

    -nostdinc -std=gnu89 -ffreestanding

    //*************************************************************************

    The problem i get in the code snippet above is fact, that link register(LR) is used as counter variable in loop implementation, which could be seen more precisely in these 2 instructions(marked with bold in in disassembly):

    '' adds.w lr, lr, #4294967295 ; 0xffffffff

    bne.n 8003a20

    ''

    and

    ''

    8003a0e: f11e 3eff adds.w lr, lr, #4294967295 ; 0xffffffff

    8003a12: d00c beq.n 8003a2e

    ''

    When I debug my application, LR value never reaches zero, so I get an hard fault exception(possibly when I reach out beyond onboard memory borders).

    Although ''-mthumb -mcpu=cortex-m3'' is used, code generated for loop implementation is very strange to me. I 've looked through object code, generated for loop implementation, and I've never seen such a thing.

    Is codesourcery toolchain is responsible for emitting ''uncorrect'' code or gcc options I used are responsible.

    I hope somebody can tell me where I get wrong.

    hristo
    hristoAuthor
    Associate
    May 17, 2011
    Posted on May 17, 2011 at 12:42

    Thanks for the reply and I'm sorry for the missing info.

    I didn't mention it, but of course strncpy() is not calling itself. It is called in main application, where strncpy() is called with Num=4.

    Yes, lr is set to r2(lr=r2). When debug my application Num never reaches zero. The point is : I know, that LR can be used as general purpose register, when it's not used for return from function. But is there any reason, preventing LR value to not be changed?