[PATCH] Add target specific option " -mtinydata " for H8300-ELF target
Santosh Raktawan
santoshr2@KPITCummins.com
Wed Nov 30 11:17:00 GMT 2005
Hi,
Thank you for your comment.
>> + warning (0, " Normal mode does not support Tiny Data -
Option
>> ignored! ");
>>You should put in the OPT_* that corresponds to TARGET_TINYDATA
instead of
>>zero here.
Please find the modified patch below. I have incorporated your
suggestion in
the patch.
=======================Start Of Patch================================
ChangeLog
2005-11-30 Santosh Raktawan <santoshr2@kpitcummins.com>
* config/h8300/h8300.c (h8300_select_section): New function.
Added warning to ignore "mtinydata" option in case of
target h800 and the normal mode.
* config/h8300/elf.h : Define EXTRA_SECTIONS,
EXTRA_SECTION_FUNCTIONS,
TINYRODATA_SECTION_FUNCTION, TINYDATA_SECTION_FUNCTION,
TINYBSS_SECTION_FUNCTION,
* config/h8300/h8300.opt (TARGET_SWITCHES): Add "tinydata" to
create separate sections .tinyrodata , .tinydata and .tinybss
for global variables with different data types.
* gcc/varasm.c : Placed a one more call to the "select_section"
function for collecting uninitialised variables from the
variable tree.
* doc/invoke.texi (H8/300 Options): Document "mtinydata"
option.
=======================================================================
--- gcc-4.1-20050716/gcc/config/h8300/h8300.c.orig 2005-10-24
12:11:13.000000000 +0530
+++ gcc-4.1-20050716/gcc/config/h8300/h8300.c 2005-11-24
14:01:27.000000000 +0530
@@ -112,6 +112,11 @@ static unsigned int h8300_bitfield_leng
static unsigned int h8300_binary_length (rtx, const
h8300_length_table *);
static bool h8300_short_move_mem_p (rtx, enum rtx_code);
static unsigned int h8300_move_length (rtx *, const
h8300_length_table *);
+static void h8300_select_section (tree, int, unsigned HOST_WIDE_INT)
+ATTRIBUTE_UNUSED; void tiny_rodata_section(void); void
+tiny_data_section(void); void tiny_bss_section(void);
/* CPU_TYPE, says what cpu we're compiling for. */ int cpu_type; @@
-337,6 +342,15 @@ h8300_init_once (void)
error ("-mn is used without -mh or -ms");
target_flags ^= MASK_NORMAL_MODE;
}
+ if (TARGET_TINYDATA)
+ {
+ if (TARGET_NORMAL_MODE || TARGET_H8300)
+ {
+ warning (OPT_mtinydata, " Normal mode does not support
Tiny Data - Option ignored! ");
+ target_flags ^= MASK_TINYDATA ;
+ }
+ }
+
/* Some of the shifts are optimized for speed by default.
See http://gcc.gnu.org/ml/gcc-patches/2002-07/msg01858.html
@@ -5330,6 +5344,9 @@ h8300_encode_section_info (tree decl, rt
extra_flags = SYMBOL_FLAG_EIGHTBIT_DATA;
else if (first && h8300_tiny_data_p (decl))
extra_flags = SYMBOL_FLAG_TINY_DATA;
+ else if (TARGET_TINYDATA && TREE_CODE (decl) == VAR_DECL
+ && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
+ extra_flags = SYMBOL_FLAG_TINY_DATA;
}
if (extra_flags)
@@ -5712,6 +5729,44 @@ h8300_return_in_memory (tree type, tree
return (TYPE_MODE (type) == BLKmode
|| GET_MODE_SIZE (TYPE_MODE (type)) > (TARGET_H8300 ? 4 : 8));
}
+
+/*
+This function creates tinyrodata ,tinydata and tinybss sections on
passing "-mtinydata" commandline option. All the global variables will
be placed into these 16 bit addressible tiny area of the H8 memory.
+*/
+static void
+h8300_select_section (tree decl, int reloc,
+ unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED) { if (
+TARGET_TINYDATA ) /* Check for "tinyData" Command line option*/
+ {
+
+ if (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
+ {
+
+ if (TREE_READONLY (decl))
+
+ tiny_rodata_section(); /* Creates tinyrodata
+ section.*/
+
+ else if (DECL_INITIAL (decl))
+
+ tiny_data_section(); /* Creates tinydata
+ section. */
+
+ else if (decl && TREE_CODE (decl) == VAR_DECL
+ && DECL_INITIAL (decl) == NULL_TREE)
+
+ tiny_bss_section(); /* Creates tinybss
section.*/
+ }
+ }
+else
+ {
+
+ #if __ELF__
+ default_elf_select_section (decl, reloc, align);
+ #else
+ default_select_section (decl, reloc, align);
+ #endif
+ }
+ }
/* Initialize the GCC target structure. */ #undef
TARGET_ATTRIBUTE_TABLE
--- gcc-4.1-20050716/gcc/config/h8300/h8300.opt.orig 2005-10-19
11:43:03.000000000 +0530
+++ gcc-4.1-20050716/gcc/config/h8300/h8300.opt 2005-10-20
13:49:55.000000000 +0530
@@ -61,3 +61,7 @@ Enable the normal mode malign-300 Target
RejectNegative Mask(ALIGN_300) Use H8/300 alignment rules
+
+mtinydata
+Target RejectNegative Mask(TINYDATA)
+Generate separate sections for variables with different data types
--- gcc-4.1-20050716/gcc/config/h8300/elf.h.orig 2005-10-19
12:16:47.000000000 +0530
+++ gcc-4.1-20050716/gcc/config/h8300/elf.h 2005-10-19
14:02:10.000000000 +0530
@@ -42,4 +42,55 @@ Boston, MA 02110-1301, USA. */ #undef LINK_SPEC
#define LINK_SPEC "%{mh:%{mn:-m h8300hnelf}} %{mh:%{!mn:-m h8300helf}}
%{ms:%{mn:-m h8300snelf}} %{ms:%{!mn:-m h8300self}} %{msx:%{mn:-m
h8300sxnelf;:-m h8300sxelf}}"
+#undef TARGET_ASM_SELECT_SECTION
+#define TARGET_ASM_SELECT_SECTION h8300_select_section
+
+#define TINY_DATA_SECTION_ASM_OP "\t.section\t.tinydata,\"aw\""
+#define TINY_BSS_SECTION_ASM_OP
"\t.section\t.tinybss,\"aw\""
+#define TINY_RODATA_SECTION_ASM_OP "\t.section\t.tinyrodata,\"ax\""
+
+#define EXTRA_SECTIONS in_tinydata, in_tinyrodata,in_tinybss
+
+extern void tiny_rodata_section(void);
+extern void tiny_data_section(void);
+extern void tiny_bss_section(void);
+
+#define EXTRA_SECTION_FUNCTIONS \
+ TINY_RODATA_SECTION_FUNCTION \
+ TINY_DATA_SECTION_FUNCTION \
+ TINY_BSS_SECTION_FUNCTION
+
+#define TINY_RODATA_SECTION_FUNCTION \
+void \
+tiny_rodata_section() \
+{ \
+ if (in_section != in_tinyrodata) \
+ { \
+ fprintf (asm_out_file, "%s\n", TINY_RODATA_SECTION_ASM_OP);
\
+ in_section=in_tinyrodata; \
+ } \
+}
+
+#define TINY_DATA_SECTION_FUNCTION \
+void \
+tiny_data_section() \
+{ \
+ if (in_section != in_tinydata) \
+ { \
+ fprintf (asm_out_file, "%s\n", TINY_DATA_SECTION_ASM_OP);
\
+ in_section = in_tinydata; \
+ } \
+}
+
+#define TINY_BSS_SECTION_FUNCTION \
+void \
+tiny_bss_section() \
+{ \
+ if (in_section != in_tinybss) \
+ { \
+ fprintf (asm_out_file, "%s\n", TINY_BSS_SECTION_ASM_OP);
\
+ in_section = in_tinybss; \
+ } \
+}
+
#endif /* h8300/elf.h */
--- gcc-4.1-20050716/gcc/varasm.c.orig 2005-10-19 13:51:56.000000000
+0530
+++ gcc-4.1-20050716/gcc/varasm.c 2005-10-19 14:02:13.000000000
+0530
@@ -1750,7 +1750,10 @@ assemble_variable (tree decl, int top_le
/* If the target cannot output uninitialized but not common
global data
in .bss, then we have to use .data, so fall through. */
- if (asm_emit_uninitialised (decl, name, size, rounded))
+ if (decl && TREE_CODE (decl) == VAR_DECL
+ && DECL_INITIAL (decl) == NULL_TREE)
+ targetm.asm_out.select_section (decl, reloc, DECL_ALIGN
(decl));
+ else if (asm_emit_uninitialised (decl, name, size, rounded))
return;
}
--- gcc-4.1-20050716/gcc/doc/invoke.texi.orig 2005-10-24
14:25:29.000000000 +0530
+++ gcc-4.1-20050716/gcc/doc/invoke.texi 2005-10-24
15:32:21.000000000 +0530
@@ -488,7 +488,7 @@ Objective-C and Objective-C++ Dialects}.
-mcpu=@var{cpu}}
@emph{H8/300 Options}
-@gccoptlist{-mrelax -mh -ms -mn -mint32 -malign-300}
+@gccoptlist{-mrelax -mh -ms -mn -mint32 -malign-300 -mtinydata}
@emph{HPPA Options}
@gccoptlist{-march=@var{architecture-type} @gol @@ -8533,6 +8533,10 @@
The default for the H8/300H and H8S is t byte boundaries.
@option{-malign-300} causes them to be aligned on 2 byte boundaries.
This option has no effect on the H8/300.
+
+@item -mtinydata
+@opindex mtinydata
+By passing this option, compiler generates .tinyrodata, .tinydata and
+.tinybss sections. While using default linker script, .tinyrodata will
+be placed in lower 32KB of memory and .tinydata, .tinybss will be
+placed in upper 32KB of memory. The variables stored in these sections
+are 16 bit addressable. While using custom linker script, user has to
+allocate these sections in lower or upper 32 KB of memory to get 16 bit
addressability.
@end table
@node HPPA Options
=======================End Of Patch================================
Regards,
Santosh Raktawan.
KPIT Cummins Infosystems Ltd,
Pune ( INDIA )
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Free download of GNU based tool-chains for Renesas' SH and H8 Series.
The following site also offers free technical support to its users.
Visit http://www.kpitgnutools.com for details.
Latest versions of KPIT GNU tools were released on October 12, 2005.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
More information about the Gcc-patches
mailing list