diff -rupN gcc/config/arm/aout.h gcc.patched/config/arm/aout.h --- gcc/config/arm/aout.h 2014-10-06 07:27:20.000000000 +0100 +++ gcc.patched/config/arm/aout.h 2015-01-08 17:28:38.995786310 +0000 @@ -31,9 +31,13 @@ #endif /* Switch to the text or data segment. */ -#define TEXT_SECTION_ASM_OP "\t.text" -#define DATA_SECTION_ASM_OP "\t.data" -#define BSS_SECTION_ASM_OP "\t.bss" +#define TEXT_SECTION_ASM_OP arm_text_section +#define DATA_SECTION_ASM_OP arm_data_section +#undef READONLY_DATA_SECTION_ASM_OP +#define READONLY_DATA_SECTION_ASM_OP arm_readonly_data_section +#define BSS_SECTION_ASM_OP arm_bss_section +#undef TARGET_ASM_NAMED_SECTION +#define TARGET_ASM_NAMED_SECTION arm_asm_named_section /* Note: If USER_LABEL_PREFIX or LOCAL_LABEL_PREFIX are changed, make sure that this change is reflected in the function diff -rupN gcc/config/arm/arm.c gcc.patched/config/arm/arm.c --- gcc/config/arm/arm.c 2014-11-19 17:14:41.000000000 +0000 +++ gcc.patched/config/arm/arm.c 2015-01-08 17:31:00.538124457 +0000 @@ -1849,6 +1849,11 @@ arm_constant_limit (bool size_p) return size_p ? 1 : current_tune->constant_limit; } +const char *arm_text_section = "\t" ARM_DEFAULT_TEXT_SECTION_NAME; +const char *arm_data_section = "\t" ARM_DEFAULT_DATA_SECTION_NAME; +const char *arm_readonly_data_section = "\t.section " ARM_DEFAULT_READONLY_DATA_SECTION_NAME; +const char *arm_bss_section = "\t" ARM_DEFAULT_BSS_SECTION_NAME; + /* Emit an insn that's a simple single-set. Both the operands must be known to be valid. */ inline static rtx @@ -2784,6 +2789,35 @@ arm_option_override (void) flag_reorder_blocks = 1; } + if (strcmp(arm_text_string, ARM_DEFAULT_TEXT_SECTION_NAME)) + { + #define ARM_TEXT_SECTION_FORMAT "\t.section\t%s,\"ax\",%%progbits\n" + char *tmp = XNEWVEC (char, strlen (arm_text_string) + sizeof (ARM_TEXT_SECTION_FORMAT) + 1); + sprintf (tmp, ARM_TEXT_SECTION_FORMAT, arm_text_string); + arm_text_section = tmp; + } + if (strcmp(arm_data_string, ARM_DEFAULT_DATA_SECTION_NAME)) + { + #define ARM_DATA_SECTION_FORMAT "\t.section\t%s,\"aw\",%%progbits\n" + char *tmp = XNEWVEC (char, strlen (arm_data_string) + sizeof (ARM_DATA_SECTION_FORMAT) + 1); + sprintf (tmp, ARM_DATA_SECTION_FORMAT, arm_data_string); + arm_data_section = tmp; + } + if (strcmp(arm_readonly_data_string, ARM_DEFAULT_READONLY_DATA_SECTION_NAME)) + { + #define ARM_READONLY_DATA_SECTION_FORMAT "\t.section\t%s,\"a\",%%progbits\n" + char *tmp = XNEWVEC (char, strlen (arm_data_string) + sizeof (ARM_READONLY_DATA_SECTION_FORMAT) + 1); + sprintf (tmp, ARM_READONLY_DATA_SECTION_FORMAT, arm_readonly_data_string); + arm_readonly_data_section = tmp; + } + if (strcmp(arm_bss_string, ARM_DEFAULT_BSS_SECTION_NAME)) + { + #define ARM_BSS_SECTION_FORMAT "\t.section\t%s,\"aw\",%%nobits\n" + char *tmp = XNEWVEC (char, strlen (arm_bss_string) + sizeof (ARM_BSS_SECTION_FORMAT) + 1); + sprintf (tmp, ARM_BSS_SECTION_FORMAT, arm_bss_string); + arm_bss_section = tmp; + } + if (flag_pic) /* Hoisting PIC address calculations more aggressively provides a small, but measurable, size reduction for PIC code. Therefore, we decrease @@ -2864,6 +2898,32 @@ arm_option_override (void) arm_add_gc_roots (); } +void arm_asm_named_section (const char *name, unsigned int flags, tree t) +{ + char local[1024]; + if (strstr(name, ARM_DEFAULT_TEXT_SECTION_NAME)==name) + { + sprintf(local, "%s%s", arm_text_string, name+sizeof(ARM_DEFAULT_TEXT_SECTION_NAME)-1); + name = local; + } + else if (strstr(name, ARM_DEFAULT_DATA_SECTION_NAME)==name) + { + sprintf(local, "%s%s", arm_data_string, name+sizeof(ARM_DEFAULT_DATA_SECTION_NAME)-1); + name = local; + } + else if (strstr(name, ARM_DEFAULT_BSS_SECTION_NAME)==name) + { + sprintf(local, "%s%s", arm_bss_string, name+sizeof(ARM_DEFAULT_BSS_SECTION_NAME)-1); + name = local; + } + else if (strstr(name, ARM_DEFAULT_READONLY_DATA_SECTION_NAME)==name) + { + sprintf(local, "%s%s", arm_readonly_data_string, name+sizeof(ARM_DEFAULT_READONLY_DATA_SECTION_NAME)-1); + name = local; + } + default_elf_asm_named_section(name, flags, t); +} + static void arm_add_gc_roots (void) { diff -rupN gcc/config/arm/arm.h gcc.patched/config/arm/arm.h --- gcc/config/arm/arm.h 2014-11-19 17:14:41.000000000 +0000 +++ gcc.patched/config/arm/arm.h 2015-01-08 17:34:20.869433237 +0000 @@ -1869,6 +1869,17 @@ enum arm_auto_incmodes if (TARGET_THUMB2) \ thumb2_asm_output_opcode (STREAM); +#define ARM_DEFAULT_TEXT_SECTION_NAME ".text" +#define ARM_DEFAULT_DATA_SECTION_NAME ".data" +#define ARM_DEFAULT_READONLY_DATA_SECTION_NAME ".rodata" +#define ARM_DEFAULT_BSS_SECTION_NAME ".bss" + +extern const char *arm_text_section; +extern const char *arm_data_section; +extern const char *arm_readonly_data_section; +extern const char *arm_bss_section; +void arm_asm_named_section (const char *name, unsigned int flags, tree t); + /* The EABI specifies that constructors should go in .init_array. Other targets use .ctors for compatibility. */ #ifndef ARM_EABI_CTORS_SECTION_OP diff -rupN gcc/config/arm/arm.opt gcc.patched/config/arm/arm.opt --- gcc/config/arm/arm.opt 2014-10-06 07:27:20.000000000 +0100 +++ gcc.patched/config/arm/arm.opt 2015-01-08 17:39:10.254214310 +0000 @@ -268,6 +268,22 @@ munaligned-access Target Report Var(unaligned_access) Init(2) Enable unaligned word and halfword accesses to packed data. +mtext= +Target RejectNegative Joined Var(arm_text_string) Init(ARM_DEFAULT_TEXT_SECTION_NAME) +-mtext=SECTION Put functions in SECTION + +mdata= +Target RejectNegative Joined Var(arm_data_string) Init(ARM_DEFAULT_DATA_SECTION_NAME) +-mdata=SECTION Put data in SECTION + +mrodata= +Target RejectNegative Joined Var(arm_readonly_data_string) Init(ARM_DEFAULT_READONLY_DATA_SECTION_NAME) +-mrodata=SECTION Put read-only data in SECTION + +mbss= +Target RejectNegative Joined Var(arm_bss_string) Init(ARM_DEFAULT_BSS_SECTION_NAME) +-mbss=SECTION Put zeroed data in SECTION + mneon-for-64bits Target Report RejectNegative Var(use_neon_for_64bits) Init(0) Use Neon to perform 64-bits operations rather than core registers. diff -rupN gcc/dwarf2out.c gcc.patched/dwarf2out.c --- gcc/dwarf2out.c 2014-11-19 17:14:41.000000000 +0000 +++ gcc.patched/dwarf2out.c 2015-02-27 10:36:47.125038735 +0000 @@ -21495,7 +21495,7 @@ dwarf2out_source_line (unsigned int line unsigned int file_num; dw_line_info_table *table; - if (debug_info_level < DINFO_LEVEL_TERSE || line == 0) + if (debug_info_level < DINFO_LEVEL_NORMAL || line == 0) return; /* The discriminator column was added in dwarf4. Simplify the below @@ -24192,7 +24192,7 @@ dwarf2out_finish (const char *filename) } } - if (debug_info_level >= DINFO_LEVEL_TERSE) + if (debug_info_level >= DINFO_LEVEL_NORMAL) add_AT_lineptr (main_comp_unit_die, DW_AT_stmt_list, debug_line_section_label);