Index: src/gas/config/obj-coff-seh.c =================================================================== --- src.orig/gas/config/obj-coff-seh.c 2010-09-15 17:02:16.520858000 +0200 +++ src/gas/config/obj-coff-seh.c 2010-09-15 17:02:30.198127300 +0200 @@ -22,42 +22,156 @@ #include "obj-coff-seh.h" +/* Private segment collection list. */ +struct seh_seg_list { + segT seg; + int subseg; + char seg_name[1]; +}; + /* 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) +{ + 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; + + if (!name) + name = ""; + sname = xmalloc (strlen (base_name) + strlen (name) + 1); + + /* Create segment. */ + sprintf (sname, "%s%s", base_name, name); + return sname; +} + +/* Allocate a seh_seg_list structure. */ +static struct seh_seg_list * +alloc_pxdata_item (segT seg, int subseg, char *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); + struct seh_seg_list *r; + + r = (struct seh_seg_list *) + xmalloc (sizeof (struct seh_seg_list) + strlen (name) + 1); + r->seg = seg; + r->subseg = subseg; + strcpy (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) +{ + 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) { - if (pdata_seg == NULL) + 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); + + if ((item = seh_hash_find (name)) == NULL) { - 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 +374,7 @@ obj_coff_seh_handlerdata (int what ATTRI 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 +425,13 @@ obj_coff_seh_proc (int what ATTRIBUTE_UN 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 +883,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); @@ -833,7 +950,7 @@ write_function_pdata (seh_context *c) segT save_seg = now_seg; int save_subseg = now_subseg; memset (&exp, 0, sizeof (expressionS)); - switch_pdata (); + switch_pdata (c->code_seg); switch (seh_get_target_kind ()) { Index: src/gas/config/obj-coff-seh.h =================================================================== --- src.orig/gas/config/obj-coff-seh.h 2010-09-15 17:02:16.523858000 +0200 +++ src/gas/config/obj-coff-seh.h 2010-09-15 17:02:30.207127800 +0200 @@ -90,6 +90,8 @@ typedef struct seh_context { struct seh_context *next; + /* Initial code-segment. */ + segT code_seg; /* Function name. */ char *func_name; /* BeginAddress. */ Index: src/ld/scripttempl/pep.sc =================================================================== --- src.orig/ld/scripttempl/pep.sc 2010-09-15 17:02:16.544858000 +0200 +++ src/ld/scripttempl/pep.sc 2010-09-15 17:02:30.211128000 +0200 @@ -118,7 +118,12 @@ SECTIONS .pdata ${RELOCATING+BLOCK(__section_alignment__)} : { - *(.pdata) + *(.pdata*) + } + + .xdata ${RELOCATING+BLOCK(__section_alignment__)} : + { + *(.xdata*) } .bss ${RELOCATING+BLOCK(__section_alignment__)} : Index: src/gas/testsuite/gas/pe/pe.exp =================================================================== --- src.orig/gas/testsuite/gas/pe/pe.exp 2010-09-15 17:02:16.525858000 +0200 +++ src/gas/testsuite/gas/pe/pe.exp 2010-09-15 17:02:30.216128300 +0200 @@ -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" } Index: src/gas/testsuite/gas/pe/peseh-x64-4.d =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ src/gas/testsuite/gas/pe/peseh-x64-4.d 2010-09-15 17:02:30.221128600 +0200 @@ -0,0 +1,7 @@ +#objdump: -s -j .xdata\$_ZN5VBase1fEv +#name: PE x64 SEH test named sections + +.*: .* + +Contents of section .xdata\$_ZN5VBase1fEv: + 0000 01040205 04030150 .* Index: src/gas/testsuite/gas/pe/peseh-x64-4.s =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ src/gas/testsuite/gas/pe/peseh-x64-4.s 2010-09-15 17:02:30.227129000 +0200 @@ -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 Index: src/gas/testsuite/gas/pe/peseh-x64-6.d =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ src/gas/testsuite/gas/pe/peseh-x64-6.d 2010-09-15 17:02:30.231129200 +0200 @@ -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 Index: src/gas/testsuite/gas/pe/peseh-x64-5.d =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ src/gas/testsuite/gas/pe/peseh-x64-5.d 2010-09-15 17:02:30.235129400 +0200 @@ -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