Hi guys,
I've spent a couple of days porting FPC to DragonFly BSD with some
success.

> uname -a
        DragonFly banshee.x.com 3.9-DEVELOPMENT DragonFly
        v3.9.0.710.g6792a-DEVELOPMENT #0: Fri Oct 24 18:32:12 CEST 2014
        [email protected]:/usr/obj/usr/src/sys/X86_64_BANSHEE_SMP
        x86_64

> bin/fpc -i
        Free Pascal Compiler version 2.6.4
        
        Compiler Date      : 2014/11/18
        Compiler CPU Target: x86_64
        
        Supported targets:
          Linux for x86-64
          FreeBSD for x86-64
          Win64 for x64
          Darwin for x86_64
          Solaris for x86-64 (under development)
          OpenBSD for x86-64 (under development)
          NetBSD for x86-64 (under development)
          DragonFly for x86-64
        
        Supported CPU instruction sets:
          ATHLON64
        
        Supported FPU instruction sets:
          SSE64
          SSE3
        
        Supported ABI targets:
          DEFAULT
          SYSV
          AIX
          EABI
          ARMEB
        
        Supported Optimizations:
          REGVAR
          STACKFRAME
          LOOPUNROLL
          TAILREC
          CSE
        
        Supported Whole Program Optimizations:
          All
          DEVIRTCALLS
          OPTVMTS
          SYMBOLLIVENESS
        
        Supported Microcontroller types:
        
        This program comes under the GNU General Public Licence
        For more information read COPYING.v2
        
        Please report bugs in our bug tracker on:
                         http://bugs.freepascal.org
        
        More information may be found on our WWW pages (including directions
        for mailing lists useful for asking questions or discussing potential
        new features, etc.):
                         http://www.freepascal.org


Since DragonFly uses the FreeBSD ports collection, the plan was to start
with patches there and then get most of them into the repository (x86_64
only).  However I hit a snag in the middle of the bootstrapping process
and I could use some help.  It won't compile because it can't find the
units, but it can't find the units because it can't properly find out if
a directory exists.

> bin/fpc -vut
        Configfile search: /home/marino/.fpc.cfg
        Configfile search: /usr/local/etc/fpc.cfg
        Reading options from file /usr/local/etc/fpc.cfg
        Path "./lib/fpc/2.6.4/units/x86_64-dragonfly/" not found
        Path "./lib/fpc/2.6.4/units/x86_64-dragonfly/*/" not found
        Path "./lib/fpc/2.6.4/units/x86_64-dragonfly/rtl/" not found
        Path "/home/marino/.fppkg/lib/fpc/2.6.4/units/x86_64-dragonfly/*/" not
found
        Path "/usr/lib/" not found
        Path "/lib/" not found
        Free Pascal Compiler version 2.6.4 [2014/11/18] for x86_64
        Copyright (c) 1993-2014 by Florian Klaempfl and others
        Fatal: No source file name in command line
        Fatal: Compilation aborted
        Error: bin/ppcx64 returned an error exitcode (normal if you did not
specify a source file to be compiled)


I've narrowed down the problem to a malfunctioning strpas command, and
further to the "move" command.  I've temporarily disabled the assembly
routines and I'm using the generic "move" command.  What's going on is
the move "dest" argument is receiving a different address location than
the procedure that calls it gives.  So the string copy works, but it's
getting copied to the wrong location.  See below


> gdb bin/fpc
        GNU gdb (GDB) 7.6.1
        Copyright (C) 2013 Free Software Foundation, Inc.
        License GPLv3+: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>
        This is free software: you are free to change and redistribute it.
        There is NO WARRANTY, to the extent permitted by law.  Type "show 
copying"
        and "show warranty" for details.
        This GDB was configured as "x86_64-dragonfly".
        For bug reporting instructions, please see:
        <http://bugs.dragonflybsd.org/>...
        Reading symbols from /usr/local/bin/fpc...done.
        (gdb) set args -vut
        (gdb) b generic.inc:886
        Breakpoint 1 at 0x403b5f: file ../inc/generic.inc, line 886.
        (gdb) r
        Starting program: /usr/local/bin/fpc -vut
        
        Breakpoint 1, fpc_shortstr_to_shortstr (RES=..., highRES=255, SSTR=...)
            at ../inc/generic.inc:886
        886     ../inc/generic.inc: No such file or directory.
        (gdb) p sstr
        $1 = '/etc/localtime'
        (gdb) p slen
        $2 = 14
        (gdb) p @sstr
        $3 = (^SHORTSTRING) 0x658c48 '/etc/localtime'
        (gdb) p @res
        $4 = (^
            OPENSTRING) 0x7ffffffff228
'????'#127#0#0'?????'#127#0#0#27'WD'#0#0#0#0#0'??
        
Z'#2#1#0#0#0#1#0#0#0'?#'#4#138'?'#129'R'#128#0#0#0#0#0#0#0#0'?????)kT'#0#0#0#0'?
        
?S&'#0#0#0#0':?qP'#0#0#0#0#8#129'|,'#0#0#0#0':?qP'#0#0#0#0#8#129'|,'#0#0#0#0'6'#
        8#0#0#0#0#0#0#4#0#0#0#0#0#0#0#0'@', #0 <repeats 30 times>,
#2#16#0#0#0#0#0#0#3#0
        #0#0#0#0#0#0#0#128#0 <repeats 30 times>,
#16'????'#127#0#0#149#143'A'#0#0#0#0#0#
        0'?t'#0#8#0#0#0
        (gdb) s
        MOVE (SOURCE=0, DEST=0, COUNT=15) at ../inc/generic.inc:30
        30      in ../inc/generic.inc
        (gdb) p @dest
        $5 = (^formal) 0x7ffffffff3e0
        (gdb) p @source
        $6 = (^formal) 0x658c48
        (gdb)


As you can see, the address of "dest" should be 0x7ffffffff228 but it
comes as 0x7ffffffff3e0.  The address of "source", a constant, is
maintained through the call.  For convenience, I've pasted the
interesting code below:

   generic.inc: line 879
        procedure fpc_shortstr_to_shortstr(out res:shortstring; const sstr:
shortstring
        var
          slen : byte;
        begin
          slen:=length(sstr);
          if slen>high(res) then
            slen:=high(res);
          move(sstr[0],res[0],slen+1);
          res[0]:=chr(slen);
        end;
        
   generic.inc: line 25
        procedure Move(const source;var dest;count:SizeInt);[public, alias:
'FPC_MOVE']
        var
          aligncount : sizeint;
          pdest,psrc,pend : pbyte;
        begin
        // snipped
        end;

Maybe "dest" is getting passed by value rather than by reference.  Does
anyone have any idea where I can start looking in the code?  gdb won't
tell me what source code is responsible for this.       

Getting FPC to run as a first-class citizen on DragonFly has been a
long-term goal of mine (ENOTIME) but I'm so close so I hope someone can
help.  I also found a couple of mistakes in generic BSD code so my
patches will improve support for other BSDs potentially.

Regards,
John
_______________________________________________
fpc-devel maillist  -  [email protected]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to