I am working on a projec which is using MSP430F5438a. I have to use gcc 4.7
so that I can leverae 256KB ROM. I tried the LTO compile which generate so
impressived result:

Normal compile:
   text    data     bss     dec     hex filename
  87254     376    7674   95304   17448 iwatch.elf

LTO: (except main.c)
  text    data     bss     dec     hex filename
  80133     376    7660   88169   15869 iwatch.elf
The same project compiled under IAR is like
 67 856 bytes of CODE  memory
  8 430 bytes of DATA  memory (+ 197 absolute )
 41 640 bytes of CONST memory

The attached patch is enable the support for built-in function like
__delay_cycles. I don't really understand the gcc code base. I use the same
way of AVR backend does for the same purpose.
I also tried build the same project under mingw with gcc 4.7 and LTO.
Surprizing, it generates much bigger hex file. (i have another dirty patch
to get gcc 4.7 lto works under mingw. the main problem is mingw gcc has a
broken __attribute((weak)) support.)
(mingw gcc-msp430 4.7.0, with LTO)
   text    data     bss     dec     hex filename
  87220     372    7672   95264   17420 iwatch.elf

-- 
-Howard
diff -du ../../../../gcc-4.7.0/gcc/config/msp430/msp430-builtins.c 
./msp430-builtins.c
--- ../../../../gcc-4.7.0/gcc/config/msp430/msp430-builtins.c   2013-05-09 
12:58:08.791355400 +0000
+++ ./msp430-builtins.c 2013-05-06 05:50:50.679355402 +0000
@@ -38,6 +38,7 @@
 /* The following functions are defined in this file and used by msp430.c */
 void msp430_init_builtins (void);
 rtx msp430_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
+tree msp430_builtin_decl (unsigned, bool);
 
 enum msp430_builtins
 {
@@ -63,6 +64,8 @@
   MSP430_BUILTIN_last_enum
 };
 
+tree fndecl[MSP430_BUILTIN_last_enum];
+
 void
 msp430_init_builtins (void)
 {
@@ -72,98 +75,117 @@
   gcc_assert (PSImode == TYPE_MODE (msp430_a20_unsigned_type_node));
   (*lang_hooks.types.register_builtin_type) (msp430_a20_unsigned_type_node,
                                             "__uint20");
-  add_builtin_function ("__nop",
+  fndecl[MSP430_BUILTIN_NOP] =
+    add_builtin_function ("__nop",
                        build_function_type_list (void_type_node, NULL_TREE),
                        MSP430_BUILTIN_NOP, BUILT_IN_MD, NULL, NULL_TREE);
-  add_builtin_function ("__dint",
+  fndecl[MSP430_BUILTIN_DINT] = 
+    add_builtin_function ("__dint",
                        build_function_type_list (void_type_node, NULL_TREE),
                        MSP430_BUILTIN_DINT, BUILT_IN_MD, NULL, NULL_TREE);
-  add_builtin_function ("__eint",
+  fndecl[MSP430_BUILTIN_EINT] = 
+    add_builtin_function ("__eint",
                        build_function_type_list (void_type_node, NULL_TREE),
                        MSP430_BUILTIN_EINT, BUILT_IN_MD, NULL, NULL_TREE);
-  add_builtin_function ("__read_status_register",
+  fndecl[MSP430_BUILTIN_READ_STATUS_REGISTER] = 
+    add_builtin_function ("__read_status_register",
                        build_function_type_list (unsigned_type_node,
                                                  NULL_TREE),
                        MSP430_BUILTIN_READ_STATUS_REGISTER, BUILT_IN_MD,
                        NULL, NULL_TREE);
-  add_builtin_function ("__get_interrupt_state",
+  fndecl[MSP430_BUILTIN_GET_INTERRUPT_STATE] = 
+    add_builtin_function ("__get_interrupt_state",
                        build_function_type_list (unsigned_type_node,
                                                  NULL_TREE),
                        MSP430_BUILTIN_GET_INTERRUPT_STATE, BUILT_IN_MD, NULL,
                        NULL_TREE);
-  add_builtin_function ("__write_status_register",
+  fndecl[MSP430_BUILTIN_WRITE_STATUS_REGISTER] = 
+    add_builtin_function ("__write_status_register",
                        build_function_type_list (void_type_node,
                                                  unsigned_type_node,
                                                  NULL_TREE),
                        MSP430_BUILTIN_WRITE_STATUS_REGISTER, BUILT_IN_MD,
                        NULL, NULL_TREE);
-  add_builtin_function ("__bic_status_register",
+  fndecl[MSP430_BUILTIN_BIC_STATUS_REGISTER] = 
+    add_builtin_function ("__bic_status_register",
                        build_function_type_list (void_type_node,
                                                  unsigned_type_node,
                                                  NULL_TREE),
                        MSP430_BUILTIN_BIC_STATUS_REGISTER, BUILT_IN_MD, NULL,
                        NULL_TREE);
-  add_builtin_function ("__bis_status_register",
+  fndecl[MSP430_BUILTIN_BIS_STATUS_REGISTER] = 
+    add_builtin_function ("__bis_status_register",
                        build_function_type_list (void_type_node,
                                                  unsigned_type_node,
                                                  NULL_TREE),
                        MSP430_BUILTIN_BIS_STATUS_REGISTER, BUILT_IN_MD, NULL,
                        NULL_TREE);
-  add_builtin_function ("__set_interrupt_state",
+  fndecl[MSP430_BUILTIN_SET_INTERRUPT_STATE] = 
+    add_builtin_function ("__set_interrupt_state",
                        build_function_type_list (void_type_node,
                                                  unsigned_type_node,
                                                  NULL_TREE),
                        MSP430_BUILTIN_SET_INTERRUPT_STATE, BUILT_IN_MD, NULL,
                        NULL_TREE);
-  add_builtin_function ("__bic_status_register_on_exit",
+  fndecl[MSP430_BUILTIN_BIC_SR_IRQ] = 
+    add_builtin_function ("__bic_status_register_on_exit",
                        build_function_type_list (void_type_node,
                                                  unsigned_type_node,
                                                  NULL_TREE),
                        MSP430_BUILTIN_BIC_SR_IRQ, BUILT_IN_MD, NULL,
                        NULL_TREE);
-  add_builtin_function ("__bis_status_register_on_exit",
+  fndecl[MSP430_BUILTIN_BIS_SR_IRQ] = 
+    add_builtin_function ("__bis_status_register_on_exit",
                        build_function_type_list (void_type_node,
                                                  unsigned_type_node,
                                                  NULL_TREE),
                        MSP430_BUILTIN_BIS_SR_IRQ, BUILT_IN_MD, NULL,
                        NULL_TREE);
-  add_builtin_function ("__read_stack_pointer",
+  fndecl[MSP430_BUILTIN_READ_STACK_POINTER] = 
+    add_builtin_function ("__read_stack_pointer",
                        build_function_type_list (ptr_type_node, NULL_TREE),
                        MSP430_BUILTIN_READ_STACK_POINTER, BUILT_IN_MD, NULL,
                        NULL_TREE);
-  add_builtin_function ("__write_stack_pointer",
+  fndecl[MSP430_BUILTIN_WRITE_STACK_POINTER] = 
+    add_builtin_function ("__write_stack_pointer",
                        build_function_type_list (void_type_node,
                                                  ptr_type_node, NULL_TREE),
                        MSP430_BUILTIN_WRITE_STACK_POINTER, BUILT_IN_MD, NULL,
                        NULL_TREE);
-  add_builtin_function ("__delay_cycles",
+  fndecl[MSP430_BUILTIN_DELAY_CYCLES] = 
+    add_builtin_function ("__delay_cycles",
                        build_function_type_list (void_type_node,
                                                  long_unsigned_type_node,
                                                  NULL_TREE),
                        MSP430_BUILTIN_DELAY_CYCLES, BUILT_IN_MD, NULL,
                        NULL_TREE);
-  add_builtin_function ("__swap_bytes",
+  fndecl[MSP430_BUILTIN_SWAP_BYTES] = 
+    add_builtin_function ("__swap_bytes",
                        build_function_type_list (unsigned_type_node,
                                                  unsigned_type_node,
                                                  NULL_TREE),
                        MSP430_BUILTIN_SWAP_BYTES, BUILT_IN_MD, NULL,
                        NULL_TREE);
-  add_builtin_function ("__get_watchdog_clear_value",
+  fndecl[MSP430_BUILTIN_GET_WATCHDOG_CLEAR_VALUE] = 
+    add_builtin_function ("__get_watchdog_clear_value",
                        build_function_type_list (unsigned_type_node,
                                                  NULL_TREE),
                        MSP430_BUILTIN_GET_WATCHDOG_CLEAR_VALUE, BUILT_IN_MD,
                        NULL, NULL_TREE);
-  add_builtin_function ("__set_watchdog_clear_value",
+  fndecl[MSP430_BUILTIN_SET_WATCHDOG_CLEAR_VALUE] = 
+    add_builtin_function ("__set_watchdog_clear_value",
                        build_function_type_list (void_type_node,
                                                  unsigned_type_node,
                                                  NULL_TREE),
                        MSP430_BUILTIN_SET_WATCHDOG_CLEAR_VALUE, BUILT_IN_MD,
                        NULL, NULL_TREE);
-  add_builtin_function ("__watchdog_clear",
+  fndecl[MSP430_BUILTIN_WATCHDOG_CLEAR] = 
+    add_builtin_function ("__watchdog_clear",
                        build_function_type_list (void_type_node, NULL_TREE),
                        MSP430_BUILTIN_WATCHDOG_CLEAR, BUILT_IN_MD, NULL,
                        NULL_TREE);
-  add_builtin_function ("__even_in_range",
+  fndecl[MSP430_BUILTIN_EVEN_IN_RANGE] = 
+    add_builtin_function ("__even_in_range",
                        build_function_type_list (unsigned_type_node,
                                                  unsigned_type_node,
                                                  unsigned_type_node,
@@ -481,3 +503,12 @@
 
   return retval;
 }
+
+tree
+msp430_builtin_decl (unsigned id, bool initialize_p ATTRIBUTE_UNUSED)
+{
+  if (id < MSP430_BUILTIN_last_enum)
+    return fndecl[id];
+
+  return error_mark_node;
+}
diff -du ../../../../gcc-4.7.0/gcc/config/msp430/msp430.c ./msp430.c
--- ../../../../gcc-4.7.0/gcc/config/msp430/msp430.c    2013-05-09 
12:58:08.799355400 +0000
+++ ./msp430.c  2013-05-06 05:46:44.955355401 +0000
@@ -4149,9 +4149,13 @@
 
 /* Defined in msp430-builtins.c */
 rtx msp430_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
+tree msp430_builtin_decl (unsigned, bool);
 #undef TARGET_EXPAND_BUILTIN
 #define TARGET_EXPAND_BUILTIN msp430_expand_builtin
 
+#undef TARGET_BUILTIN_DECL 
+#define TARGET_BUILTIN_DECL msp430_builtin_decl
+
 /* Defined in msp430-function.c */
 #undef TARGET_SET_CURRENT_FUNCTION
 #define TARGET_SET_CURRENT_FUNCTION msp430_set_current_function
------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and 
their applications. This 200-page book is written by three acclaimed 
leaders in the field. The early access version is available now. 
Download your free book today! http://p.sf.net/sfu/neotech_d2d_may
_______________________________________________
Mspgcc-users mailing list
Mspgcc-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mspgcc-users

Reply via email to