X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gas%2Fconfig%2Ftc-tilepro.c;h=061a41a2346575dba84a1bdaae9974939ad50fcd;hb=d05584d3eeab4cb1c1d85d8dfdfef56827e03b3d;hp=581028df44c847cd47f4e90ee22b03557c2e4996;hpb=5414dbefeaf875f00cc29488bb54d2c30bf50c3b;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/config/tc-tilepro.c b/gas/config/tc-tilepro.c index 581028df44..061a41a234 100644 --- a/gas/config/tc-tilepro.c +++ b/gas/config/tc-tilepro.c @@ -1,5 +1,5 @@ /* tc-tilepro.c -- Assemble for a TILEPro chip. - Copyright 2011 Free Software Foundation, Inc. + Copyright (C) 2011-2016 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -72,7 +72,7 @@ struct option md_longopts[] = size_t md_longopts_size = sizeof (md_longopts); int -md_parse_option (int c, char *arg ATTRIBUTE_UNUSED) +md_parse_option (int c, const char *arg ATTRIBUTE_UNUSED) { switch (c) { @@ -103,14 +103,14 @@ md_show_usage (FILE *stream) /* Extra expression types. */ -#define O_lo16 O_md1 -#define O_hi16 O_md2 -#define O_ha16 O_md3 -#define O_got O_md4 +#define O_lo16 O_md1 +#define O_hi16 O_md2 +#define O_ha16 O_md3 +#define O_got O_md4 #define O_got_lo16 O_md5 #define O_got_hi16 O_md6 #define O_got_ha16 O_md7 -#define O_plt O_md8 +#define O_plt O_md8 #define O_tls_gd O_md9 #define O_tls_gd_lo16 O_md10 #define O_tls_gd_hi16 O_md11 @@ -119,6 +119,13 @@ md_show_usage (FILE *stream) #define O_tls_ie_lo16 O_md14 #define O_tls_ie_hi16 O_md15 #define O_tls_ie_ha16 O_md16 +#define O_tls_le O_md17 +#define O_tls_le_lo16 O_md18 +#define O_tls_le_hi16 O_md19 +#define O_tls_le_ha16 O_md20 +#define O_tls_gd_call O_md21 +#define O_tls_gd_add O_md22 +#define O_tls_ie_load O_md23 static struct hash_control *special_operator_hash; @@ -230,6 +237,13 @@ md_begin (void) INSERT_SPECIAL_OP(tls_ie_lo16); INSERT_SPECIAL_OP(tls_ie_hi16); INSERT_SPECIAL_OP(tls_ie_ha16); + INSERT_SPECIAL_OP(tls_le); + INSERT_SPECIAL_OP(tls_le_lo16); + INSERT_SPECIAL_OP(tls_le_hi16); + INSERT_SPECIAL_OP(tls_le_ha16); + INSERT_SPECIAL_OP(tls_gd_call); + INSERT_SPECIAL_OP(tls_gd_add); + INSERT_SPECIAL_OP(tls_ie_load); #undef INSERT_SPECIAL_OP /* Initialize op_hash hash table. */ @@ -338,7 +352,7 @@ static tilepro_bundle_bits insert_operand (tilepro_bundle_bits bits, const struct tilepro_operand *operand, int operand_value, - char *file, + const char *file, unsigned lineno) { /* Range-check the immediate. */ @@ -516,6 +530,26 @@ emit_tilepro_instruction (tilepro_bundle_bits bits, require_symbol = 1; break; + case O_tls_le: + HANDLE_OP16 (TLS_LE); + require_symbol = 1; + break; + + case O_tls_le_lo16: + HANDLE_OP16 (TLS_LE_LO); + require_symbol = 1; + break; + + case O_tls_le_hi16: + HANDLE_OP16 (TLS_LE_HI); + require_symbol = 1; + break; + + case O_tls_le_ha16: + HANDLE_OP16 (TLS_LE_HA); + require_symbol = 1; + break; + #undef HANDLE_OP16 case O_plt: @@ -532,6 +566,57 @@ emit_tilepro_instruction (tilepro_bundle_bits bits, require_symbol = 1; break; + case O_tls_gd_call: + switch (reloc) + { + case BFD_RELOC_TILEPRO_JOFFLONG_X1: + reloc = BFD_RELOC_TILEPRO_TLS_GD_CALL; + break; + default: + die = 1; + break; + } + use_subexp = 1; + require_symbol = 1; + break; + + case O_tls_gd_add: + switch (reloc) + { + case BFD_RELOC_TILEPRO_IMM8_X0: + reloc = BFD_RELOC_TILEPRO_IMM8_X0_TLS_GD_ADD; + break; + case BFD_RELOC_TILEPRO_IMM8_X1: + reloc = BFD_RELOC_TILEPRO_IMM8_X1_TLS_GD_ADD; + break; + case BFD_RELOC_TILEPRO_IMM8_Y0: + reloc = BFD_RELOC_TILEPRO_IMM8_Y0_TLS_GD_ADD; + break; + case BFD_RELOC_TILEPRO_IMM8_Y1: + reloc = BFD_RELOC_TILEPRO_IMM8_Y1_TLS_GD_ADD; + break; + default: + die = 1; + break; + } + use_subexp = 1; + require_symbol = 1; + break; + + case O_tls_ie_load: + switch (reloc) + { + case BFD_RELOC_TILEPRO_IMM8_X1: + reloc = BFD_RELOC_TILEPRO_TLS_IE_LOAD; + break; + default: + die = 1; + break; + } + use_subexp = 1; + require_symbol = 1; + break; + default: /* Do nothing. */ break; @@ -546,7 +631,8 @@ emit_tilepro_instruction (tilepro_bundle_bits bits, /* Now that we've changed the reloc, change ha16(x) into x, etc. */ - if (operand_exp->X_add_symbol->sy_value.X_md) + if (!operand_exp->X_add_symbol->sy_flags.sy_local_symbol + && operand_exp->X_add_symbol->sy_value.X_md) { /* HACK: We used X_md to mark this symbol as a fake wrapper around a real expression. To unwrap it, we just grab its @@ -894,8 +980,8 @@ parse_reg_expression (expressionS* expression) /* Zero everything to make sure we don't miss any flags. */ memset (expression, 0, sizeof *expression); - char* regname = input_line_pointer; - char terminating_char = get_symbol_end (); + char *regname; + char terminating_char = get_symbol_name (®name); void* pval = hash_find (main_reg_hash, regname); @@ -912,7 +998,7 @@ parse_reg_expression (expressionS* expression) regname, tilepro_register_names[regno]); /* Restore the old character following the register name. */ - *input_line_pointer = terminating_char; + (void) restore_line_pointer (terminating_char); /* Fill in the expression fields to indicate it's a register. */ expression->X_op = O_register; @@ -1119,7 +1205,7 @@ const pseudo_typeS md_pseudo_table[] = LITTLENUMS emitted is stored in *SIZEP. An error message is returned, or NULL on OK. */ -char * +const char * md_atof (int type, char *litP, int *sizeP) { int prec; @@ -1298,22 +1384,36 @@ md_apply_fix (fixS *fixP, valueT * valP, segT seg ATTRIBUTE_UNUSED) #ifdef OBJ_ELF switch (fixP->fx_r_type) { + case BFD_RELOC_TILEPRO_IMM8_X0_TLS_GD_ADD: + case BFD_RELOC_TILEPRO_IMM8_X1_TLS_GD_ADD: + case BFD_RELOC_TILEPRO_IMM8_Y0_TLS_GD_ADD: + case BFD_RELOC_TILEPRO_IMM8_Y1_TLS_GD_ADD: case BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD: case BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD: - case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE: - case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE: case BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_LO: case BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_LO: - case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_LO: - case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_LO: case BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HI: case BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HI: - case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HI: - case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HI: case BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HA: case BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HA: + case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE: + case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE: + case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_LO: + case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_LO: + case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HI: + case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HI: case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HA: case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HA: + case BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE: + case BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE: + case BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_LO: + case BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_LO: + case BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HI: + case BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HI: + case BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HA: + case BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HA: + case BFD_RELOC_TILEPRO_TLS_GD_CALL: + case BFD_RELOC_TILEPRO_TLS_IE_LOAD: case BFD_RELOC_TILEPRO_TLS_DTPMOD32: case BFD_RELOC_TILEPRO_TLS_DTPOFF32: case BFD_RELOC_TILEPRO_TLS_TPOFF32: @@ -1415,8 +1515,8 @@ tc_gen_reloc (asection *sec ATTRIBUTE_UNUSED, fixS *fixp) { arelent *reloc; - reloc = (arelent *) xmalloc (sizeof (arelent)); - reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); + reloc = XNEW (arelent); + reloc->sym_ptr_ptr = XNEW (asymbol *); *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;