[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[avr-libc-dev] broken code generation
From: |
avr-libc-devel |
Subject: |
[avr-libc-dev] broken code generation |
Date: |
Tue, 29 Jan 2019 13:30:05 +0500 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.4.0 |
Hello friends.
A long time ago, more than 10 years ago, I used avr-gcc + avr-binutils +
avr-libc on Linux.
Today I had to compile a test project with a modern installation of
avr-gcc, avr-binutils, avr-libc.
And I noticed a strange assembler code in the listing: there is no
initialization of the stack, interrupt handlers are in an abnormal
place, the transition to the main function is missing ..
Can anyone comment on what is going on?
Command line to compile the project:
$ avr-gcc -iquote . -Os -pipe -mmcu=attiny2313 -mint8 -g -c -o blink.o
blink.c
$ avr-gcc blink.o -o blink.elf
Listing avr-objdump -h -S blink.elf:
---skip---
Disassembly of section .text:
00000000 <__do_clear_bss>:
0: 20 e0 ldi r18, 0x00 ; 0
2: a0 e6 ldi r26, 0x60 ; 96
4: b0 e0 ldi r27, 0x00 ; 0
6: 01 c0 rjmp .+2 ; 0xa <.do_clear_bss_start>
00000008 <.do_clear_bss_loop>:
8: 1d 92 st X+, r1
0000000a <.do_clear_bss_start>:
a: a1 36 cpi r26, 0x61 ; 97
c: b2 07 cpc r27, r18
e: e1 f7 brne .-8 ; 0x8 <.do_clear_bss_loop>
00000010 <__vector_2>:
}
#endif
ISR(INT1_vect, ISR_BLOCK){
10: 1f 92 push r1
12: 0f 92 push r0
14: 0f b6 in r0, 0x3f ; 63
16: 0f 92 push r0
18: 11 24 eor r1, r1
1a: 8f 93 push r24
1c: 9f 93 push r25
PORTD ^= _BV(PORT5);
1e: 92 b3 in r25, 0x12 ; 18
20: 80 e2 ldi r24, 0x20 ; 32
22: 89 27 eor r24, r25
24: 82 bb out 0x12, r24 ; 18
}
26: 9f 91 pop r25
28: 8f 91 pop r24
2a: 0f 90 pop r0
2c: 0f be out 0x3f, r0 ; 63
2e: 0f 90 pop r0
30: 1f 90 pop r1
32: 18 95 reti
00000034 <main>:
// TIMSK = OCIE0A; //enable interrupt on compare match
/*enable and tune INT1 */
--- skip ---
At the same time, I still have a listing from the project compilation
more than 10 years ago (the processor is not attiny2313):
---- skip ----
00000000 <__vectors>:
0: 0c 94 2a 00 jmp 0x54
4: 0c 94 45 00 jmp 0x8a
8: 0c 94 45 00 jmp 0x8a
c: 0c 94 45 00 jmp 0x8a
10: 0c 94 45 00 jmp 0x8a
14: 0c 94 45 00 jmp 0x8a
18: 0c 94 45 00 jmp 0x8a
1c: 0c 94 45 00 jmp 0x8a
20: 0c 94 45 00 jmp 0x8a
24: 0c 94 45 00 jmp 0x8a
28: 0c 94 45 00 jmp 0x8a
2c: 0c 94 45 00 jmp 0x8a
30: 0c 94 45 00 jmp 0x8a
34: 0c 94 45 00 jmp 0x8a
38: 0c 94 45 00 jmp 0x8a
3c: 0c 94 45 00 jmp 0x8a
40: 0c 94 45 00 jmp 0x8a
44: 0c 94 45 00 jmp 0x8a
48: 0c 94 45 00 jmp 0x8a
4c: 0c 94 45 00 jmp 0x8a
50: 0c 94 45 00 jmp 0x8a
00000054 <__ctors_end>:
54: 11 24 eor r1, r1
56: 1f be out 0x3f, r1 ; 63
58: cf e5 ldi r28, 0x5F ; 95
5a: d8 e0 ldi r29, 0x08 ; 8
5c: de bf out 0x3e, r29 ; 62
5e: cd bf out 0x3d, r28 ; 61
00000060 <__do_copy_data>:
60: 10 e0 ldi r17, 0x00 ; 0
62: a0 e6 ldi r26, 0x60 ; 96
64: b0 e0 ldi r27, 0x00 ; 0
66: e2 ea ldi r30, 0xA2 ; 162
68: f0 e0 ldi r31, 0x00 ; 0
6a: 02 c0 rjmp .+4 ; 0x70
0000006c <.do_copy_data_loop>:
6c: 05 90 lpm r0, Z+
6e: 0d 92 st X+, r0
00000070 <.do_copy_data_start>:
70: a0 36 cpi r26, 0x60 ; 96
72: b1 07 cpc r27, r17
74: d9 f7 brne .-10 ; 0x6c
00000076 <__do_clear_bss>:
76: 10 e0 ldi r17, 0x00 ; 0
78: a0 e6 ldi r26, 0x60 ; 96
7a: b0 e0 ldi r27, 0x00 ; 0
7c: 01 c0 rjmp .+2 ; 0x80
0000007e <.do_clear_bss_loop>:
7e: 1d 92 st X+, r1
00000080 <.do_clear_bss_start>:
80: a0 36 cpi r26, 0x60 ; 96
82: b1 07 cpc r27, r17
84: e1 f7 brne .-8 ; 0x7e
86: 0c 94 47 00 jmp 0x8e
0000008a <__bad_interrupt>:
8a: 0c 94 00 00 jmp 0x0
0000008e <main>:
#include <avr/io.h>
int main (void){
8e: cf e5 ldi r28, 0x5F ; 95
---- skip ----
It looks right: interrupt vectors, stack initialization and everything else.
Friends, what am I doing wrong?
Thank you.
- [avr-libc-dev] broken code generation,
avr-libc-devel <=