Rev 5222 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5222 | Rev 6324 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | /* seh pdata/xdata coff object file format |
1 | /* seh pdata/xdata coff object file format |
2 | Copyright 2009, 2010 |
- | |
3 | Free Software Foundation, Inc. |
2 | Copyright (C) 2009-2015 Free Software Foundation, Inc. |
Line 4... | Line 3... | ||
4 | 3 | ||
Line 5... | Line 4... | ||
5 | This file is part of GAS. |
4 | This file is part of GAS. |
6 | 5 | ||
Line 168... | Line 167... | ||
168 | directive, nseg_name, cseg_name); |
167 | directive, nseg_name, cseg_name); |
169 | ignore_rest_of_line (); |
168 | ignore_rest_of_line (); |
170 | return 0; |
169 | return 0; |
171 | } |
170 | } |
Line -... | Line 171... | ||
- | 171 | ||
- | 172 | /* Switch back to the code section, whatever that may be. */ |
|
- | 173 | static void |
|
- | 174 | obj_coff_seh_code (int ignored ATTRIBUTE_UNUSED) |
|
- | 175 | { |
|
- | 176 | subseg_set (seh_ctx_cur->code_seg, 0); |
|
- | 177 | } |
|
172 | 178 | ||
173 | static void |
179 | static void |
174 | switch_xdata (int subseg, segT code_seg) |
180 | switch_xdata (int subseg, segT code_seg) |
175 | { |
181 | { |
Line 321... | Line 327... | ||
321 | 327 | ||
Line 322... | Line 328... | ||
322 | SKIP_WHITESPACE (); |
328 | SKIP_WHITESPACE (); |
323 | 329 | ||
324 | if (*input_line_pointer == '@') |
- | |
325 | { |
330 | if (*input_line_pointer == '@') |
Line 326... | Line 331... | ||
326 | symbol_name = input_line_pointer; |
331 | { |
327 | name_end = get_symbol_end (); |
332 | name_end = get_symbol_name (&symbol_name); |
Line 328... | Line 333... | ||
328 | 333 | ||
Line 335... | Line 340... | ||
335 | else if (strcasecmp (symbol_name, "@1") == 0) |
340 | else if (strcasecmp (symbol_name, "@1") == 0) |
336 | seh_ctx_cur->handler.X_add_number = 1; |
341 | seh_ctx_cur->handler.X_add_number = 1; |
337 | else |
342 | else |
338 | as_bad (_("unknown constant value '%s' for handler"), symbol_name); |
343 | as_bad (_("unknown constant value '%s' for handler"), symbol_name); |
Line 339... | Line 344... | ||
339 | 344 | ||
340 | *input_line_pointer = name_end; |
345 | (void) restore_line_pointer (name_end); |
341 | } |
346 | } |
342 | else |
347 | else |
Line 343... | Line 348... | ||
343 | expression (&seh_ctx_cur->handler); |
348 | expression (&seh_ctx_cur->handler); |
Line 351... | Line 356... | ||
351 | 356 | ||
352 | if (seh_get_target_kind () == seh_kind_x64) |
357 | if (seh_get_target_kind () == seh_kind_x64) |
353 | { |
358 | { |
354 | do |
359 | do |
355 | { |
- | |
356 | symbol_name = input_line_pointer; |
360 | { |
Line 357... | Line 361... | ||
357 | name_end = get_symbol_end (); |
361 | name_end = get_symbol_name (&symbol_name); |
358 | 362 | ||
359 | if (strcasecmp (symbol_name, "@unwind") == 0) |
363 | if (strcasecmp (symbol_name, "@unwind") == 0) |
360 | seh_ctx_cur->handler_flags |= UNW_FLAG_UHANDLER; |
364 | seh_ctx_cur->handler_flags |= UNW_FLAG_UHANDLER; |
361 | else if (strcasecmp (symbol_name, "@except") == 0) |
365 | else if (strcasecmp (symbol_name, "@except") == 0) |
362 | seh_ctx_cur->handler_flags |= UNW_FLAG_EHANDLER; |
366 | seh_ctx_cur->handler_flags |= UNW_FLAG_EHANDLER; |
Line 363... | Line 367... | ||
363 | else |
367 | else |
364 | as_bad (_(".seh_handler constant '%s' unknown"), symbol_name); |
368 | as_bad (_(".seh_handler constant '%s' unknown"), symbol_name); |
365 | 369 | ||
366 | *input_line_pointer = name_end; |
370 | (void) restore_line_pointer (name_end); |
367 | } |
371 | } |
368 | while (skip_whitespace_and_comma (0)); |
372 | while (skip_whitespace_and_comma (0)); |
Line 446... | Line 450... | ||
446 | x_segcur->subseg += 2; |
450 | x_segcur->subseg += 2; |
447 | } |
451 | } |
Line 448... | Line 452... | ||
448 | 452 | ||
Line 449... | Line -... | ||
449 | SKIP_WHITESPACE (); |
- | |
450 | 453 | SKIP_WHITESPACE (); |
|
451 | symbol_name = input_line_pointer; |
454 | |
452 | name_end = get_symbol_end (); |
455 | name_end = get_symbol_name (&symbol_name); |
Line 453... | Line 456... | ||
453 | seh_ctx_cur->func_name = xstrdup (symbol_name); |
456 | seh_ctx_cur->func_name = xstrdup (symbol_name); |
Line 454... | Line 457... | ||
454 | *input_line_pointer = name_end; |
457 | (void) restore_line_pointer (name_end); |
455 | 458 | ||
Line 541... | Line 544... | ||
541 | } |
544 | } |
Line 542... | Line 545... | ||
542 | 545 | ||
543 | SKIP_WHITESPACE (); |
546 | SKIP_WHITESPACE (); |
544 | if (*input_line_pointer == '%') |
547 | if (*input_line_pointer == '%') |
545 | ++input_line_pointer; |
- | |
546 | symbol_name = input_line_pointer; |
548 | ++input_line_pointer; |
Line 547... | Line 549... | ||
547 | name_end = get_symbol_end (); |
549 | name_end = get_symbol_name (& symbol_name); |
548 | 550 | ||
549 | for (i = 0; i < 16; i++) |
551 | for (i = 0; i < 16; i++) |
Line 550... | Line 552... | ||
550 | if (! strcasecmp (regs[i], symbol_name)) |
552 | if (! strcasecmp (regs[i], symbol_name)) |
Line 551... | Line 553... | ||
551 | break; |
553 | break; |
552 | 554 | ||
553 | *input_line_pointer = name_end; |
555 | (void) restore_line_pointer (name_end); |
554 | 556 |