From c0ea7c52e10024ecd29b8f0e23b666b6af926c6e Mon Sep 17 00:00:00 2001 From: Jozef Lawrynowicz Date: Mon, 7 Oct 2019 16:34:31 +0100 Subject: Add support for new functionality in the msp430 backend of GCC. This functionality will generate a new GNU object attribute for the "data region" has been added. This object attribute is used mark whether the compiler has generated code assuming that data could be in the upper or lower memory regions. Code which assumes data is always in the lower memory region is incompatible with code which uses the full memory range for data. The patch also adds a new assembler directive ".mspabi_attribute" to handle the existing MSPABI object attributes. GCC will now emit both .gnu_attribute and .mspabi_attribute directives to indicate what options the source file was compiled with. The assembler will now check the values set in these directives against the options that the it has been invoked with. If there is a discrepancy, the assembler will exit with an error. bfd * elf32-msp430.c (elf32_msp430_merge_mspabi_attributes): Rename to.. (elf32_msp430_merge_msp430_attributes): Add support for merging the GNU object attribute for data region. binutils* readelf.c (display_msp430_gnu_attribute): New. (process_arch_specific): Use msp430 specific handler for GNU attributes. gas * config/tc-msp430.c (md_parse_option): Set lower_data_region_only to FALSE if the data region is set to "upper", "either" or "none". (msp430_object_attribute): New. (md_pseudo_table): Handle .mspabi_attribute and .gnu_attribute. (msp430_md_end): Replace hard-coded attribute values with enums. Handle data region object attribute. * doc/as.texi: Document MSP430 Data Region object attribute. * doc/c-msp430.texi: Document the .mspabi_attribute directive. * testsuite/gas/msp430/attr-430-small-bad.d: New test. * testsuite/gas/msp430/attr-430-small-bad.l: New test. * testsuite/gas/msp430/attr-430-small-good.d: New test. * testsuite/gas/msp430/attr-430-small.s: New test. * testsuite/gas/msp430/attr-430x-large-any-bad.d: New test. * testsuite/gas/msp430/attr-430x-large-any-bad.l: New test. * testsuite/gas/msp430/attr-430x-large-any-good.d: New test. * testsuite/gas/msp430/attr-430x-large-any.s: New test. * testsuite/gas/msp430/attr-430x-large-lower-bad.d: New test. * testsuite/gas/msp430/attr-430x-large-lower-bad.l: New test. * testsuite/gas/msp430/attr-430x-large-lower-good.d: New test. * testsuite/gas/msp430/attr-430x-large-lower.s: New test. * testsuite/gas/msp430/msp430.exp: Run new tests. include * elf/msp430.h: Add enums for MSPABI and GNU object attribute tag names and values. ld * testsuite/ld-msp430-elf/attr-gnu-main.s: New test. * testsuite/ld-msp430-elf/attr-gnu-obj.s: New test. * testsuite/ld-msp430-elf/attr-gnu-region-lower-upper.d: New test. * testsuite/ld-msp430-elf/attr-gnu-region-lower.d: New test. * testsuite/ld-msp430-elf/attr-gnu-region-upper.d: New test. * testsuite/ld-msp430-elf/msp430-elf.exp: Run new tests. --- include/elf/msp430.h | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'include/elf') diff --git a/include/elf/msp430.h b/include/elf/msp430.h index e060804..ce2cf5b 100644 --- a/include/elf/msp430.h +++ b/include/elf/msp430.h @@ -58,6 +58,47 @@ #define OFBA_MSPABI_Tag_ISA 4 #define OFBA_MSPABI_Tag_Code_Model 6 #define OFBA_MSPABI_Tag_Data_Model 8 +#define OFBA_MSPABI_Tag_enum_size 10 /* Unused by GNU. */ + +/* GNU Object attribute tags. */ +enum +{ + /* 0-3 are generic. */ + + /* Define a GNU attribute for keeping track of whether the compiler has + generated code assuming that the upper region could be in use. + Added by the assembler based on the -mdata-region option. + This tag is ignored unless the large memory model is in use. */ + Tag_GNU_MSP430_Data_Region = 4, +}; + +/* Object attribute values. */ +enum +{ + /* Values defined for OFBA_MSPABI_Tag_ISA. */ + OFBA_MSPABI_Val_ISA_NONE = 0, + OFBA_MSPABI_Val_ISA_MSP430 = 1, + OFBA_MSPABI_Val_ISA_MSP430X = 2, + + /* Values defined for OFBA_MSPABI_Tag_Code_Model. */ + OFBA_MSPABI_Val_Code_Model_NONE = 0, + OFBA_MSPABI_Val_Code_Model_SMALL = 1, + OFBA_MSPABI_Val_Code_Model_LARGE = 2, + + /* Values defined for OFBA_MSPABI_Tag_Data_Model. */ + OFBA_MSPABI_Val_Data_Model_NONE = 0, + OFBA_MSPABI_Val_Data_Model_SMALL = 1, + OFBA_MSPABI_Val_Data_Model_LARGE = 2, + OFBA_MSPABI_Val_Data_Model_RESTRICTED = 3, /* Unused by GNU. */ + + /* Values defined for Tag_GNU_MSP430_Data_Region. */ + Val_GNU_MSP430_Data_Region_NONE = 0, + /* The default data region. Assumes all data is below address 0x10000. */ + Val_GNU_MSP430_Data_Region_Lower = 1, + /* Set if -mdata-region={none,upper,either}. Assumes + data could be placed at or above address 0x10000. */ + Val_GNU_MSP430_Data_Region_Any = 2, +}; /* Relocations. */ START_RELOC_NUMBERS (elf_msp430_reloc_type) -- cgit v1.1