О релизах и багах

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Сообщение PVOzerski » 02.06.2005 10:34:16

В продолжение разговора о смартлинке и .edata в Win32:
IMHO, следует иметь в виду следующее: при компиляции под смартлинк компилятор делает из юнита coff-библиотеку, притом если не включено использование внешнего ассемблера, то не задействуется даже библиотекарь ar. Если, Иван, идти твоим путем (принудительная прилинковка модуля с .edata с помощью явного его указания линкеру), придется либо придумывать особый режим генерации для этого модуля (IMHO, это не самая простая задача, с учетом структурной организации FPC), либо извлекать нужный obj-файл из библиотеки перед линковкой (что выглядит кривовато). Может, лучше всё-таки починить проверенный вариант с меткой?
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

Сообщение Иван Шихалев » 02.06.2005 11:38:05

придется либо придумывать особый режим генерации для этого модуля (IMHO, это не самая простая задача, с учетом структурной организации FPC), либо извлекать нужный obj-файл из библиотеки перед линковкой

С какой радости? OBJ для основного файла существует. Надо просто его задействовать, как и при линковке EXE. Извлечение из юнитов же пойдет так же как и для EXE.
Или я не понял вопроса?
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Сообщение PVOzerski » 03.06.2005 12:32:54

>OBJ для основного файла существует
Иван, как ты предлагаешь задействовать obj-файл модуля program при смартлинке?

Смотри, что происходит (юзаю один из заключительных билдов 1.9, но вряд ли в 2.0 это сильно иначе):

Вот мы пишем такую прогу:

library test;
procedure proc;export;
begin
end;
exports
proc;
begin
writeln('Hello, world! I has been loaded!');
end.

Вот какой link.res получается при компиляции без смартлинка:

SEARCH_DIR(D:\PAS\fpc102\units\win32\)
SEARCH_DIR(D:\PAS\fpc102\bin\win32\)
INPUT(
D:\PAS\fpc102\units\win32\wdllprt0.o
test.o
)
GROUP(
D:\PAS\fpc102\units\win32\libpSystem.a
)

А вот какой - при смартлинке:

SEARCH_DIR(D:\PAS\fpc102\units\win32\)
SEARCH_DIR(D:\PAS\fpc102\bin\win32\)
INPUT(
D:\PAS\fpc102\units\win32\wdllprt0.o
)
GROUP(
libptest.a
D:\PAS\fpc102\units\win32\libpSystem.a
)

То есть при смартлинке obj-файл главного модуля вообще не прилинковывается.Ты хочешь предложить игнорировать смартлинк для главного модуля и линковать obj-файл вместо библиотеки? А у тебя есть уверенность, что тогда ты сможешь избавиться от всего "мертвого кода", который может в нем содержаться? Вот смотри еще тест. На сей раз это не dll, а экзешник.

procedure TTTT;
begin
writeln('Hello');
end;

begin
end.


Теперь посмотри на asm-код, сделанный компилятором для генерации .o-файла:

.file "tt2.pp"

.section .text

.section .text
.balign 4
.balign 4
.globl P$PROGRAM_TTTT
P$PROGRAM_TTTT:
pushl %ebp
movl %esp,%ebp
subl $4,%esp
movl %ebx,-4(%ebp)
call fpc_get_output
movl %eax,%ebx
movl $_$PROGRAM$_L10,%ecx
movl %ebx,%edx
movl $0,%eax
call fpc_write_text_shortstr
call FPC_IOCHECK
movl %ebx,%eax
call fpc_writeln_end
call FPC_IOCHECK
movl -4(%ebp),%ebx
leave
ret

.section .text
.balign 4
.balign 4
.globl PASCALMAIN
PASCALMAIN:
.globl _main
_main:
pushl %ebp
movl %esp,%ebp
call FPC_INITIALIZEUNITS
call FPC_DO_EXIT
leave
ret
.balign 4

.section .data
.ascii "FPC 1.9.9 [2005/04/27] for i386 - Win32"
.balign 4
.balign 4
.globl THREADVARLIST_P$PROGRAM
THREADVARLIST_P$PROGRAM:
.long 0
.balign 4
.globl FPC_THREADVARTABLES
FPC_THREADVARTABLES:
.long 2
.long THREADVARLIST_SYSTEM
.long THREADVARLIST_P$PROGRAM
.balign 4
.globl FPC_RESOURCESTRINGTABLES
FPC_RESOURCESTRINGTABLES:
.long 0
.balign 4
.globl INITFINAL
INITFINAL:
.long 1,0
.long INIT$_SYSTEM
.long FINALIZE$_SYSTEM
.balign 4
.globl __stklen
__stklen:
.long 262144
.globl __heapsize
__heapsize:
.long 0

.section .data

.section .data
.balign 4
.globl _$PROGRAM$_L10
_$PROGRAM$_L10:
.ascii "\005Hello\000"

.section .data

.section .data

.section .bss

Можно видеть, что "мертвая" процедура TTTT никуда не делась, осталась в коде и должна попасть в конечный экзешник. Конечно, это изъян оптимизатора, но что на данном этапе проще: переделывать оптимизацию или переложить кое-что на линкер?

BTW, я вообще плохо понимаю, чего ради компилятор генерит .o-файл параллельно с библиотекой, если велено компилировать под смартлинк.
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

Сообщение Иван Шихалев » 03.06.2005 13:00:53

Тем не менее, при компиляции exe в link.res попадает именно .o, и ни что иное. Да, при этом остается мертвый код, но я не вижу в этом проблемы.

Более корретное решение — пересматривать весь smartlink... Не думаю, что это реально.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Сообщение PVOzerski » 06.06.2005 17:15:50

Итак, патч для smartlink'а подключен к версии 2.1. Что дальше? Предлагаю на повестку дня ставить поддержку секции Exports в юнитах. Примерный путь реализации - изменение формата PPU-шек с добавлением возможности включения в них информации об экспортируемых элементах (процедурах, функциях, переменных).
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

Сообщение Romtek » 12.09.2005 12:16:53

Участник volvo877 форума Исходников заметил баг в программе с конструкцией CASE OF :
Я тут столкнулся с непонятным поведением FPC. Допустим, имеется такой код:
Код: Выделить всё
var
 i, j: integer;
begin
 for i := 1 to 10 do
   for j := 1 to 10 do
     case (odd(i) and odd(j)) of
       true : writeln('i and j are ODD numbers');
       false: writeln('...')
     end;
end.

И при его компиляции (в любом {$mode ...}) я получаю RTE 35, и как следствие - ошибку IDE... В то же время и вот такой код:
Код: Выделить всё
var good: boolean;
...
 good := (odd(i) and odd(j));
 case good of
 ...
 end
и даже вот такой:
Код: Выделить всё
 case odd(j) of
 ...
 end;
прекрасно компилируются...

Я уже было подумал, что FPC не позволяет вычислять выражения в Case, но вот это:
Код: Выделить всё
function f(x: integer): integer;
begin {...} end;
...
 case f(i) + f(j) of
   1: writeln('sum = 1');
   4: writeln('sum = 4');
 end;
тоже компилируется и отрабатывает. Так почему же самая первая программа делает проблемы? Может, кто-нибудь сталкивался с подобным?

Компилятор FPC 2.0.0 (Target - Win32)

По заверению другого участника этот код работает без проблем в версии 1.0.10.
По моим наблюдениям есть баг в CASE OF только для булевых выражений:
Код: Выделить всё
     for i := 1 to 10 do
     case (odd(i) and odd (i*i)) of
       true : writeln (i , 'is ODD number');
       false: writeln ('...')
     end;
Аватара пользователя
Romtek
постоялец
 
Сообщения: 190
Зарегистрирован: 22.05.2005 12:29:35
Откуда: Рамат Ган

Сообщение PVOzerski » 07.10.2005 11:03:16

У меня такое неприятное наблюдение: использование оператора with внутри процедур/функций, объявленных как inline, приводит к ошибкам на этапе компиляции. В зависимости от подверсии компилятора (2.x.x) это либо AV, либо internal error, с чего не легче :(
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

Сообщение Sphinx » 10.10.2005 16:25:49

PVOzerski
Я сталкивался с такой проблемой.
<a href='http://freepascal.ru/forum/index.php?showtopic=311' target='_blank'>http://freepascal.ru/forum/index.php?showtopic=311</a>

только не понял что именно из-за with падает...
Спасибо :)
Sphinx
новенький
 
Сообщения: 33
Зарегистрирован: 27.09.2005 21:52:09

Сообщение STAKANOV » 14.10.2005 12:32:55

У меня на директиву
{$threading on}
выдает:
Free Pascal Compiler version 2.0.0 [2005/09/10] for i386
Copyright © 1993-2005 by Florian Klaempfl
Target OS: FreeBSD/ELF for i386
Compiling pbs.pas
pbs.pas(1,2) Warning: Illegal compiler directive "$THREADING"
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение AShen » 14.10.2005 15:23:04

Мда, всё конечно интересно, но вот такой момент - поставил сегодня lazarus-0.9.11-20051013 и что я вижу? Опять не могу писать по русски в редакторе исходного кода. Как исправить?

Изображение
Аватара пользователя
AShen
постоялец
 
Сообщения: 155
Зарегистрирован: 26.08.2005 10:22:44
Откуда: Новороссийск

Сообщение Иван Шихалев » 14.10.2005 18:21:01

У меня на директиву {$threading on}

Она устарела
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Сообщение STAKANOV » 21.10.2005 21:46:33

Явный баг - <a href='http://freepascal.ru/forum/index.php?showtopic=369' target='_blank'>http://freepascal.ru/forum/index.php?showtopic=369</a>

Я им кратко написал - <a href='http://www.freepascal.org/bugs/showrec.php3?ID=4457' target='_blank'>http://www.freepascal.org/bugs/showrec.php3?ID=4457</a>
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение virt » 01.12.2005 13:02:54

Недочет при чтении из файла.
При чтении из файла read'ом или readln'ом если после последнего числа (например) не стоит пробел или символ перевода строки ,то последнее значение не читается.

Это исправлено в следующей версии или даже и не планируется?
virt
новенький
 
Сообщения: 35
Зарегистрирован: 01.12.2005 12:31:41

Сообщение balou » 07.12.2005 17:53:52

Присоединяюсь к virt. Действительно этот БАГ есть.
read не обращает внимание на конец файла, ей подавай 26-й символ.
Специально перешли на FP c BP чтобы избавиться от постоянных дискуссий на тему: "Что такое текстовый файл?" и тут тебе на...
balou
 

Сообщение Nobushige » 06.01.2006 14:32:34

Простите, пожалуйста, чайника, но...

Правильно ли, что при сборке и исполнении такой вот программы:

program stupid_test;
{$mode objfpc}
uses strings;
var
c:pchar;
begin
c:=StrNew('test');
writeln(c<>Nil);
StrDispose©;
writeln(c<>Nil);
end.

на экран оба раза выводится TRUE?

Не лучше ли исправить в файле strings.pp

procedure strdispose(p : pchar);

на

procedure strdispose(var p : pchar);

?????

С уважением, Nobushige
Nobushige
 

Пред.След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru