diff options
Diffstat (limited to 'gcc/config/nds32/nds32.c')
-rw-r--r-- | gcc/config/nds32/nds32.c | 52 |
1 files changed, 42 insertions, 10 deletions
diff --git a/gcc/config/nds32/nds32.c b/gcc/config/nds32/nds32.c index 1afd8a10156..a0b6443e5d2 100644 --- a/gcc/config/nds32/nds32.c +++ b/gcc/config/nds32/nds32.c @@ -1698,6 +1698,9 @@ nds32_conditional_register_usage (void) { int regno; + if (TARGET_LINUX_ABI) + fixed_regs[TP_REGNUM] = 1; + if (TARGET_HARD_FLOAT) { for (regno = NDS32_FIRST_FPR_REGNUM; @@ -3120,21 +3123,30 @@ nds32_asm_file_start (void) fprintf (asm_out_file, "\t! This asm file is generated by compiler\n"); fprintf (asm_out_file, "\t.flag\tverbatim\n"); - if (TARGET_ICT_MODEL_LARGE) - fprintf (asm_out_file, "\t.ict_model\tlarge\n"); - else - fprintf (asm_out_file, "\t.ict_model\tsmall\n"); - /* Give assembler the size of each vector for interrupt handler. */ - fprintf (asm_out_file, "\t! This vector size directive is required " - "for checking inconsistency on interrupt handler\n"); - fprintf (asm_out_file, "\t.vec_size\t%d\n", nds32_isr_vector_size); + /* Insert directive for linker to distinguish object's ict flag. */ + if (!TARGET_LINUX_ABI) + { + if (TARGET_ICT_MODEL_LARGE) + fprintf (asm_out_file, "\t.ict_model\tlarge\n"); + else + fprintf (asm_out_file, "\t.ict_model\tsmall\n"); + } + + /* We need to provide the size of each vector for interrupt handler + under elf toolchain. */ + if (!TARGET_LINUX_ABI) + { + fprintf (asm_out_file, "\t! This vector size directive is required " + "for checking inconsistency on interrupt handler\n"); + fprintf (asm_out_file, "\t.vec_size\t%d\n", nds32_isr_vector_size); + } /* If user enables '-mforce-fp-as-gp' or compiles programs with -Os, the compiler may produce 'la $fp,_FP_BASE_' instruction at prologue for fp-as-gp optimization. We should emit weak reference of _FP_BASE_ to avoid undefined reference in case user does not pass '--relax' option to linker. */ - if (TARGET_FORCE_FP_AS_GP || optimize_size) + if (!TARGET_LINUX_ABI && (TARGET_FORCE_FP_AS_GP || optimize_size)) { fprintf (asm_out_file, "\t! This weak reference is required to do " "fp-as-gp link time optimization\n"); @@ -3270,6 +3282,11 @@ nds32_asm_file_end (void) { nds32_asm_file_end_for_isr (); + /* The NDS32 Linux stack is mapped non-executable by default, so add a + .note.GNU-stack section. */ + if (TARGET_LINUX_ABI) + file_end_indicate_exec_stack (); + fprintf (asm_out_file, "\t! ------------------------------------\n"); } @@ -3497,7 +3514,7 @@ nds32_print_operand (FILE *stream, rtx x, int code) case SYMBOL_REF: output_addr_const (stream, x); - if (nds32_indirect_call_referenced_p (x)) + if (!TARGET_LINUX_ABI && nds32_indirect_call_referenced_p (x)) fprintf (stream, "@ICT"); break; @@ -3912,6 +3929,9 @@ nds32_insert_attributes (tree decl, tree *attributes) { tree new_attrs = *attributes; + if (TARGET_LINUX_ABI) + error("cannot use indirect_call attribute under linux toolchain"); + if (lookup_attribute ("noinline", new_attrs) == NULL) new_attrs = tree_cons (get_identifier ("noinline"), NULL, new_attrs); if (lookup_attribute ("noclone", new_attrs) == NULL) @@ -4166,6 +4186,13 @@ nds32_expand_builtin (tree exp, return nds32_expand_builtin_impl (exp, target, subtarget, mode, ignore); } +/* Implement TARGET_INIT_LIBFUNCS. */ +static void +nds32_init_libfuncs (void) +{ + if (TARGET_LINUX_ABI) + init_sync_libfuncs (UNITS_PER_WORD); +} /* ------------------------------------------------------------------------ */ @@ -5758,6 +5785,9 @@ nds32_use_blocks_for_constant_p (machine_mode mode, /* Emulating TLS. */ +#undef TARGET_HAVE_TLS +#define TARGET_HAVE_TLS TARGET_LINUX_ABI + /* Defining coprocessor specifics for MIPS targets. */ @@ -5785,6 +5815,8 @@ nds32_use_blocks_for_constant_p (machine_mode mode, #undef TARGET_EXPAND_BUILTIN #define TARGET_EXPAND_BUILTIN nds32_expand_builtin +#undef TARGET_INIT_LIBFUNCS +#define TARGET_INIT_LIBFUNCS nds32_init_libfuncs #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P #define TARGET_USE_BLOCKS_FOR_CONSTANT_P nds32_use_blocks_for_constant_p |