Re: Компиляция Refal6 для Linu


Subject: Re: Компиляция Refal6 для Linu
From: Arkady Klimov (klark@bagirra.net)
Date: Sun Oct 28 2001 - 18:24:25 MSK


----- Original Message -----
From: <dmsidorov@mtu-net.ru>
To: Arkady Klimov <klark@bagirra.net>
Cc: refal <refal@botik.ru>
Sent: Saturday, October 27, 2001 11:26 PM
Subject: Re: Компиляция Refal6 для Linux

| On Fri, Oct 26, 2001 at 08:28:50PM +0400, Arkady Klimov wrote:
| > Здравствуйте, Дмитрий,
| > с указанной Вами ошибкой я в некоторой растерянности. (На С
| > я уже более 5 лет не работаю). Почему-то до сих пор ни один
| > компилятор в этом месте не брыкался. Что сие означает? Верно
| > ли, что по стандарту языка правая часть инициализатора обязана
| > быть константой? И почему stderr - не константа?
|
| Здравствуйте, Аркадий.
|
| Мои познания в C++ весьма невелики, как инженер всегда старался
| использовать Паскаль или что-нибудь скриптовое, но вот что написано
| в FAQ к gcc2.95:

Рефал-система написана на С (а не С++). Поэтому у меня возникает вопрос,
указали ли Вы компилятору, что это С, а не С++ (или он понимает это
автоматически по расширению имени файла?)

|
| Why can't I initialize a static variable with stdin?
| This has nothing to do with gcc, but people ask us about it a lot.
| Code like this:
|
| #include <stdio.h>
| FILE *yyin = stdin;
|
| will not compile with GNU libc (Linux libc6), because stdin is not a
| constant. This was done deliberately, in order for there to be no
| limit on the number of open FILE objects. It is surprising for people
| used to traditional Unix C libraries, but it is permitted by the C
| standard.
|
| Так что, получается, под Linux это будет считаться ошибкой как минимум
| до выхода новой glibc, а может, и дальше.
| Кроме того, glibc теперь включает в себя определения myulong и myushort
| (заголовок <sys/types.h>, включаемый через <stdlib.h>), полностью
| идентичные тем, что в исходниках Рефала, поэтому ошибки не возникает,
| но выдаются предупреждения об их переопределении. Чтобы избежать
| двойного определения, возможно, следует использовать препроцессорную
| директиву вроде
|
| #if __GLIBC__ >= 2
|
| но я пока не смотрел, начиная с какой версии это появилось.

Спасибо за информацию

|
| > В принципе, можно, наверно, поступить и так:
| >
| > 1.удалить эту строку 43 rfstor.h
| >
| > 2.заменить строку 40 rfstor.h на строку:
| > EXT FILE * stdtrc; /* File for debug information */
| > (было:
| > extern FILE * stdtrc; /* File for debug information */
| > )
| >
| > 3. Вставить инициализацию
| > stdtrc = stderr;
| > первым оператором в функцию initstor (файл rfstor.c, строка 256)
| > (эта функция вызывается первой в функции main).
|
| Этот способ сработал, после исправлений rfstor.c скомпилировался
| нормально. Теперь остались нескомпилированы rfarm.c и rbarm.c.
| В rbarm.c строка 252 содержит определение matherr, конфликтующее с
| аналогичным в <math.h>:
|
| # ifdef __cplusplus
| extern int matherr __P ((struct __exception *__exc));
| # else
| extern int matherr __P ((struct exception *__exc));
| # endif
|
matherr - это, как говорят, callback-функция для перехвата арифметических ошибок
(типа деления на 0). Она должна иметь определенный заголовок.
Можете попробовать поставить тот, который тут написан (вероятно, нижний,
поскольку используется С, а не С++).

| Сообщение об ошибке в rfarm.c совершенно непонятно:
|
| rfarm.c: In function `rf_cgetnumb':
| rfarm.c:289: Unable to generate reloads for:
| (insn 45 43 47 (parallel[
| (set (reg:SI 0 %eax)
| (fix:SI (fix:SF (reg/v:SF 0 %eax))))
| (clobber (mem:HI (plus:SI (reg:SI 6 %ebp)
| (const_int -2 [0xfffffffe])) 0))
| (clobber (mem:HI (plus:SI (reg:SI 6 %ebp)
| (const_int -4 [0xfffffffc])) 0))
| (clobber (mem:SI (plus:SI (reg:SI 6 %ebp)
| (const_int -8 [0xfffffff8])) 0))
| (clobber (scratch:HI))
| ] ) 145 {fix_truncsfsi2+1} (insn_list 92 (nil))
| (expr_list:REG_EQUIV (mem:SI (reg/v:SI 3 %ebx) 0)
| (expr_list:REG_DEAD (reg/v:SF 0 %eax)
| (expr_list:REG_UNUSED (scratch:HI)
| (nil)))))
| make: *** [rfarm.o] Error 1
|
| Что делать с определением matherr в rbarm.c, я еще мог бы попробовать
| докопаться, но насчет rfarm.c никаких идей нет. Я еще не подписан, поэтому,
| если есть что подсказать, пишите не только в рассылку, но и на мой адрес.
|

Мне это тоже непонятно. Больше похоже на ошибку внутри компилятора С.
Поскольку сообщение привязано к последней строке
определения функции rf_cgetnumb, истинная причина может быть где-угодно
внутри нее. Поэтому попробуйте руками найти проблемный оператор путем
закомментирования различных частей ее кода. А там попробуем найти обход.
Аркадий.

| С уважением, Дмитрий.
|
|
| > | ----- Original Message -----
| > | From: dmsidorov@mtu-net.ru
| > | To: klimov@keldysh.ru
| > | сожалению, компиляция завершилась неудачей со следующим сообщением
| > | об ошибке:
| > |
| > | gcc rfstor.c -O -c -ggdb
| > | In file included from refcom.h:55,
| > | from refgen.h:16,
| > | from refint.h:14,
| > | from rfstor.c:6:
| > | rfstor.h:43: initializer element is not constant



This archive was generated by hypermail 2b25 : Mon Oct 25 2004 - 21:24:59 MSD