mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2024-12-11 06:04:12 +00:00
ChangeLog gas
2010-09-15 Kai Tietz <kai.tietz@onevision.com> * config/obj-coff-seh.h (seh_context): New member code_seg. * config/obj-coff-seh.c: Implementing xdata/pdata section cloning for link-once code-segment. ChangeLog ld 2010-09-15 Kai Tietz <kai.tietz@onevision.com> * scripttempl/pep.sc: Add .xdata segment and put into .pdata all segments beginning with .pdata. ChangeLog gas/testsuite 2010-09-15 Kai Tietz <kai.tietz@onevision.com> * gas/pe/pe.exp: Add peseh-x64-4,5,6 tests. * gas/pe/peseh-x64-4.s: New. * gas/pe/peseh-x64-4.d: New. * gas/pe/peseh-x64-5.d: New. * gas/pe/peseh-x64-6.d: New.
This commit is contained in:
parent
c1b6b909c5
commit
2d7f492901
@ -1,3 +1,9 @@
|
||||
2010-09-15 Kai Tietz <kai.tietz@onevision.com>
|
||||
|
||||
* config/obj-coff-seh.h (seh_context): New member code_seg.
|
||||
* config/obj-coff-seh.c: Implementing xdata/pdata section cloning
|
||||
for link-once code-segment.
|
||||
|
||||
2010-09-14 Jie Zhang <jie@codesourcery.com>
|
||||
|
||||
* doc/c-arm.texi: Document -mcpu=cortex-m4.
|
||||
|
@ -22,42 +22,153 @@
|
||||
#include "obj-coff-seh.h"
|
||||
|
||||
|
||||
/* Private segment collection list. */
|
||||
struct seh_seg_list {
|
||||
segT seg;
|
||||
int subseg;
|
||||
char *seg_name;
|
||||
};
|
||||
|
||||
/* Local data. */
|
||||
static seh_context *seh_ctx_cur = NULL;
|
||||
|
||||
static segT xdata_seg;
|
||||
static segT pdata_seg;
|
||||
static int xdata_subseg;
|
||||
static struct hash_control *seh_hash;
|
||||
|
||||
static struct seh_seg_list *x_segcur = NULL;
|
||||
static struct seh_seg_list *p_segcur = NULL;
|
||||
|
||||
static void write_function_xdata (seh_context *);
|
||||
static void write_function_pdata (seh_context *);
|
||||
|
||||
|
||||
static void
|
||||
switch_xdata (int subseg)
|
||||
/* Build based on segment the derived .pdata/.xdata
|
||||
segment name containing origin segment's postfix name part. */
|
||||
static char *
|
||||
get_pxdata_name (segT seg, const char *base_name)
|
||||
{
|
||||
if (xdata_seg == NULL)
|
||||
{
|
||||
xdata_seg = subseg_new (".xdata", 0);
|
||||
bfd_set_section_flags (stdoutput, xdata_seg,
|
||||
((SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA)
|
||||
& bfd_applicable_section_flags (stdoutput)));
|
||||
}
|
||||
subseg_set (xdata_seg, subseg);
|
||||
const char *name,*dollar, *dot;
|
||||
char *sname;
|
||||
|
||||
name = bfd_get_section_name (stdoutput, seg);
|
||||
|
||||
dollar = strchr (name, '$');
|
||||
dot = strchr (name + 1, '.');
|
||||
|
||||
if (!dollar && !dot)
|
||||
name = "";
|
||||
else if (!dollar)
|
||||
name = dot;
|
||||
else if (!dot)
|
||||
name = dollar;
|
||||
else if (dot < dollar)
|
||||
name = dot;
|
||||
else
|
||||
name = dollar;
|
||||
|
||||
sname = concat (base_name, name, NULL);
|
||||
|
||||
return sname;
|
||||
}
|
||||
|
||||
/* Allocate a seh_seg_list structure. */
|
||||
static struct seh_seg_list *
|
||||
alloc_pxdata_item (segT seg, int subseg, char *name)
|
||||
{
|
||||
struct seh_seg_list *r;
|
||||
|
||||
r = (struct seh_seg_list *)
|
||||
xmalloc (sizeof (struct seh_seg_list) + strlen (name));
|
||||
r->seg = seg;
|
||||
r->subseg = subseg;
|
||||
r->seg_name = name;
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Generate pdata/xdata segment with same linkonce properties
|
||||
of based segment. */
|
||||
static segT
|
||||
make_pxdata_seg (segT cseg, char *name)
|
||||
{
|
||||
segT save_seg = now_seg;
|
||||
int save_subseg = now_subseg;
|
||||
segT r;
|
||||
flagword flags;
|
||||
|
||||
r = subseg_new (name, 0);
|
||||
/* Check if code segment is marked as linked once. */
|
||||
flags = bfd_get_section_flags (stdoutput, cseg)
|
||||
& (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD
|
||||
| SEC_LINK_DUPLICATES_ONE_ONLY | SEC_LINK_DUPLICATES_SAME_SIZE
|
||||
| SEC_LINK_DUPLICATES_SAME_CONTENTS);
|
||||
|
||||
/* Add standard section flags. */
|
||||
flags |= SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA;
|
||||
|
||||
/* Apply possibly linked once flags to new generated segment, too. */
|
||||
if (!bfd_set_section_flags (stdoutput, r, flags))
|
||||
as_bad (_("bfd_set_section_flags: %s"),
|
||||
bfd_errmsg (bfd_get_error ()));
|
||||
|
||||
/* Restore to previous segment. */
|
||||
subseg_set (save_seg, save_subseg);
|
||||
return r;
|
||||
}
|
||||
|
||||
static void
|
||||
switch_pdata (void)
|
||||
seh_hash_insert (const char *name, struct seh_seg_list *item)
|
||||
{
|
||||
if (pdata_seg == NULL)
|
||||
const char *error_string;
|
||||
|
||||
if ((error_string = hash_jam (seh_hash, name, (char *) item)))
|
||||
as_fatal (_("Inserting \"%s\" into structure table failed: %s"),
|
||||
name, error_string);
|
||||
}
|
||||
|
||||
static struct seh_seg_list *
|
||||
seh_hash_find (char *name)
|
||||
{
|
||||
return (struct seh_seg_list *) hash_find (seh_hash, name);
|
||||
}
|
||||
|
||||
static struct seh_seg_list *
|
||||
seh_hash_find_or_make (segT cseg, const char *base_name)
|
||||
{
|
||||
struct seh_seg_list *item;
|
||||
char *name;
|
||||
|
||||
/* Initialize seh_hash once. */
|
||||
if (!seh_hash)
|
||||
seh_hash = hash_new ();
|
||||
|
||||
name = get_pxdata_name (cseg, base_name);
|
||||
|
||||
item = seh_hash_find (name);
|
||||
if (!item)
|
||||
{
|
||||
pdata_seg = subseg_new (".pdata", 0);
|
||||
bfd_set_section_flags (stdoutput, pdata_seg,
|
||||
((SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA)
|
||||
& bfd_applicable_section_flags (stdoutput)));
|
||||
item = alloc_pxdata_item (make_pxdata_seg (cseg, name), 0, name);
|
||||
|
||||
seh_hash_insert (item->seg_name, item);
|
||||
}
|
||||
else
|
||||
subseg_set (pdata_seg, 0);
|
||||
free (name);
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
static void
|
||||
switch_xdata (int subseg, segT code_seg)
|
||||
{
|
||||
x_segcur = seh_hash_find_or_make (code_seg, ".xdata");
|
||||
|
||||
subseg_set (x_segcur->seg, subseg);
|
||||
}
|
||||
|
||||
static void
|
||||
switch_pdata (segT code_seg)
|
||||
{
|
||||
p_segcur = seh_hash_find_or_make (code_seg, ".pdata");
|
||||
|
||||
subseg_set (p_segcur->seg, p_segcur->subseg);
|
||||
}
|
||||
|
||||
/* Parsing routines. */
|
||||
@ -260,7 +371,7 @@ obj_coff_seh_handlerdata (int what ATTRIBUTE_UNUSED)
|
||||
return;
|
||||
demand_empty_rest_of_line ();
|
||||
|
||||
switch_xdata (seh_ctx_cur->subsection + 1);
|
||||
switch_xdata (seh_ctx_cur->subsection + 1, seh_ctx_cur->code_seg);
|
||||
}
|
||||
|
||||
/* Mark end of current context. */
|
||||
@ -311,10 +422,13 @@ obj_coff_seh_proc (int what ATTRIBUTE_UNUSED)
|
||||
|
||||
seh_ctx_cur = XCNEW (seh_context);
|
||||
|
||||
seh_ctx_cur->code_seg = now_seg;
|
||||
|
||||
if (seh_get_target_kind () == seh_kind_x64)
|
||||
{
|
||||
seh_ctx_cur->subsection = xdata_subseg;
|
||||
xdata_subseg += 2;
|
||||
x_segcur = seh_hash_find_or_make (seh_ctx_cur->code_seg, ".xdata");
|
||||
seh_ctx_cur->subsection = x_segcur->subseg;
|
||||
x_segcur->subseg += 2;
|
||||
}
|
||||
|
||||
SKIP_WHITESPACE ();
|
||||
@ -766,7 +880,7 @@ write_function_xdata (seh_context *c)
|
||||
if (seh_get_target_kind () != seh_kind_x64)
|
||||
return;
|
||||
|
||||
switch_xdata (c->subsection);
|
||||
switch_xdata (c->subsection, c->code_seg);
|
||||
|
||||
seh_x64_write_function_xdata (c);
|
||||
|
||||
@ -832,8 +946,8 @@ write_function_pdata (seh_context *c)
|
||||
expressionS exp;
|
||||
segT save_seg = now_seg;
|
||||
int save_subseg = now_subseg;
|
||||
|
||||
switch_pdata ();
|
||||
memset (&exp, 0, sizeof (expressionS));
|
||||
switch_pdata (c->code_seg);
|
||||
|
||||
switch (seh_get_target_kind ())
|
||||
{
|
||||
@ -843,8 +957,12 @@ write_function_pdata (seh_context *c)
|
||||
|
||||
exp.X_add_symbol = c->start_addr;
|
||||
emit_expr (&exp, 4);
|
||||
exp.X_op = O_symbol_rva;
|
||||
exp.X_add_number = 0;
|
||||
exp.X_add_symbol = c->end_addr;
|
||||
emit_expr (&exp, 4);
|
||||
exp.X_op = O_symbol_rva;
|
||||
exp.X_add_number = 0;
|
||||
exp.X_add_symbol = c->xdata_addr;
|
||||
emit_expr (&exp, 4);
|
||||
break;
|
||||
|
@ -90,6 +90,8 @@ typedef struct seh_context
|
||||
{
|
||||
struct seh_context *next;
|
||||
|
||||
/* Initial code-segment. */
|
||||
segT code_seg;
|
||||
/* Function name. */
|
||||
char *func_name;
|
||||
/* BeginAddress. */
|
||||
|
@ -1,3 +1,11 @@
|
||||
2010-09-15 Kai Tietz <kai.tietz@onevision.com>
|
||||
|
||||
* gas/pe/pe.exp: Add peseh-x64-4,5,6 tests.
|
||||
* gas/pe/peseh-x64-4.s: New.
|
||||
* gas/pe/peseh-x64-4.d: New.
|
||||
* gas/pe/peseh-x64-5.d: New.
|
||||
* gas/pe/peseh-x64-6.d: New.
|
||||
|
||||
2010-09-14 Maciej W. Rozycki <macro@codesourcery.com>
|
||||
|
||||
* gas/mips/mips32r2-sync.d: New test for MIPS32r2 "sync"
|
||||
|
@ -44,4 +44,7 @@ if ([istarget "x86_64-*-mingw*"]) then {
|
||||
run_dump_test "peseh-x64"
|
||||
run_dump_test "peseh-x64-2"
|
||||
run_dump_test "peseh-x64-3"
|
||||
run_dump_test "peseh-x64-4"
|
||||
run_dump_test "peseh-x64-5"
|
||||
run_dump_test "peseh-x64-6"
|
||||
}
|
||||
|
7
gas/testsuite/gas/pe/peseh-x64-4.d
Normal file
7
gas/testsuite/gas/pe/peseh-x64-4.d
Normal file
@ -0,0 +1,7 @@
|
||||
#objdump: -s -j .xdata\$_ZN5VBase1fEv
|
||||
#name: PE x64 SEH test named sections
|
||||
|
||||
.*: .*
|
||||
|
||||
Contents of section .xdata\$_ZN5VBase1fEv:
|
||||
0000 01040205 04030150 .*
|
564
gas/testsuite/gas/pe/peseh-x64-4.s
Normal file
564
gas/testsuite/gas/pe/peseh-x64-4.s
Normal file
@ -0,0 +1,564 @@
|
||||
.file "t4.C"
|
||||
.section .text$_ZN5VBase1fEv,"x"
|
||||
.linkonce discard
|
||||
.align 2
|
||||
.globl _ZN5VBase1fEv
|
||||
.def _ZN5VBase1fEv; .scl 2; .type 32; .endef
|
||||
.seh_proc _ZN5VBase1fEv
|
||||
_ZN5VBase1fEv:
|
||||
.LFB0:
|
||||
pushq %rbp
|
||||
.seh_pushreg %rbp
|
||||
movq %rsp, %rbp
|
||||
.seh_setframe %rbp, 0
|
||||
.seh_endprologue
|
||||
movq %rcx, 16(%rbp)
|
||||
nop
|
||||
popq %rbp
|
||||
ret
|
||||
.seh_endproc
|
||||
.section .text$_ZN10StreamBaseD2Ev,"x"
|
||||
.linkonce discard
|
||||
.align 2
|
||||
.globl _ZN10StreamBaseD2Ev
|
||||
.def _ZN10StreamBaseD2Ev; .scl 2; .type 32; .endef
|
||||
.seh_proc _ZN10StreamBaseD2Ev
|
||||
_ZN10StreamBaseD2Ev:
|
||||
.LFB2:
|
||||
pushq %rbp
|
||||
.seh_pushreg %rbp
|
||||
movq %rsp, %rbp
|
||||
.seh_setframe %rbp, 0
|
||||
subq $32, %rsp
|
||||
.seh_stackalloc 32
|
||||
.seh_endprologue
|
||||
movq %rcx, 16(%rbp)
|
||||
movq 16(%rbp), %rax
|
||||
leaq 16+_ZTV10StreamBase(%rip), %rdx
|
||||
movq %rdx, (%rax)
|
||||
movl $0, %eax
|
||||
andl $1, %eax
|
||||
testb %al, %al
|
||||
je .L2
|
||||
movq 16(%rbp), %rcx
|
||||
call _ZdlPv
|
||||
.L2:
|
||||
nop
|
||||
addq $32, %rsp
|
||||
popq %rbp
|
||||
ret
|
||||
.seh_endproc
|
||||
.section .text$_ZN10StreamBaseD1Ev,"x"
|
||||
.linkonce discard
|
||||
.align 2
|
||||
.globl _ZN10StreamBaseD1Ev
|
||||
.def _ZN10StreamBaseD1Ev; .scl 2; .type 32; .endef
|
||||
.seh_proc _ZN10StreamBaseD1Ev
|
||||
_ZN10StreamBaseD1Ev:
|
||||
.LFB3:
|
||||
pushq %rbp
|
||||
.seh_pushreg %rbp
|
||||
movq %rsp, %rbp
|
||||
.seh_setframe %rbp, 0
|
||||
subq $32, %rsp
|
||||
.seh_stackalloc 32
|
||||
.seh_endprologue
|
||||
movq %rcx, 16(%rbp)
|
||||
movq 16(%rbp), %rax
|
||||
leaq 16+_ZTV10StreamBase(%rip), %rdx
|
||||
movq %rdx, (%rax)
|
||||
movl $2, %eax
|
||||
andl $1, %eax
|
||||
testb %al, %al
|
||||
je .L5
|
||||
movq 16(%rbp), %rcx
|
||||
call _ZdlPv
|
||||
.L5:
|
||||
nop
|
||||
addq $32, %rsp
|
||||
popq %rbp
|
||||
ret
|
||||
.seh_endproc
|
||||
.section .text$_ZN10StreamBaseD0Ev,"x"
|
||||
.linkonce discard
|
||||
.align 2
|
||||
.globl _ZN10StreamBaseD0Ev
|
||||
.def _ZN10StreamBaseD0Ev; .scl 2; .type 32; .endef
|
||||
.seh_proc _ZN10StreamBaseD0Ev
|
||||
_ZN10StreamBaseD0Ev:
|
||||
.LFB4:
|
||||
pushq %rbp
|
||||
.seh_pushreg %rbp
|
||||
movq %rsp, %rbp
|
||||
.seh_setframe %rbp, 0
|
||||
subq $32, %rsp
|
||||
.seh_stackalloc 32
|
||||
.seh_endprologue
|
||||
movq %rcx, 16(%rbp)
|
||||
movq 16(%rbp), %rcx
|
||||
call _ZN10StreamBaseD1Ev
|
||||
movq 16(%rbp), %rcx
|
||||
call _ZdlPv
|
||||
nop
|
||||
addq $32, %rsp
|
||||
popq %rbp
|
||||
ret
|
||||
.seh_endproc
|
||||
.section .text$_ZN6StreamD2Ev,"x"
|
||||
.linkonce discard
|
||||
.align 2
|
||||
.globl _ZN6StreamD2Ev
|
||||
.def _ZN6StreamD2Ev; .scl 2; .type 32; .endef
|
||||
.seh_proc _ZN6StreamD2Ev
|
||||
_ZN6StreamD2Ev:
|
||||
.LFB6:
|
||||
pushq %rbp
|
||||
.seh_pushreg %rbp
|
||||
movq %rsp, %rbp
|
||||
.seh_setframe %rbp, 0
|
||||
subq $32, %rsp
|
||||
.seh_stackalloc 32
|
||||
.seh_endprologue
|
||||
movq %rcx, 16(%rbp)
|
||||
movq %rdx, 24(%rbp)
|
||||
movq 24(%rbp), %rax
|
||||
movq (%rax), %rdx
|
||||
movq 16(%rbp), %rax
|
||||
movq %rdx, (%rax)
|
||||
movq 16(%rbp), %rax
|
||||
movq (%rax), %rax
|
||||
subq $24, %rax
|
||||
movq (%rax), %rax
|
||||
addq 16(%rbp), %rax
|
||||
movq 24(%rbp), %rdx
|
||||
addq $8, %rdx
|
||||
movq (%rdx), %rdx
|
||||
movq %rdx, (%rax)
|
||||
movq 16(%rbp), %rcx
|
||||
call _ZN10StreamBaseD2Ev
|
||||
movl $0, %eax
|
||||
andl $2, %eax
|
||||
testl %eax, %eax
|
||||
je .L11
|
||||
movq 16(%rbp), %rax
|
||||
addq $8, %rax
|
||||
movq %rax, %rcx
|
||||
call _ZN5VBaseD2Ev
|
||||
.L11:
|
||||
movl $0, %eax
|
||||
andl $1, %eax
|
||||
testb %al, %al
|
||||
je .L10
|
||||
movq 16(%rbp), %rcx
|
||||
call _ZdlPv
|
||||
.L10:
|
||||
nop
|
||||
addq $32, %rsp
|
||||
popq %rbp
|
||||
ret
|
||||
.seh_endproc
|
||||
.section .text$_ZN6StreamD1Ev,"x"
|
||||
.linkonce discard
|
||||
.align 2
|
||||
.globl _ZN6StreamD1Ev
|
||||
.def _ZN6StreamD1Ev; .scl 2; .type 32; .endef
|
||||
.seh_proc _ZN6StreamD1Ev
|
||||
_ZN6StreamD1Ev:
|
||||
.LFB7:
|
||||
pushq %rbp
|
||||
.seh_pushreg %rbp
|
||||
movq %rsp, %rbp
|
||||
.seh_setframe %rbp, 0
|
||||
subq $32, %rsp
|
||||
.seh_stackalloc 32
|
||||
.seh_endprologue
|
||||
movq %rcx, 16(%rbp)
|
||||
leaq 24+_ZTV6Stream(%rip), %rdx
|
||||
movq 16(%rbp), %rax
|
||||
movq %rdx, (%rax)
|
||||
movl $8, %eax
|
||||
addq 16(%rbp), %rax
|
||||
leaq 64+_ZTV6Stream(%rip), %rdx
|
||||
movq %rdx, (%rax)
|
||||
movq 16(%rbp), %rcx
|
||||
call _ZN10StreamBaseD2Ev
|
||||
movl $2, %eax
|
||||
andl $2, %eax
|
||||
testl %eax, %eax
|
||||
je .L14
|
||||
movq 16(%rbp), %rax
|
||||
addq $8, %rax
|
||||
movq %rax, %rcx
|
||||
call _ZN5VBaseD2Ev
|
||||
.L14:
|
||||
movl $2, %eax
|
||||
andl $1, %eax
|
||||
testb %al, %al
|
||||
je .L13
|
||||
movq 16(%rbp), %rcx
|
||||
call _ZdlPv
|
||||
.L13:
|
||||
nop
|
||||
addq $32, %rsp
|
||||
popq %rbp
|
||||
ret
|
||||
.seh_endproc
|
||||
.section .text$_ZN6StreamD0Ev,"x"
|
||||
.linkonce discard
|
||||
.align 2
|
||||
.globl _ZN6StreamD0Ev
|
||||
.def _ZN6StreamD0Ev; .scl 2; .type 32; .endef
|
||||
.seh_proc _ZN6StreamD0Ev
|
||||
_ZN6StreamD0Ev:
|
||||
.LFB8:
|
||||
pushq %rbp
|
||||
.seh_pushreg %rbp
|
||||
movq %rsp, %rbp
|
||||
.seh_setframe %rbp, 0
|
||||
subq $32, %rsp
|
||||
.seh_stackalloc 32
|
||||
.seh_endprologue
|
||||
movq %rcx, 16(%rbp)
|
||||
movq 16(%rbp), %rcx
|
||||
call _ZN6StreamD1Ev
|
||||
movq 16(%rbp), %rcx
|
||||
call _ZdlPv
|
||||
nop
|
||||
addq $32, %rsp
|
||||
popq %rbp
|
||||
ret
|
||||
.seh_endproc
|
||||
.globl r
|
||||
.bss
|
||||
.align 4
|
||||
r:
|
||||
.space 4
|
||||
.section .text$_ZN13DerivedStreamD1Ev,"x"
|
||||
.linkonce discard
|
||||
.align 2
|
||||
.globl _ZN13DerivedStreamD1Ev
|
||||
.def _ZN13DerivedStreamD1Ev; .scl 2; .type 32; .endef
|
||||
.seh_proc _ZN13DerivedStreamD1Ev
|
||||
_ZN13DerivedStreamD1Ev:
|
||||
.LFB12:
|
||||
pushq %rbp
|
||||
.seh_pushreg %rbp
|
||||
movq %rsp, %rbp
|
||||
.seh_setframe %rbp, 0
|
||||
pushq %rbx
|
||||
.seh_pushreg %rbx
|
||||
subq $40, %rsp
|
||||
.seh_stackalloc 40
|
||||
.seh_endprologue
|
||||
movq %rcx, 16(%rbp)
|
||||
leaq 24+_ZTV13DerivedStream(%rip), %rdx
|
||||
movq 16(%rbp), %rax
|
||||
movq %rdx, (%rax)
|
||||
movl $8, %eax
|
||||
addq 16(%rbp), %rax
|
||||
leaq 64+_ZTV13DerivedStream(%rip), %rdx
|
||||
movq %rdx, (%rax)
|
||||
leaq _ZTT13DerivedStream(%rip), %rax
|
||||
addq $8, %rax
|
||||
movq %rax, %rdx
|
||||
movq 16(%rbp), %rcx
|
||||
.LEHB0:
|
||||
call _ZN6StreamD2Ev
|
||||
.LEHE0:
|
||||
movl $2, %eax
|
||||
andl $2, %eax
|
||||
testl %eax, %eax
|
||||
je .L19
|
||||
movq 16(%rbp), %rax
|
||||
addq $8, %rax
|
||||
movq %rax, %rcx
|
||||
.LEHB1:
|
||||
call _ZN5VBaseD2Ev
|
||||
.LEHE1:
|
||||
.L19:
|
||||
movl $2, %eax
|
||||
andl $1, %eax
|
||||
testb %al, %al
|
||||
je .L18
|
||||
movq 16(%rbp), %rcx
|
||||
call _ZdlPv
|
||||
jmp .L18
|
||||
.L23:
|
||||
movq %rax, %rbx
|
||||
movl $2, %eax
|
||||
andl $2, %eax
|
||||
testl %eax, %eax
|
||||
je .L22
|
||||
movq 16(%rbp), %rax
|
||||
addq $8, %rax
|
||||
movq %rax, %rcx
|
||||
call _ZN5VBaseD2Ev
|
||||
.L22:
|
||||
movq %rbx, %rax
|
||||
movq %rax, %rcx
|
||||
.LEHB2:
|
||||
call _Unwind_Resume
|
||||
nop
|
||||
.LEHE2:
|
||||
.L18:
|
||||
nop
|
||||
addq $40, %rsp
|
||||
popq %rbx
|
||||
popq %rbp
|
||||
ret
|
||||
.def __gxx_personality_v0; .scl 2; .type 32; .endef
|
||||
.seh_handler _GCC_specific_handler, @unwind, @except
|
||||
.seh_handlerdata
|
||||
.rva __gxx_personality_v0
|
||||
.section .text$_ZN13DerivedStreamD1Ev,"x"
|
||||
.linkonce discard
|
||||
.seh_handlerdata
|
||||
.LLSDA12:
|
||||
.byte 0xff
|
||||
.byte 0xff
|
||||
.byte 0x1
|
||||
.uleb128 .LLSDACSE12-.LLSDACSB12
|
||||
.LLSDACSB12:
|
||||
.uleb128 .LEHB0-.LFB12
|
||||
.uleb128 .LEHE0-.LEHB0
|
||||
.uleb128 .L23-.LFB12
|
||||
.uleb128 0
|
||||
.uleb128 .LEHB1-.LFB12
|
||||
.uleb128 .LEHE1-.LEHB1
|
||||
.uleb128 0
|
||||
.uleb128 0
|
||||
.uleb128 .LEHB2-.LFB12
|
||||
.uleb128 .LEHE2-.LEHB2
|
||||
.uleb128 0
|
||||
.uleb128 0
|
||||
.LLSDACSE12:
|
||||
.section .text$_ZN13DerivedStreamD1Ev,"x"
|
||||
.linkonce discard
|
||||
.seh_endproc
|
||||
.section .text$_ZN13DerivedStreamD0Ev,"x"
|
||||
.linkonce discard
|
||||
.align 2
|
||||
.globl _ZN13DerivedStreamD0Ev
|
||||
.def _ZN13DerivedStreamD0Ev; .scl 2; .type 32; .endef
|
||||
.seh_proc _ZN13DerivedStreamD0Ev
|
||||
_ZN13DerivedStreamD0Ev:
|
||||
.LFB13:
|
||||
pushq %rbp
|
||||
.seh_pushreg %rbp
|
||||
movq %rsp, %rbp
|
||||
.seh_setframe %rbp, 0
|
||||
subq $32, %rsp
|
||||
.seh_stackalloc 32
|
||||
.seh_endprologue
|
||||
movq %rcx, 16(%rbp)
|
||||
movq 16(%rbp), %rcx
|
||||
call _ZN13DerivedStreamD1Ev
|
||||
movq 16(%rbp), %rcx
|
||||
call _ZdlPv
|
||||
nop
|
||||
addq $32, %rsp
|
||||
popq %rbp
|
||||
ret
|
||||
.seh_endproc
|
||||
.text
|
||||
.globl _Z7ctor2_xv
|
||||
.def _Z7ctor2_xv; .scl 2; .type 32; .endef
|
||||
.seh_proc _Z7ctor2_xv
|
||||
_Z7ctor2_xv:
|
||||
.LFB9:
|
||||
pushq %rbp
|
||||
.seh_pushreg %rbp
|
||||
movq %rsp, %rbp
|
||||
.seh_setframe %rbp, 0
|
||||
subq $48, %rsp
|
||||
.seh_stackalloc 48
|
||||
.seh_endprologue
|
||||
leaq -16(%rbp), %rax
|
||||
movq %rax, %rcx
|
||||
.LEHB3:
|
||||
call _ZN13DerivedStreamC1Ev
|
||||
leaq -16(%rbp), %rax
|
||||
movq %rax, %rcx
|
||||
call _ZN13DerivedStreamD1Ev
|
||||
.LEHE3:
|
||||
.L29:
|
||||
movl r(%rip), %eax
|
||||
testl %eax, %eax
|
||||
je .L27
|
||||
.LEHB4:
|
||||
call abort
|
||||
nop
|
||||
.L27:
|
||||
movl $0, %ecx
|
||||
call exit
|
||||
nop
|
||||
.L30:
|
||||
movq %rax, %rcx
|
||||
call __cxa_begin_catch
|
||||
call __cxa_end_catch
|
||||
.LEHE4:
|
||||
jmp .L29
|
||||
.seh_handler _GCC_specific_handler, @unwind, @except
|
||||
.seh_handlerdata
|
||||
.rva __gxx_personality_v0
|
||||
.text
|
||||
.seh_handlerdata
|
||||
.align 4
|
||||
.LLSDA9:
|
||||
.byte 0xff
|
||||
.byte 0x9b
|
||||
.uleb128 .LLSDATT9-.LLSDATTD9
|
||||
.LLSDATTD9:
|
||||
.byte 0x1
|
||||
.uleb128 .LLSDACSE9-.LLSDACSB9
|
||||
.LLSDACSB9:
|
||||
.uleb128 .LEHB3-.LFB9
|
||||
.uleb128 .LEHE3-.LEHB3
|
||||
.uleb128 .L30-.LFB9
|
||||
.uleb128 0x1
|
||||
.uleb128 .LEHB4-.LFB9
|
||||
.uleb128 .LEHE4-.LEHB4
|
||||
.uleb128 0
|
||||
.uleb128 0
|
||||
.LLSDACSE9:
|
||||
.byte 0x1
|
||||
.byte 0
|
||||
.align 4
|
||||
.long 0
|
||||
|
||||
.LLSDATT9:
|
||||
.text
|
||||
.seh_endproc
|
||||
.globl _ZTV13DerivedStream
|
||||
.section .data$_ZTV13DerivedStream,"w"
|
||||
.linkonce same_size
|
||||
.align 32
|
||||
_ZTV13DerivedStream:
|
||||
.quad 8
|
||||
.quad 0
|
||||
.quad _ZTI13DerivedStream
|
||||
.quad _ZN13DerivedStreamD1Ev
|
||||
.quad _ZN13DerivedStreamD0Ev
|
||||
.quad 0
|
||||
.quad -8
|
||||
.quad _ZTI13DerivedStream
|
||||
.quad _ZN5VBase1fEv
|
||||
.globl _ZTT13DerivedStream
|
||||
.section .data$_ZTT13DerivedStream,"w"
|
||||
.linkonce same_size
|
||||
.align 32
|
||||
_ZTT13DerivedStream:
|
||||
.quad _ZTV13DerivedStream+24
|
||||
.quad _ZTC13DerivedStream0_6Stream+24
|
||||
.quad _ZTC13DerivedStream0_6Stream+64
|
||||
.quad _ZTV13DerivedStream+64
|
||||
.globl _ZTC13DerivedStream0_6Stream
|
||||
.section .data$_ZTC13DerivedStream0_6Stream,"w"
|
||||
.linkonce same_size
|
||||
.align 32
|
||||
_ZTC13DerivedStream0_6Stream:
|
||||
.quad 8
|
||||
.quad 0
|
||||
.quad _ZTI6Stream
|
||||
.quad _ZN6StreamD1Ev
|
||||
.quad _ZN6StreamD0Ev
|
||||
.quad 0
|
||||
.quad -8
|
||||
.quad _ZTI6Stream
|
||||
.quad _ZN5VBase1fEv
|
||||
.globl _ZTV6Stream
|
||||
.section .data$_ZTV6Stream,"w"
|
||||
.linkonce same_size
|
||||
.align 32
|
||||
_ZTV6Stream:
|
||||
.quad 8
|
||||
.quad 0
|
||||
.quad _ZTI6Stream
|
||||
.quad _ZN6StreamD1Ev
|
||||
.quad _ZN6StreamD0Ev
|
||||
.quad 0
|
||||
.quad -8
|
||||
.quad _ZTI6Stream
|
||||
.quad _ZN5VBase1fEv
|
||||
.globl _ZTT6Stream
|
||||
.section .data$_ZTT6Stream,"w"
|
||||
.linkonce same_size
|
||||
.align 16
|
||||
_ZTT6Stream:
|
||||
.quad _ZTV6Stream+24
|
||||
.quad _ZTV6Stream+64
|
||||
.globl _ZTV10StreamBase
|
||||
.section .data$_ZTV10StreamBase,"w"
|
||||
.linkonce same_size
|
||||
.align 32
|
||||
_ZTV10StreamBase:
|
||||
.quad 0
|
||||
.quad _ZTI10StreamBase
|
||||
.quad _ZN10StreamBaseD1Ev
|
||||
.quad _ZN10StreamBaseD0Ev
|
||||
.globl _ZTS13DerivedStream
|
||||
.section .rdata$_ZTS13DerivedStream,"dr"
|
||||
.linkonce same_size
|
||||
.align 16
|
||||
_ZTS13DerivedStream:
|
||||
.ascii "13DerivedStream\0"
|
||||
.globl _ZTI13DerivedStream
|
||||
.section .data$_ZTI13DerivedStream,"w"
|
||||
.linkonce same_size
|
||||
.align 16
|
||||
_ZTI13DerivedStream:
|
||||
.quad _ZTVN10__cxxabiv120__si_class_type_infoE+16
|
||||
.quad _ZTS13DerivedStream
|
||||
.quad _ZTI6Stream
|
||||
.globl _ZTS6Stream
|
||||
.section .rdata$_ZTS6Stream,"dr"
|
||||
.linkonce same_size
|
||||
_ZTS6Stream:
|
||||
.ascii "6Stream\0"
|
||||
.globl _ZTI6Stream
|
||||
.section .data$_ZTI6Stream,"w"
|
||||
.linkonce same_size
|
||||
.align 32
|
||||
_ZTI6Stream:
|
||||
.quad _ZTVN10__cxxabiv121__vmi_class_type_infoE+16
|
||||
.quad _ZTS6Stream
|
||||
.long 0
|
||||
.long 2
|
||||
.quad _ZTI5VBase
|
||||
.long -6141
|
||||
.space 4
|
||||
.quad _ZTI10StreamBase
|
||||
.long 2
|
||||
.space 4
|
||||
.globl _ZTS10StreamBase
|
||||
.section .rdata$_ZTS10StreamBase,"dr"
|
||||
.linkonce same_size
|
||||
_ZTS10StreamBase:
|
||||
.ascii "10StreamBase\0"
|
||||
.globl _ZTI10StreamBase
|
||||
.section .data$_ZTI10StreamBase,"w"
|
||||
.linkonce same_size
|
||||
.align 16
|
||||
_ZTI10StreamBase:
|
||||
.quad _ZTVN10__cxxabiv117__class_type_infoE+16
|
||||
.quad _ZTS10StreamBase
|
||||
.globl _ZTS5VBase
|
||||
.section .rdata$_ZTS5VBase,"dr"
|
||||
.linkonce same_size
|
||||
_ZTS5VBase:
|
||||
.ascii "5VBase\0"
|
||||
.globl _ZTI5VBase
|
||||
.section .data$_ZTI5VBase,"w"
|
||||
.linkonce same_size
|
||||
.align 16
|
||||
_ZTI5VBase:
|
||||
.quad _ZTVN10__cxxabiv117__class_type_infoE+16
|
||||
.quad _ZTS5VBase
|
||||
.def _ZdlPv; .scl 2; .type 32; .endef
|
||||
.def _ZN5VBaseD2Ev; .scl 2; .type 32; .endef
|
||||
.def _Unwind_Resume; .scl 2; .type 32; .endef
|
||||
.def _ZN13DerivedStreamC1Ev; .scl 2; .type 32; .endef
|
||||
.def abort; .scl 2; .type 32; .endef
|
||||
.def exit; .scl 2; .type 32; .endef
|
||||
.def __cxa_begin_catch; .scl 2; .type 32; .endef
|
||||
.def __cxa_end_catch; .scl 2; .type 32; .endef
|
10
gas/testsuite/gas/pe/peseh-x64-5.d
Normal file
10
gas/testsuite/gas/pe/peseh-x64-5.d
Normal file
@ -0,0 +1,10 @@
|
||||
#source: peseh-x64-4.s
|
||||
#objdump: -h -j .xdata\$_ZN5VBase1fEv
|
||||
#name: PE x64 SEH test sections flags xdata
|
||||
|
||||
.*: .*
|
||||
|
||||
Sections:
|
||||
Idx Name Size VMA LMA File off Algn
|
||||
4 .xdata\$_ZN5VBase1fEv 00000008 0000000000000000 0000000000000000 000007a4 2\*\*2
|
||||
CONTENTS, ALLOC, LOAD, READONLY, DATA, LINK_ONCE_DISCARD
|
10
gas/testsuite/gas/pe/peseh-x64-6.d
Normal file
10
gas/testsuite/gas/pe/peseh-x64-6.d
Normal file
@ -0,0 +1,10 @@
|
||||
#source: peseh-x64-4.s
|
||||
#objdump: -h -j .pdata\$_ZN5VBase1fEv
|
||||
#name: PE x64 SEH test sections flags pdata
|
||||
|
||||
.*: .*
|
||||
|
||||
Sections:
|
||||
Idx Name Size VMA LMA File off Algn
|
||||
5 .pdata\$_ZN5VBase1fEv 0000000c 0000000000000000 0000000000000000 000007ac 2\*\*2
|
||||
CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA, LINK_ONCE_DISCARD
|
@ -1,3 +1,8 @@
|
||||
2010-09-15 Kai Tietz <kai.tietz@onevision.com>
|
||||
|
||||
* scripttempl/pep.sc: Add .xdata segment and
|
||||
put into .pdata all segments beginning with .pdata.
|
||||
|
||||
2010-09-10 Alan Modra <amodra@gmail.com>
|
||||
|
||||
PR ld/11931
|
||||
|
@ -118,7 +118,12 @@ SECTIONS
|
||||
|
||||
.pdata ${RELOCATING+BLOCK(__section_alignment__)} :
|
||||
{
|
||||
*(.pdata)
|
||||
*(.pdata*)
|
||||
}
|
||||
|
||||
.xdata ${RELOCATING+BLOCK(__section_alignment__)} :
|
||||
{
|
||||
*(.xdata*)
|
||||
}
|
||||
|
||||
.bss ${RELOCATING+BLOCK(__section_alignment__)} :
|
||||
|
Loading…
Reference in New Issue
Block a user