-
-/* A C statement or statements to switch to the appropriate
- section for output of DECL. DECL is either a `VAR_DECL' node
- or a constant of some sort. RELOC indicates whether forming
- the initial value of DECL requires link-time relocations.
-
- Set SECNUM to:
- 0 .text
- 1 .rodata
- 2 .data
- 3 .sdata
- 4 .bss
- 5 .sbss
-*/
-
-#define DO_SELECT_SECTION(SECNUM, DECL, RELOC) \
- do \
- { \
- HOST_WIDE_INT size; \
- SECNUM = 1; \
- if (TREE_CODE (DECL) == FUNCTION_DECL) \
- { \
- SECNUM = 0; \
- break; \
- } \
- else if (TREE_CODE (DECL) == STRING_CST) \
- { \
- if (flag_writable_strings) \
- SECNUM = 2; \
- else \
- SECNUM = 0x101; \
- break; \
- } \
- else if (TREE_CODE (DECL) == VAR_DECL) \
- { \
- if (DECL_INITIAL (DECL) == NULL \
- || DECL_INITIAL (DECL) == error_mark_node) \
- SECNUM = 4; \
- else if ((flag_pic && RELOC) \
- || ! TREE_READONLY (DECL) \
- || TREE_SIDE_EFFECTS (DECL) \
- || ! TREE_CONSTANT (DECL_INITIAL (DECL))) \
- SECNUM = 2; \
- else if (flag_merge_constants >= 2) \
- { \
- /* C and C++ don't allow different variables to \
- share the same location. -fmerge-all-constants\
- allows even that (at the expense of not \
- conforming). */ \
- if (TREE_CODE (DECL_INITIAL (DECL)) == STRING_CST)\
- SECNUM = 0x201; \
- else \
- SECNUM = 0x301; \
- } \
- } \
- else if (TREE_CODE (DECL) == CONSTRUCTOR) \
- { \
- if ((flag_pic && RELOC) \
- || TREE_SIDE_EFFECTS (DECL) \
- || ! TREE_CONSTANT (DECL)) \
- SECNUM = 2; \
- } \
- \
- /* Select small data sections based on size. */ \
- size = int_size_in_bytes (TREE_TYPE (DECL)); \
- if (size >= 0 && size <= g_switch_value) \
- { \
- if ((SECNUM & 0xff) >= 2) \
- SECNUM += 1; \
- /* Move readonly data to .sdata only if -msmall-data. */ \
- /* ??? Consider .sdata.{lit4,lit8} as \
- SHF_MERGE|SHF_ALPHA_GPREL. */ \
- else if (TARGET_SMALL_DATA) \
- SECNUM = 3; \
- } \
- } \
- while (0)
-
-#undef SELECT_SECTION
-#define SELECT_SECTION(DECL, RELOC, ALIGN) \
- do \
- { \
- typedef void (*sec_fn) PARAMS ((void)); \
- static sec_fn const sec_functions[6] = \
- { \
- text_section, \
- const_section, \
- data_section, \
- sdata_section, \
- bss_section, \
- sbss_section \
- }; \
- \
- int sec; \
- \
- DO_SELECT_SECTION (sec, DECL, RELOC); \
- \
- switch (sec) \
- { \
- case 0x101: \
- mergeable_string_section (DECL, ALIGN, 0); \
- break; \
- case 0x201: \
- mergeable_string_section (DECL_INITIAL (DECL),\
- ALIGN, 0); \
- break; \
- case 0x301: \
- mergeable_constant_section (DECL_MODE (DECL), \
- ALIGN, 0); \
- break; \
- default: \
- (*sec_functions[sec]) (); \
- break; \
- } \
- } \
- while (0)