This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug target/78838] New: msp430 option -mcode-region=either, -ffunction-sections, and interrupt function attributes cause incorrect section to be created
- From: "awygle at gmail dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Fri, 16 Dec 2016 22:49:37 +0000
- Subject: [Bug target/78838] New: msp430 option -mcode-region=either, -ffunction-sections, and interrupt function attributes cause incorrect section to be created
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78838
Bug ID: 78838
Summary: msp430 option -mcode-region=either,
-ffunction-sections, and interrupt function attributes
cause incorrect section to be created
Product: gcc
Version: 6.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: awygle at gmail dot com
Target Milestone: ---
On the msp430 target, when using -mcode-region with -ffunction-sections (as is
semi-suggested by the documentation), any functions which are marked with the
interrupt attribute and which also specify an interrupt number are placed into
an incorrect section ".either.lowtext", which is clearly nonsensical. An
example is below.
interrupt_bug.i:
# 1 "interrupt_bug.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "interrupt_bug.c"
__attribute__((interrupt(2))) void causes_error(void) {
}
void main() {
while(1);
}
Compiling with -ffunction-sections:
% msp430-elf-gcc -msim -mlarge -mcode-region=either -ffunction-sections
-save-temps -c interrupt_bug.c -o interrupt_bug.o
% msp430-elf-gcc -msim -mlarge -mcode-region=either -ffunction-sections
-save-temps interrupt_bug.o -o interrupt_bug.elf
/home/awygle/toolchain/install/bin/../lib/gcc/msp430-elf/6.2.0/../../../../msp430-elf/bin/ld:
error: no section named .lower.lowtext or .upper.lowtext in linker script
% msp430-elf-objdump --syms interrupt_bug.o
interrupt_bug.o: file format elf32-msp430
SYMBOL TABLE:
00000000 l df *ABS* 00000000 interrupt_bug.c
00000000 l d .text 00000000 .text
00000000 l d .data 00000000 .data
00000000 l d .bss 00000000 .bss
00000000 l d .either.lowtext 00000000 .either.lowtext
00000000 l d __interrupt_vector_2 00000000 __interrupt_vector_2
00000000 l d .either.text.main 00000000 .either.text.main
00000000 l d .comment 00000000 .comment
00000000 l d .MSP430.attributes 00000000 .MSP430.attributes
00000000 g F .either.lowtext 00000004 causes_error
00000000 g F .either.text.main 00000004 main
Note that main() is in the section .either.text.main, while causes_error() is
in the section .either.lowtext.
Compiling without -ffunction-sections:
% msp430-elf-gcc -msim -mlarge -mcode-region=either -save-temps -c
interrupt_bug.c -o interrupt_bug.o
% msp430-elf-gcc -msim -mlarge -mcode-region=either -save-temps interrupt_bug.o
-o interrupt_bug.elf
% msp430-elf-objdump --syms interrupt_bug.o
interrupt_bug.o: file format elf32-msp430
SYMBOL TABLE:
00000000 l df *ABS* 00000000 interrupt_bug.c
00000000 l d .text 00000000 .text
00000000 l d .data 00000000 .data
00000000 l d .bss 00000000 .bss
00000000 l d .lowtext 00000000 .lowtext
00000000 l d __interrupt_vector_2 00000000 __interrupt_vector_2
00000000 l d .either.text 00000000 .either.text
00000000 l d .comment 00000000 .comment
00000000 l d .MSP430.attributes 00000000 .MSP430.attributes
00000000 g F .lowtext 00000004 causes_error
00000000 g F .either.text 00000004 main
Now causes_error() is in the .lowtext section, as expected.