(output_fde): Use it. Make sure to fully init exp before using it.
testsuite/
* gas/cfi/cfi-common-1.d: Use objdump instead of readelf to dump.
* gas/cfi/cfi-common-2.d, gas/cfi/cfi-common-3.d,
gas/cfi/cfi-common-4.d, gas/cfi/cfi-common-6.d,
gas/cfi/cfi-common-7.d, gas/cfi/cfi-x86_64.d: Likewise.
* gas/cfi/cfi-x86_64.s: Remove .type directives.
* gas/cfi/cfi.exp: Run for pecoff objects too.
* gas/cfi/reloc-pe-i386.d, gas/cfi/reloc-pe-i386.s: New test.
+2010-09-02 Richard Henderson <rth@redhat.com>
+
+ * dw2gencfi.c (TC_DWARF2_EMIT_OFFSET): Provide default.
+ (output_fde): Use it. Make sure to fully init exp before using it.
+
2010-08-31 Kai Tietz <kai.tietz@onevision.com>
* config/obj-coff-seh.c (obj_coff_seh_save): Correct comparison.
# define DWARF2_ADDR_SIZE(bfd) (bfd_arch_bits_per_address (bfd) / 8)
#endif
+/* ??? Share this with dwarf2cfg.c. */
+#ifndef TC_DWARF2_EMIT_OFFSET
+#define TC_DWARF2_EMIT_OFFSET generic_dwarf2_emit_offset
+
+/* Create an offset to .dwarf2_*. */
+
+static void
+generic_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
+{
+ expressionS exp;
+
+ exp.X_op = O_symbol;
+ exp.X_add_symbol = symbol;
+ exp.X_add_number = 0;
+ emit_expr (&exp, size);
+}
+#endif
+
struct cfi_escape_data {
struct cfi_escape_data *next;
expressionS exp;
if (eh_frame)
{
+ exp.X_op = O_subtract;
exp.X_add_symbol = after_size_address;
exp.X_op_symbol = cie->start_address;
+ exp.X_add_number = 0;
+ emit_expr (&exp, offset_size); /* CIE offset. */
}
else
{
- exp.X_op = O_symbol;
- exp.X_add_symbol = cie->start_address;
- exp.X_op_symbol = NULL;
+ TC_DWARF2_EMIT_OFFSET (cie->start_address, offset_size);
}
- emit_expr (&exp, offset_size); /* CIE offset. */
if (eh_frame)
{
+ exp.X_op = O_subtract;
+ exp.X_add_number = 0;
#if CFI_DIFF_EXPR_OK
exp.X_add_symbol = fde->start_address;
exp.X_op_symbol = symbol_temp_new_now ();
#else
exp.X_op = O_symbol;
exp.X_add_symbol = fde->start_address;
- exp.X_op_symbol = NULL;
#ifdef tc_cfi_emit_pcrel_expr
tc_cfi_emit_pcrel_expr (&exp, DWARF2_FDE_RELOC_SIZE); /* Code offset. */
#else
}
else
{
+ exp.X_op = O_symbol;
exp.X_add_symbol = fde->start_address;
+ exp.X_add_number = 0;
addr_size = DWARF2_ADDR_SIZE (stdoutput);
emit_expr (&exp, addr_size);
}
exp.X_op = O_subtract;
exp.X_add_symbol = fde->end_address;
exp.X_op_symbol = fde->start_address; /* Code length. */
+ exp.X_add_number = 0;
emit_expr (&exp, addr_size);
augmentation_size = encoding_size (fde->lsda_encoding);
+2010-09-02 Richard Henderson <rth@redhat.com>
+
+ * gas/cfi/cfi-common-1.d: Use objdump instead of readelf to dump.
+ * gas/cfi/cfi-common-2.d, gas/cfi/cfi-common-3.d,
+ gas/cfi/cfi-common-4.d, gas/cfi/cfi-common-6.d,
+ gas/cfi/cfi-common-7.d, gas/cfi/cfi-x86_64.d: Likewise.
+ * gas/cfi/cfi-x86_64.s: Remove .type directives.
+ * gas/cfi/cfi.exp: Run for pecoff objects too.
+
+ * gas/cfi/reloc-pe-i386.d, gas/cfi/reloc-pe-i386.s: New test.
+
2010-08-31 H.J. Lu <hongjiu.lu@intel.com>
PR binutils/11960
-#readelf: -wf
+#objdump: -Wf
#name: CFI common 1
+#...
Contents of the .eh_frame section:
00000000 00000010 00000000 CIE
-#readelf: -wf
+#objdump: -Wf
#name: CFI common 2
+#...
Contents of the .eh_frame section:
00000000 00000010 00000000 CIE
-#readelf: -wf
+#objdump: -Wf
#name: CFI common 3
+#...
Contents of the .eh_frame section:
00000000 00000010 00000000 CIE
-#readelf: -wf
+#objdump: -Wf
#name: CFI common 4
+#...
Contents of the .eh_frame section:
00000000 00000010 00000000 CIE
-#readelf: -wf
+#objdump: -Wf
#name: CFI common 6
+#...
Contents of the .eh_frame section:
00000000 00000018 00000000 CIE
-#readelf: -wf
+#objdump: -Wf
#name: CFI common 7
+#...
Contents of the .eh_frame section:
00000000 00000010 00000000 CIE
-#readelf: -wf
+#objdump: -Wf
#name: CFI on x86-64
+#...
Contents of the .eh_frame section:
00000000 00000014 00000000 CIE
DW_CFA_undefined: r16 \(rip\)
DW_CFA_nop
-000000e8 000000cc 00000018 FDE cie=000000d4 pc=00000058..00000097
+000000e8 000000c[8c] 00000018 FDE cie=000000d4 pc=00000058..00000097
DW_CFA_advance_loc: 1 to 00000059
DW_CFA_undefined: r0 \(rax\)
DW_CFA_advance_loc: 1 to 0000005a
DW_CFA_advance_loc: 1 to 00000096
DW_CFA_undefined: r48 \(mm7\)
DW_CFA_nop
- DW_CFA_nop
- DW_CFA_nop
- DW_CFA_nop
- DW_CFA_nop
-
+#pass
#; - function with a space on the stack
#; allocated for local variables
- .type func_locvars,@function
func_locvars:
.cfi_startproc
#; - functions that begins with standard
#; prologue: "pushq %rbp; movq %rsp,%rbp"
- .type func_prologue,@function
func_prologue:
.cfi_startproc
#; another register (r12) and then allocates
#; a space for local variables
- .type func_otherreg,@function
func_otherreg:
.cfi_startproc
#; main
#; - typical function
- .type main,@function
main:
.cfi_startproc
#; _start
#; - standard entry point
- .type _start,@function
.globl _start
_start:
.cfi_startproc
#; - test for all .cfi directives.
#; This function is never called and the CFI info doesn't make sense.
- .type func_alldirectives,@function
func_alldirectives:
.cfi_startproc simple
.cfi_def_cfa rsp,8
#; - test for all .cfi register numbers.
#; This function is never called and the CFI info doesn't make sense.
- .type func_all_registers,@function
func_all_registers:
.cfi_startproc simple
-if ![is_elf_format] then {
+if { ![is_elf_format] && ![is_pecoff_format] } then {
return
}
set ASFLAGS "$old_ASFLAGS"
}
+ if { [is_pecoff_format] } then {
+ run_dump_test "reloc-pe-i386"
+ }
+
} elseif { [istarget alpha*-*-*] } then {
run_dump_test "cfi-alpha-1"
run_dump_test "cfi-alpha-2"
run_dump_test "cfi-common-2"
run_dump_test "cfi-common-3"
run_dump_test "cfi-common-4"
- run_dump_test "cfi-common-5"
+ if { ![is_pecoff_format] } then {
+ # This test uses .subsection/.previous which are elf-specific.
+ run_dump_test "cfi-common-5"
+ }
run_dump_test "cfi-common-7"
}