From 09addc9e784b193a811069014575058e8f9dcf41 Mon Sep 17 00:00:00 2001 From: marcus Date: Sun, 28 Jun 2015 18:49:53 +0000 Subject: [PATCH] fcl-passrc: support for syscall functions, parameter location, HASAMIGA define git-svn-id: trunk@31168 - --- packages/fcl-passrc/src/pastree.pp | 4 ++-- packages/fcl-passrc/src/pparser.pp | 24 ++++++++++++++++++++++-- packages/fcl-passrc/src/pscanner.pp | 2 +- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/packages/fcl-passrc/src/pastree.pp b/packages/fcl-passrc/src/pastree.pp index fc0548c936..48952c7b92 100644 --- a/packages/fcl-passrc/src/pastree.pp +++ b/packages/fcl-passrc/src/pastree.pp @@ -91,7 +91,7 @@ type visPublished, visAutomated, visStrictPrivate, visStrictProtected); - TCallingConvention = (ccDefault,ccRegister,ccPascal,ccCDecl,ccStdCall,ccOldFPCCall,ccSafeCall); + TCallingConvention = (ccDefault,ccRegister,ccPascal,ccCDecl,ccStdCall,ccOldFPCCall,ccSafeCall,ccSysCall); TPackMode = (pmNone,pmPacked,pmBitPacked); TPasMemberVisibilities = set of TPasMemberVisibility; @@ -1183,7 +1183,7 @@ const cPasMemberHint : array[TPasMemberHint] of string = ( 'deprecated', 'library', 'platform', 'experimental', 'unimplemented' ); cCallingConventions : array[TCallingConvention] of string = - ( '', 'Register','Pascal','CDecl','StdCall','OldFPCCall','SafeCall'); + ( '', 'Register','Pascal','CDecl','StdCall','OldFPCCall','SafeCall','SysCall'); ModifierNames : Array[TProcedureModifier] of string = ('virtual', 'dynamic','abstract', 'override', diff --git a/packages/fcl-passrc/src/pparser.pp b/packages/fcl-passrc/src/pparser.pp index c4d4a6c24d..b344ebaffc 100644 --- a/packages/fcl-passrc/src/pparser.pp +++ b/packages/fcl-passrc/src/pparser.pp @@ -307,7 +307,7 @@ Function IsCallingConvention(S : String; out CC : TCallingConvention) : Boolean; Var CCNames : Array[TCallingConvention] of String - = ('','register','pascal','cdecl','stdcall','oldfpccall','safecall'); + = ('','register','pascal','cdecl','stdcall','oldfpccall','safecall','syscall'); Var C : TCallingConvention; @@ -443,7 +443,13 @@ begin else if s = 'BEOS' then Scanner.AddDefine('UNIX') else if s = 'QNX' then - Scanner.AddDefine('UNIX'); + Scanner.AddDefine('UNIX') + else if s = 'AROS' then + Scanner.AddDefine('HASAMIGA') + else if s = 'MORPHOS' then + Scanner.AddDefine('HASAMIGA') + else if s = 'AMIGA' then + Scanner.AddDefine('HASAMIGA'); // TargetCPU s := UpperCase(CPUTarget); @@ -2676,6 +2682,11 @@ begin end; NextToken; + if (CurToken = tkIdentifier) and (LowerCase(CurTokenString) = 'location') then + begin + NextToken; // remove 'location' + NextToken; // remove register + end; if CurToken = EndToken then break; end; @@ -2905,6 +2916,15 @@ begin begin if Assigned(Element) then // !!! Element.CallingConvention:=Cc; + if cc = ccSysCall then + begin + // remove LibBase + NextToken; + // remove legacy or basesysv on MorphOS syscalls + if CurTokenIsIdentifier('legacy') or CurTokenIsIdentifier('BaseSysV') then + NextToken; + NextToken; // remove offset + end; ExpectToken(tkSemicolon); end else if TokenIsProcedureModifier(Parent,CurTokenString,pm) then diff --git a/packages/fcl-passrc/src/pscanner.pp b/packages/fcl-passrc/src/pscanner.pp index ca00eb032d..00f8ea440a 100644 --- a/packages/fcl-passrc/src/pscanner.pp +++ b/packages/fcl-passrc/src/pscanner.pp @@ -1647,7 +1647,7 @@ begin else if Param[1]='%' then begin fcurtokenstring:='{$i '+param+'}'; - fcurtoken:=tkstring; + fcurtoken:=tkstring; result:=fcurtoken; exit; end