Компиляция GCC 4.xx на сбоях MinGW / MSYS - PullRequest
4 голосов
/ 24 июля 2010

В течение последней недели я пытался скомпилировать любой из компиляторов серии GCC 4 для запуска в MinGW 5.1.6 / MSYS 1.0.11 (автоматические установщики с Sourceforge.org), которые поставляются с версией GCC. 3.4.5. Конечная цель - установить GCC 4.5 для установки, но я не смог собрать ни один из компиляторов 4.x.x.

Я сузил его до последовательности инструкций по сборке, которые приводят к необычному поведению. Компилятор выполняет:

build/genmodes.exe > tmp-modes.c
/bin/sh ../../gcc-4.2.4/gcc/../move-if-change tmp-modes.c insn-modes.c
echo timestamp > s-modes
gcc -c   -g -fkeep-inline-functions -DIN_GCC   -W -Wall -Wwrite-strings
-Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -Wmissing-format-attribute
-fno-common   -DHAVE_CONFIG_H -I. -I. -I../../gcc-4.2.4/gcc -I../../gcc-4.2.4/gcc/.
-I../../gcc-4.2.4/gcc/../include -I./../intl -I../../gcc-4.2.4/gcc/../libcpp/include
-I../../gcc-4.2.4/gcc/../libdecnumber -I../libdecnumber    insn-modes.c -o insn-modes.o

cc1.exe: out of memory allocating 2239725803 bytes
make[3]: *** [insn-modes.o] Error 1
make[3]: Leaving directory `/home/root/gcc-4.2.4-build/gcc'
make[2]: *** [all-stage1-gcc] Error 2
make[2]: Leaving directory `/home/root/gcc-4.2.4-build'
make[1]: *** [stage1-bubble] Error 2
make[1]: Leaving directory `/home/root/gcc-4.2.4-build'
make: *** [all] Error 2

Основной проблемой, похоже, является вызов genmodes.exe. Он создает файл C (insn-modes.c) размером около 2 ГБ, который, насколько я могу судить, заполнен в основном пробелами (хотя здесь и там разбросаны отдельные строки кода C). GCC 3.4.5 захлебывается этим и на этом сборка заканчивается. Подобное поведение проявляется во всех версиях, которые я пробовал, кроме 4.5, которая не работает по другим причинам, которые, как я надеялся, будут вылечены с помощью промежуточной версии компилятора.

Итак, три вопроса:

  1. Кто-нибудь еще испытывал это?
  2. Что вызывает это?
  3. Что, если есть обходной путь?

Я пытаюсь сделать это на 64-битной машине с Windows 7.

Спасибо.

Обновление: я загрузил сжатую копию двух подозрительных файлов в эту папку. Оказывается, min-insn-modes.c также больше, чем должно быть. Два файла (общим объемом более 3 ГБ) сжимаются до 121 КБ.

Ответы [ 3 ]

3 голосов
/ 25 июля 2010

У меня такая же проблема;Я сузил его до tagged_printf в genmodes.c.Я до сих пор не знаю, почему это не удалось, но замена определения tagged_printf (от do до, включая время) следующим решала проблему:

#define tagged_printf(FMT, ARG, TAG) printf(" " FMT ",\n", ARG)

2 голосов
/ 09 августа 2010

Документация MSDN гласит:

Примечание о безопасности. Формат% n по своей природе небезопасен и по умолчанию отключен; если% n встречается в строке формата, вызывается неверный обработчик параметра, как описано в разделе «Проверка параметров». Чтобы включить поддержку% n, см. _set_printf_count_output.

Таким образом, _set_printf_count_output (1) должна решить проблему. Да, это отстой.

2 голосов
/ 24 июля 2010

insn-modes.c не должен быть гигантским или заполненным пробелами;genmodes работает со сбоями.Я не знаю, почему это так не получится, но мне было бы очень любопытно взглянуть на insn-modes.c (если вы поместите его в файл .zip, который уменьшит его до такой степени, что вы сможетеразумно загрузите его куда-нибудь и отредактируйте URL-адрес в своем вопросе.)

Удаление всех лишних пробелов из файла вручную (tr -s ' \r\n\t\v\f' ' ') может дать вам что-то, что можно скомпилировать.

РЕДАКТИРОВАТЬ: Я посмотрел на загруженный вами файл min-insn-modes.c, и я думаю, что Брайан прав, в tagged_printf есть ошибка: каждый раз, когда она вызывается, она выдает что-то вроде 7 миллионов пробелов.Изменения Брайана помогут вам преодолеть это препятствие, или вы могли бы помочь исследовать немного дальше, изменив определение следующим образом:

#define tagged_printf(FMT, ARG, TAG) do { \
    int count_ = printf (" " FMT ",", ARG); \
    printf ("\t/* %s [%d], */\n", TAG, count_); \
} while (0)

Это также должно сделать вашу сборку успешной, и я бы хотел увидетьinsn-modes.c с этим изменением.(Также не нужен insn-modes.c.)

ДОПОЛНЕНИЕ: Пожалуйста, ознакомьтесь с функцией emit_insn_modes_h () .Он также содержит printf со спецификатором % n , который необходимо изменить аналогично приведенному выше:

int count_ = printf ("  %smode,", m->name);

Без этого изменения insn-modes.h также заполняетсяс огромным количеством пробелов.

...