I am using the FPC compiler to compile embedded ARM7 code (LPC21xx / LPC23xx).
For this purpose, I use the 2.05 compiler, and it is working without problems 
at all.
However, because we are using the 2.62 compiler on other platforms, I have 
compiled a new
system unit for the ARM7 platform with the 2.62 compiler. I then ran into this 
problem.

The old compiler uses "fpc_chararray_to_shortstr" to comvert from an array of 
char to a
shortstring. That works OK.

The 2.62 compiler wants to use "fpc_chararray_to_ansistr" to the same job, and 
that is a
problem because my ARM7 system unit do not support ansistrings (and should not).

The {$LONGSTRINGS OFF} directive is given at the beginning of the program, and 
that
eliminates any problems with "long strings" using the 2.05 compiler. That does 
not seem to
work with the new compiler.

Is there a way around this problem?

Carsten



FPC 2.05
# [38] Val(pChar16(LineDataOfset)^,NameDataOfset,p);
        sub     r5,r11,#568
        ldr     r0,.L57
        ldr     r4,[r0]
        mov     r3,#1
        mov     r2,#15
        mov     r1,r4
        sub     r0,r11,#824
        bl      fpc_chararray_to_shortstr
        sub     r1,r11,#824
        mov     r0,#4
        mov     r2,r5
        bl      fpc_val_sint_shortstr
        ldr     r1,.L68
        str     r0,[r1]
        ldr     r0,.L71
        sub     r3,r11,#568
        mov     r2,#2
.L72:
        ldrb    r1,[r3], #1
        subs    r2,r2,#1
        strb    r1,[r0], #1
        bne     .L72

FPC 2.62
# [38] Val(pChar16(LineDataOfset)^,NameDataOfset,p);
        sub     r0,r11,#628
        bl      FPC_ANSISTR_DECR_REF
        mov     r0,#0
        str     r0,[r11, #-628]
        ldr     r0,.Lj13
        ldr     r1,[r0]
        sub     r0,r11,#628
        mov     r3,#1
        mov     r2,#15
        bl      fpc_chararray_to_ansistr
        ldr     r1,[r11, #-628]
        sub     r2,r11,#116
        mov     r0,#4
        bl      fpc_val_sint_ansistr
        ldr     r1,.Lj70
        str     r0,[r1]
        ldrb    r0,[r11, #-116]
        ldr     r1,.Lj73
        strb    r0,[r1]
        ldrb    r0,[r11, #-115]
        strb    r0,[r1, #1]
        .stabn 68,0,39,_$LINEINFO$_Ll9 -




unit lineinfo;
{$LONGSTRINGS OFF}
{$Assertions off}
{$RANGECHECKS OFF}
{$OVERFLOWCHECKS OFF}
{$S- STACK CHECKING OFF}


interface

procedure GetLineInfo(addr:pointer; var 
FuncStringListPointer,SrcStringListPointer:pChar;
var line:longWord);


implementation
uses
  LineInfoTyp;

var
  data_beg_src:byte; external name '__data_beg_src__';
  data_beg:byte; external name '__data_beg__';
  data_end:byte; external name '__data_end__';
  LineDataOfset,EndLineDataOfset,NameDataOfset:Longint;         {Skal være 
longint}
  p:integer;

Type
  Char16=array[0..15] of char;
  pChar16=^Char16;
  pArm7LineInfo=^Arm7LineInfo_typ;

procedure GetLineInfo(addr:pointer; var 
FuncStringListPointer,SrcStringListPointer:pChar;
var line:longWord);
Begin
  LineDataOfset:=(Longint(@data_end)-Longint(@data_beg))+Longint(@data_beg_src);
  if (byte(LineDataOfset) and $0F)<>0 then
    LineDataOfset:=(LineDataOfset and $FFFFFFF0) +$10;
  if pChar16(LineDataOfset)^ = cLineDataOfsetString then
  begin
    LineDataOfset:=LineDataOfset+16;
    Val(pChar16(LineDataOfset)^,NameDataOfset,p);
    if p=0 then
    begin
      LineDataOfset:=LineDataOfset+16;
      NameDataOfset:=NameDataOfset+LineDataOfset;
      EndLineDataOfset:=NameDataOfset;
      if pChar16(NameDataOfset)^ = cNameDataOfsetString then
      begin
        NameDataOfset:=NameDataOfset+32;
        while LineDataOfset<EndLineDataOfset do
        begin
          if pArm7LineInfo(LineDataOfset)^.addr>longword(addr) then
          begin
            LineDataOfset:=LineDataOfset-16;
            line:=pArm7LineInfo(LineDataOfset)^.line;

longint(FuncStringListPointer):=longint(pArm7LineInfo(LineDataOfset)^.FuncStringListPointer
)+NameDataOfset;

longint(SrcStringListPointer):=longint(pArm7LineInfo(LineDataOfset)^.SrcStringListPointer)+
NameDataOfset;
            exit;
          end;
          LineDataOfset:=LineDataOfset+16;
        end;
      end else runerror(48);            {Error finding Str. Ofset}
    end else runerror(49);              {Error in val of str. Of.}
  end else runerror(50);                {Error finding Data Ofset}
End;

end.


_______________________________________________
fpc-pascal maillist  -  [email protected]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to