LINUX.ORG.RU

Завесил компилятор

 ,


0

3

Посоны, я тут компилятор повесил, gcc-9.2 под arm.

После нескольких итерация пришёл к выводу, что виноваты флаги оптимизации, с -O1 и -O2 висит, с -O0 - нет. Ещё поковырял и нашёл, что виноват -fvar-tracking. Висит процесс cc1plus. Подсоединившись отладчиком вижу вот это:

#0  0x000000000074f58f in find_base_term(rtx_def*, vec<std::pair<cselib_val*, elt_loc_list*>, va_heap, vl_ptr>&) ()
#1  0x000000000074f6c1 in find_base_term(rtx_def*, vec<std::pair<cselib_val*, elt_loc_list*>, va_heap, vl_ptr>&) ()
#2  0x000000000074f54b in find_base_term(rtx_def*, vec<std::pair<cselib_val*, elt_loc_list*>, va_heap, vl_ptr>&) ()
#3  0x000000000074f6c1 in find_base_term(rtx_def*, vec<std::pair<cselib_val*, elt_loc_list*>, va_heap, vl_ptr>&) ()
#4  0x000000000074f54b in find_base_term(rtx_def*, vec<std::pair<cselib_val*, elt_loc_list*>, va_heap, vl_ptr>&) ()
#5  0x000000000074f6c1 in find_base_term(rtx_def*, vec<std::pair<cselib_val*, elt_loc_list*>, va_heap, vl_ptr>&) ()
#6  0x000000000074f54b in find_base_term(rtx_def*, vec<std::pair<cselib_val*, elt_loc_list*>, va_heap, vl_ptr>&) ()
#7  0x000000000074f9a4 in find_base_term(rtx_def*) ()
#8  0x0000000000752b9d in true_dependence_1(rtx_def const*, machine_mode, rtx_def*, rtx_def const*, rtx_def*, bool) ()
#9  0x0000000000db1935 in drop_overlapping_mem_locs(variable**, overlapping_mems*) ()
#10 0x0000000000db1a7a in clobber_overlapping_mems(dataflow_set*, rtx_def*) ()
#11 0x0000000000db207b in val_store(dataflow_set*, rtx_def*, rtx_def*, rtx_insn*, bool) ()
#12 0x0000000000db29a5 in vt_emit_notes() ()
#13 0x0000000000db4d65 in (anonymous namespace)::pass_variable_tracking::execute(function*) ()
#14 0x0000000000a7087a in execute_one_pass(opt_pass*) ()
#15 0x0000000000a70fc8 in execute_pass_list_1(opt_pass*) ()
#16 0x0000000000a70fda in execute_pass_list_1(opt_pass*) ()
#17 0x0000000000a70fda in execute_pass_list_1(opt_pass*) ()
#18 0x0000000000a71019 in execute_pass_list(function*, opt_pass*) ()
#19 0x00000000007bc01f in cgraph_node::expand() ()
#20 0x00000000007bcec5 in symbol_table::compile() [clone .part.64] ()
#21 0x00000000007beffd in symbol_table::finalize_compilation_unit() ()
#22 0x0000000000b2e64d in compile_file() ()
#23 0x0000000000587fb5 in toplev::main(int, char**) ()
#24 0x000000000058a41b in main ()

Компилируемый код работал на gcc-6.2. Как дальше искать виновника? Регрессия компилятора или в коде косяк? В файле 850 строк, выложить не могу. Думаю, как локализовать то, на чём компилер висит.

★★★★★

Код не должен вешать компилятор, репорть баг (предварительно поищи, может уже зарепортили).

Serral
()

Ну если локализовать и выложить не можешь, то тебе к телепатам. Похоже на дедлок. CPU жрёт?

DELIRIUM ☆☆☆☆☆
()

Ещё поковырял и нашёл, что виноват -fvar-tracking

Походу я погорячился, Это опция отладки, а не оптимизатора. Но стектрейс выдаёт похожий, т.е. висит, вероятно, по той же причине.

UVV ★★★★★
() автор топика
Ответ на: комментарий от DELIRIUM

Похоже на дедлок. CPU жрёт?

Да, 100%.

UVV ★★★★★
() автор топика
Ответ на: комментарий от DELIRIUM

Ну если локализовать и выложить не можешь, то тебе к телепатам.

Походу надо компилятор перекомпилить с -g, чтобы увидеть, где он споткнулся, иначе не смогу локализовать. Ладно, часа 2-3 уйдёт на это, он после пересборки захочит остальных монстров пересобрать.

UVV ★★★★★
() автор топика

Попробуй cгенерить asm-код с -fverbose-asm. Возможно где-то рядом с ошибкой остановится.

anonymous
()
Ответ на: комментарий от iamweasel

Этот я видел. Там написано RESOLVED FIXED Version 8.0.1. У меня 9.2.

UVV ★★★★★
() автор топика

Как и любой другой баг - берешь creduce и локализуешь, в качестве теста можно использовать выполнение дольше минуты, потом постепенно уменьшать интервал

annulen ★★★★★
()

Про creduce уже сказали, ещё есть delta. creduce должно быть быстрее, но можно оба варианта попробовать.

xaizek ★★★★★
()

Я с gcc не очень знаком. Шланг тоже виснет? Со шлангом могу попробовать помочь.

DELIRIUM ☆☆☆☆☆
()

Посоны, я нашёл, в чём было дело.

Вот моя проблема: https://stackoverflow.com/questions/41617566/initialize-c-struct-on-the-heap-instead-of-the-stack/41618473

Отыскал в коде структуру, которая создавалась на стеке и инициализировалась в 2000 строк (include’ом). sizeof сказал, что размер структуры был примерно 100к. Но вот оптимизатор не мог это заглотить. Точнее -O1 компилировал секунд 40, -O2 я ждал 7 минут, но он так и не закончил. Убрал структуру со стека в static, всё заработало.

UVV ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.