Subversion Repositories Kolibri OS

Rev

Rev 5222 | 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