avr.h (progmem_section): Remove Declaration.

* config/avr/avr.h (progmem_section): Remove Declaration.
	* config/avr/avr.c (progmem_section): Make static and rename to
	progmem_swtable_section.
	(avr_output_addr_vec_elt): No need to switch sections.
	(avr_asm_init_sections): Use output_section_asm_op as section
	callback for progmem_swtable_section.
	(avr_output_progmem_section_asm_op): Remove Function.
	(TARGET_ASM_FUNCTION_RODATA_SECTION): New Define.
	(avr_asm_function_rodata_section): New static Function.
	* config/avr/elf.h (ASM_OUTPUT_BEFORE_CASE_LABEL): Output
	alignment 2**1 for jump tables.

From-SVN: r178525
This commit is contained in:
Georg-Johann Lay 2011-09-05 08:30:17 +00:00 committed by Georg-Johann Lay
parent c5ceeb8763
commit c149e48765
4 changed files with 101 additions and 22 deletions

View File

@ -1,3 +1,17 @@
2011-09-05 Georg-Johann Lay <avr@gjlay.de>
* config/avr/avr.h (progmem_section): Remove Declaration.
* config/avr/avr.c (progmem_section): Make static and rename to
progmem_swtable_section.
(avr_output_addr_vec_elt): No need to switch sections.
(avr_asm_init_sections): Use output_section_asm_op as section
callback for progmem_swtable_section.
(avr_output_progmem_section_asm_op): Remove Function.
(TARGET_ASM_FUNCTION_RODATA_SECTION): New Define.
(avr_asm_function_rodata_section): New static Function.
* config/avr/elf.h (ASM_OUTPUT_BEFORE_CASE_LABEL): Output
alignment 2**1 for jump tables.
2011-09-04 Jan Hubicka <jh@suse.cz> 2011-09-04 Jan Hubicka <jh@suse.cz>
* ipa-inline-analysis.c (set_cond_stmt_execution_predicate): Check that * ipa-inline-analysis.c (set_cond_stmt_execution_predicate): Check that

View File

@ -113,6 +113,7 @@ static void avr_function_arg_advance (cumulative_args_t, enum machine_mode,
static bool avr_function_ok_for_sibcall (tree, tree); static bool avr_function_ok_for_sibcall (tree, tree);
static void avr_asm_named_section (const char *name, unsigned int flags, tree decl); static void avr_asm_named_section (const char *name, unsigned int flags, tree decl);
static void avr_encode_section_info (tree, rtx, int); static void avr_encode_section_info (tree, rtx, int);
static section* avr_asm_function_rodata_section (tree);
/* Allocate registers from r25 to r8 for parameters for function calls. */ /* Allocate registers from r25 to r8 for parameters for function calls. */
#define FIRST_CUM_REG 26 #define FIRST_CUM_REG 26
@ -135,7 +136,8 @@ const struct base_arch_s *avr_current_arch;
/* Current device. */ /* Current device. */
const struct mcu_type_s *avr_current_device; const struct mcu_type_s *avr_current_device;
section *progmem_section; /* Section to put switch tables in. */
static GTY(()) section *progmem_swtable_section;
/* To track if code will use .bss and/or .data. */ /* To track if code will use .bss and/or .data. */
bool avr_need_clear_bss_p = false; bool avr_need_clear_bss_p = false;
@ -263,6 +265,8 @@ static const struct attribute_spec avr_attribute_table[] =
#undef TARGET_EXPAND_BUILTIN #undef TARGET_EXPAND_BUILTIN
#define TARGET_EXPAND_BUILTIN avr_expand_builtin #define TARGET_EXPAND_BUILTIN avr_expand_builtin
#undef TARGET_ASM_FUNCTION_RODATA_SECTION
#define TARGET_ASM_FUNCTION_RODATA_SECTION avr_asm_function_rodata_section
struct gcc_target targetm = TARGET_INITIALIZER; struct gcc_target targetm = TARGET_INITIALIZER;
@ -5036,18 +5040,6 @@ avr_insert_attributes (tree node, tree *attributes)
} }
} }
/* A get_unnamed_section callback for switching to progmem_section. */
static void
avr_output_progmem_section_asm_op (const void *arg ATTRIBUTE_UNUSED)
{
fprintf (asm_out_file,
"\t.section .progmem.gcc_sw_table, \"%s\", @progbits\n",
AVR_HAVE_JMP_CALL ? "a" : "ax");
/* Should already be aligned, this is just to be safe if it isn't. */
fprintf (asm_out_file, "\t.p2align 1\n");
}
/* Implement `ASM_OUTPUT_ALIGNED_DECL_LOCAL'. */ /* Implement `ASM_OUTPUT_ALIGNED_DECL_LOCAL'. */
/* Implement `ASM_OUTPUT_ALIGNED_DECL_COMMON'. */ /* Implement `ASM_OUTPUT_ALIGNED_DECL_COMMON'. */
@ -5098,9 +5090,23 @@ avr_output_bss_section_asm_op (const void *data)
static void static void
avr_asm_init_sections (void) avr_asm_init_sections (void)
{ {
progmem_section = get_unnamed_section (AVR_HAVE_JMP_CALL ? 0 : SECTION_CODE, /* Set up a section for jump tables. Alignment is handled by
avr_output_progmem_section_asm_op, ASM_OUTPUT_BEFORE_CASE_LABEL. */
NULL);
if (AVR_HAVE_JMP_CALL)
{
progmem_swtable_section
= get_unnamed_section (0, output_section_asm_op,
"\t.section\t.progmem.gcc_sw_table"
",\"a\",@progbits");
}
else
{
progmem_swtable_section
= get_unnamed_section (SECTION_CODE, output_section_asm_op,
"\t.section\t.progmem.gcc_sw_table"
",\"ax\",@progbits");
}
/* Override section callbacks to keep track of `avr_need_clear_bss_p' /* Override section callbacks to keep track of `avr_need_clear_bss_p'
resp. `avr_need_copy_data_p'. */ resp. `avr_need_copy_data_p'. */
@ -5111,6 +5117,69 @@ avr_asm_init_sections (void)
} }
/* Implement `TARGET_ASM_FUNCTION_RODATA_SECTION'. */
static section*
avr_asm_function_rodata_section (tree decl)
{
/* If a function is unused and optimized out by -ffunction-sections
and --gc-sections, ensure that the same will happen for its jump
tables by putting them into individual sections. */
unsigned int flags;
section * frodata;
/* Get the frodata section from the default function in varasm.c
but treat function-associated data-like jump tables as code
rather than as user defined data. AVR has no constant pools. */
{
int fdata = flag_data_sections;
flag_data_sections = flag_function_sections;
frodata = default_function_rodata_section (decl);
flag_data_sections = fdata;
flags = frodata->common.flags;
}
if (frodata != readonly_data_section
&& flags & SECTION_NAMED)
{
/* Adjust section flags and replace section name prefix. */
unsigned int i;
static const char* const prefix[] =
{
".rodata", ".progmem.gcc_sw_table",
".gnu.linkonce.r.", ".gnu.linkonce.t."
};
for (i = 0; i < sizeof (prefix) / sizeof (*prefix); i += 2)
{
const char * old_prefix = prefix[i];
const char * new_prefix = prefix[i+1];
const char * name = frodata->named.name;
if (STR_PREFIX_P (name, old_prefix))
{
char *rname = (char*) alloca (1 + strlen (name)
+ strlen (new_prefix)
- strlen (old_prefix));
strcat (stpcpy (rname, new_prefix), name + strlen (old_prefix));
flags &= ~SECTION_CODE;
flags |= AVR_HAVE_JMP_CALL ? 0 : SECTION_CODE;
return get_section (rname, flags, frodata->named.decl);
}
}
}
return progmem_swtable_section;
}
/* Implement `TARGET_ASM_NAMED_SECTION'. */ /* Implement `TARGET_ASM_NAMED_SECTION'. */
/* Track need of __do_clear_bss, __do_copy_data for named sections. */ /* Track need of __do_clear_bss, __do_copy_data for named sections. */
@ -6693,7 +6762,6 @@ avr_output_bld (rtx operands[], int bit_nr)
void void
avr_output_addr_vec_elt (FILE *stream, int value) avr_output_addr_vec_elt (FILE *stream, int value)
{ {
switch_to_section (progmem_section);
if (AVR_HAVE_JMP_CALL) if (AVR_HAVE_JMP_CALL)
fprintf (stream, "\t.word gs(.L%d)\n", value); fprintf (stream, "\t.word gs(.L%d)\n", value);
else else

View File

@ -127,10 +127,6 @@ extern const struct base_arch_s avr_arch_types[];
#define TARGET_CPU_CPP_BUILTINS() avr_cpu_cpp_builtins (pfile) #define TARGET_CPU_CPP_BUILTINS() avr_cpu_cpp_builtins (pfile)
#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS)
extern GTY(()) section *progmem_section;
#endif
#define AVR_HAVE_JMP_CALL (avr_current_arch->have_jmp_call && !TARGET_SHORT_CALLS) #define AVR_HAVE_JMP_CALL (avr_current_arch->have_jmp_call && !TARGET_SHORT_CALLS)
#define AVR_HAVE_MUL (avr_current_arch->have_mul) #define AVR_HAVE_MUL (avr_current_arch->have_mul)
#define AVR_HAVE_MOVW (avr_current_arch->have_movw_lpmx) #define AVR_HAVE_MOVW (avr_current_arch->have_movw_lpmx)

View File

@ -37,9 +37,10 @@
#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
avr_asm_declare_function_name ((FILE), (NAME), (DECL)) avr_asm_declare_function_name ((FILE), (NAME), (DECL))
/* Output alignment 2**1 for jump tables. */
#undef ASM_OUTPUT_BEFORE_CASE_LABEL #undef ASM_OUTPUT_BEFORE_CASE_LABEL
#define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE, PREFIX, NUM, TABLE) \ #define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE, PREFIX, NUM, TABLE) \
switch_to_section (progmem_section); fprintf (FILE, "\t.p2align\t1\n");
/* Be conservative in crtstuff.c. */ /* Be conservative in crtstuff.c. */
#undef INIT_SECTION_ASM_OP #undef INIT_SECTION_ASM_OP