diff options
author | Bob Wilson <bob.wilson@acm.org> | 2008-01-18 19:13:48 +0000 |
---|---|---|
committer | Bob Wilson <bob.wilson@acm.org> | 2008-01-18 19:13:48 +0000 |
commit | fb227da0a19515cbecb2b035ad8e246dd53f64a2 (patch) | |
tree | c75f8dfeb56ca901bf2aa940d3932a47a34ff3ce /gas/config/tc-xtensa.c | |
parent | 32c9a7957208ebe4d7a833cecbf552f3f852e733 (diff) | |
download | gdb-fb227da0a19515cbecb2b035ad8e246dd53f64a2.zip gdb-fb227da0a19515cbecb2b035ad8e246dd53f64a2.tar.gz gdb-fb227da0a19515cbecb2b035ad8e246dd53f64a2.tar.bz2 |
* config/tc-xtensa.c (xtensa_leb128): New function.
(md_pseudo_table): Use it for sleb128 and uleb128.
(is_leb128_expr): New internal flag.
(xtensa_symbol_new_hook): Check new flag.
Diffstat (limited to 'gas/config/tc-xtensa.c')
-rw-r--r-- | gas/config/tc-xtensa.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/gas/config/tc-xtensa.c b/gas/config/tc-xtensa.c index ab4578b..f18abd7 100644 --- a/gas/config/tc-xtensa.c +++ b/gas/config/tc-xtensa.c @@ -1,5 +1,5 @@ /* tc-xtensa.c -- Assemble Xtensa instructions. - Copyright 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. + Copyright 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -442,6 +442,7 @@ static void xtensa_literal_position (int); static void xtensa_literal_pseudo (int); static void xtensa_frequency_pseudo (int); static void xtensa_elf_cons (int); +static void xtensa_leb128 (int); /* Parsing and Idiom Translation. */ @@ -1004,6 +1005,8 @@ const pseudo_typeS md_pseudo_table[] = { "4byte", xtensa_elf_cons, 4 }, { "short", xtensa_elf_cons, 2 }, { "2byte", xtensa_elf_cons, 2 }, + { "sleb128", xtensa_leb128, 1}, + { "uleb128", xtensa_leb128, 0}, { "begin", xtensa_begin_directive, 0 }, { "end", xtensa_end_directive, 0 }, { "literal", xtensa_literal_pseudo, 0 }, @@ -1569,6 +1572,16 @@ xtensa_elf_cons (int nbytes) demand_empty_rest_of_line (); } +static bfd_boolean is_leb128_expr; + +static void +xtensa_leb128 (int sign) +{ + is_leb128_expr = TRUE; + s_leb128 (sign); + is_leb128_expr = FALSE; +} + /* Parsing and Idiom Translation. */ @@ -5635,7 +5648,7 @@ symbolS *expr_symbols = NULL; void xtensa_symbol_new_hook (symbolS *sym) { - if (S_GET_SEGMENT (sym) == expr_section) + if (is_leb128_expr && S_GET_SEGMENT (sym) == expr_section) { symbol_get_tc (sym)->next_expr_symbol = expr_symbols; expr_symbols = sym; @@ -7256,10 +7269,11 @@ xtensa_mark_zcl_first_insns (void) } -/* Some difference-of-symbols expressions make it out to the linker. Some - don't. If one does, then the linker can optimize between the two labels. - If it doesn't, then the linker shouldn't. */ - +/* When a difference-of-symbols expression is encoded as a uleb128 or + sleb128 value, the linker is unable to adjust that value to account for + link-time relaxation. Mark all the code between such symbols so that + its size cannot be changed by linker relaxation. */ + static void xtensa_mark_difference_of_two_symbols (void) { |