This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[New port] segfault in copy_to_mode_reg(PSImode, NULL)


Hi all,

I'm trying to modify a GCC (4.3.3) port we did 2 years ago (which was
working...). The MCU is a 16-bit MCU and I try to extend the
addressing space from HI to PSI. I get inspiration from m32c.The new
target has PSI registers as base regs, and special insn to use them.

I have a segfault pb in the 2nd pass (I'm not sure about the pass)
while compiling libgcc2 (negdi). It seems the generated rtx structure
is not correctly set. valgrind do not report any pb, except before
segfaulting...

The pb occurs in copy_to_mode_reg due to a NULL rtx (backtrace/faulty
rtx after).

Any hint to help me fixing my backend ?

Thanks,
Aurélien

Backtrace

#0  0x000000000050b9e5 in copy_to_mode_reg (mode=PSImode, x=0x0) at
<...>/src/gcc/explow.c:621
#1  0x00000000005206d3 in set_storage_via_libcall (object=0x8a15ec0,
size=0x88a1480, val=0x88a1400, tailcall=0 '\000') at
<...>/src/gcc/expr.c:2644
#2  0x0000000000520665 in clear_storage_hints (object=0x8a15ec0,
size=0x88a1480, method=BLOCK_OP_NORMAL, expected_align=0,
expected_size=-1) at <...>/src/gcc/expr.c:2618
#3  0x00000000005206a8 in clear_storage (object=0x8a15ec0,
size=0x88a1480, method=BLOCK_OP_NORMAL) at <...>/src/gcc/expr.c:2627
#4  0x000000000052598b in store_constructor (exp=0x8a09de0,
target=0x8a15ec0, cleared=0, size=8) at <...>/src/gcc/expr.c:5134
#5  0x000000000052a305 in expand_constructor (exp=0x8a09de0,
target=0x8a15ec0, modifier=EXPAND_NORMAL, avoid_temp_mem=0 '\000') at
<...>/src/gcc/expr.c:7013
#6  0x000000000052b5da in expand_expr_real_1 (exp=0x8a09de0,
target=0x8a15ec0, tmode=BLKmode, modifier=EXPAND_NORMAL,
alt_rtl=0x7feffec88) at <...>/src/gcc/expr.c:7506
#7  0x000000000052a472 in expand_expr_real (exp=0x8a09de0,
target=0x8a15ec0, tmode=BLKmode, modifier=EXPAND_NORMAL,
alt_rtl=0x7feffec88) at <...>/src/gcc/expr.c:7115
#8  0x0000000000524758 in store_expr (exp=0x8a09de0, target=0x8a15ec0,
call_param_p=0, nontemporal=0 '\000') at <...>/src/gcc/expr.c:4584
#9  0x0000000000523c52 in expand_assignment (to=0x8998a00,
from=0x8a09de0, nontemporal=0 '\000') at <...>/src/gcc/expr.c:4367
#10 0x000000000053120b in expand_expr_real_1 (exp=0x889e300,
target=0x0, tmode=VOIDmode, modifier=EXPAND_NORMAL, alt_rtl=0x0) at
<...>/src/gcc/expr.c:9158
#11 0x000000000052a449 in expand_expr_real (exp=0x889e300,
target=0x88a1400, tmode=VOIDmode, modifier=EXPAND_NORMAL, alt_rtl=0x0)
at <...>/src/gcc/expr.c:7109
#12 0x0000000000667942 in expand_expr (exp=0x889e300,
target=0x88a1400, mode=VOIDmode, modifier=EXPAND_NORMAL)     at
<...>/src/gcc/expr.h:514
#13 0x0000000000668206 in expand_expr_stmt (exp=0x889e300) at
<...>/src/gcc/stmt.c:1361
#14 0x000000000082ae40 in expand_gimple_basic_block (bb=0x8a1d4e0) at
<...>/src/gcc/cfgexpand.c:1610
#15 0x000000000082bcc9 in tree_expand_cfg () at <...>/src/gcc/cfgexpand.c:1921
#16 0x00000000005dfcdf in execute_one_pass (pass=0xc4d580) at
<...>/src/gcc/passes.c:1122
#17 0x00000000005dfe43 in execute_pass_list (pass=0xc4d580) at
<...>/src/gcc/passes.c:1176
#18 0x00000000006b9458 in tree_rest_of_compilation (fndecl=0x89799c0)
at <...>/src/gcc/tree-optimize.c:404
#19 0x00000000007de32f in cgraph_expand_function (node=0x88a3e00) at
<...>/src/gcc/cgraphunit.c:1166
#20 0x00000000007de4df in cgraph_expand_all_functions () at
<...>/src/gcc/cgraphunit.c:1229 #21 0x00000000007dea94 in
cgraph_optimize () at <...>/src/gcc/cgraphunit.c:1436 #22
0x0000000000417ff7 in c_write_global_declarations () at
<...>/src/gcc/c-decl.c:8086 #23 0x0000000000672a9b in compile_file ()
at <...>/src/gcc/toplev.c:1055
#24 0x0000000000674611 in do_compile () at <...>/src/gcc/toplev.c:2240
#25 0x0000000000674675 in toplev_main (argc=70, argv=0x7fefff9e8) at
<...>/src/gcc/toplev.c:2272
#26 0x0000000000479383 in main (argc=70, argv=0x7fefff9e8) at
<...>/src/gcc/main.c:35


The "object" parameter in set_storage_via_libcall seems "correct" :

{code = MEM, mode = BLKmode, jump = 0, call = 1, unchanging = 0,
volatil = 0, in_struct = 1, used = 0, frame_related = 0, return_val =
0, u = {fld = {{
        rt_int = 144793312, rt_uint = 144793312, rt_str = 0x8a15ee0
"/", rt_rtx = 0x8a15ee0, rt_rtvec = 0x8a15ee0, rt_type = 144793312,
        rt_addr_diff_vec_flags = {min_align = 224, base_after_vec = 0,
min_after_vec = 1, max_after_vec = 1, min_after_base = 1,
max_after_base = 1,
          offset_unsigned = 0, scale = 161}, rt_cselib = 0x8a15ee0,
rt_bit = 0x8a15ee0, rt_tree = 0x8a15ee0, rt_bb = 0x8a15ee0, rt_mem =
0x8a15ee0,
        rt_reg = 0x8a15ee0, rt_constant = 0x8a15ee0}}, hwint =
{144793312}, block_sym = {fld = {{rt_int = 144793312, rt_uint =
144793312,
          rt_str = 0x8a15ee0 "/", rt_rtx = 0x8a15ee0, rt_rtvec =
0x8a15ee0, rt_type = 144793312, rt_addr_diff_vec_flags = {min_align =
224,
            base_after_vec = 0, min_after_vec = 1, max_after_vec = 1,
min_after_base = 1, max_after_base = 1, offset_unsigned = 0, scale =
161},
          rt_cselib = 0x8a15ee0, rt_bit = 0x8a15ee0, rt_tree =
0x8a15ee0, rt_bb = 0x8a15ee0, rt_mem = 0x8a15ee0, rt_reg = 0x8a15ee0,
          rt_constant = 0x8a15ee0}, {rt_int = 144804576, rt_uint =
144804576, rt_str = 0x8a18ae0 "\002", rt_rtx = 0x8a18ae0, rt_rtvec =
0x8a18ae0,
          rt_type = 144804576, rt_addr_diff_vec_flags = {min_align =
224, base_after_vec = 0, min_after_vec = 1, max_after_vec = 0,
min_after_base = 1,
            max_after_base = 0, offset_unsigned = 0, scale = 161},
rt_cselib = 0x8a18ae0, rt_bit = 0x8a18ae0, rt_tree = 0x8a18ae0, rt_bb
= 0x8a18ae0,
          rt_mem = 0x8a18ae0, rt_reg = 0x8a18ae0, rt_constant =
0x8a18ae0}, {rt_int = 0, rt_uint = 0, rt_str = 0x0, rt_rtx = 0x0,
rt_rtvec = 0x0,
          rt_type = VOIDmode, rt_addr_diff_vec_flags = {min_align = 0,
base_after_vec = 0, min_after_vec = 0, max_after_vec = 0,
min_after_base = 0,
            max_after_base = 0, offset_unsigned = 0, scale = 0},
rt_cselib = 0x0, rt_bit = 0x0, rt_tree = 0x0, rt_bb = 0x0, rt_mem =
0x0, rt_reg = 0x0,
          rt_constant = 0x0}}, block = 0x9002f, offset = 143271360},
rv = {cl = 0, decimal = 0, sign = 0, signalling = 0, canonical = 1,
uexp = 2262395,
      sig = {144804576, 0, 589871}}, fv = {data = {low = 144793312,
high = 144804576}, mode = 0}}}


Here its XEXP:

{code = 24288, mode = 161, jump = 0, call = 0, unchanging = 0, volatil
= 1, in_struct = 0, used = 0, frame_related = 0, return_val = 0, u =
{fld = {{
        rt_int = 144804576, rt_uint = 144804576, rt_str = 0x8a18ae0
"\002", rt_rtx = 0x8a18ae0, rt_rtvec = 0x8a18ae0, rt_type = 144804576,
        rt_addr_diff_vec_flags = {min_align = 224, base_after_vec = 0,
min_after_vec = 1, max_after_vec = 0, min_after_base = 1,
max_after_base = 0,
          offset_unsigned = 0, scale = 161}, rt_cselib = 0x8a18ae0,
rt_bit = 0x8a18ae0, rt_tree = 0x8a18ae0, rt_bb = 0x8a18ae0, rt_mem =
0x8a18ae0,
        rt_reg = 0x8a18ae0, rt_constant = 0x8a18ae0}}, hwint =
{144804576}, block_sym = {fld = {{rt_int = 144804576, rt_uint =
144804576,
          rt_str = 0x8a18ae0 "\002", rt_rtx = 0x8a18ae0, rt_rtvec =
0x8a18ae0, rt_type = 144804576, rt_addr_diff_vec_flags = {min_align =
224,
            base_after_vec = 0, min_after_vec = 1, max_after_vec = 0,
min_after_base = 1, max_after_base = 0, offset_unsigned = 0, scale =
161},
          rt_cselib = 0x8a18ae0, rt_bit = 0x8a18ae0, rt_tree =
0x8a18ae0, rt_bb = 0x8a18ae0, rt_mem = 0x8a18ae0, rt_reg = 0x8a18ae0,
          rt_constant = 0x8a18ae0}, {rt_int = 0, rt_uint = 0, rt_str =
0x0, rt_rtx = 0x0, rt_rtvec = 0x0, rt_type = VOIDmode,
rt_addr_diff_vec_flags = {
            min_align = 0, base_after_vec = 0, min_after_vec = 0,
max_after_vec = 0, min_after_base = 0, max_after_base = 0,
offset_unsigned = 0,
            scale = 0}, rt_cselib = 0x0, rt_bit = 0x0, rt_tree = 0x0,
rt_bb = 0x0, rt_mem = 0x0, rt_reg = 0x0, rt_constant = 0x0}, {rt_int =
589871,
          rt_uint = 589871, rt_str = 0x9002f <Address 0x9002f out of
bounds>, rt_rtx = 0x9002f, rt_rtvec = 0x9002f, rt_type = 589871,
          rt_addr_diff_vec_flags = {min_align = 47, base_after_vec =
0, min_after_vec = 0, max_after_vec = 0, min_after_base = 0,
max_after_base = 0,
            offset_unsigned = 0, scale = 9}, rt_cselib = 0x9002f,
rt_bit = 0x9002f, rt_tree = 0x9002f, rt_bb = 0x9002f, rt_mem =
0x9002f, rt_reg = 0x9002f,
          rt_constant = 0x9002f}}, block = 0x88a25c0, offset =
143266688}, rv = {cl = 0, decimal = 0, sign = 0, signalling = 0,
canonical = 1,
      uexp = 2262571, sig = {0, 589871, 143271360}}, fv = {data = {low
= 144804576, high = 0}, mode = 589871}}}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]