summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorflorian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2>2021-03-07 22:28:17 +0000
committerflorian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2>2021-03-07 22:28:17 +0000
commita7fc993faeff98ddfc46a8561619e3e7215791c0 (patch)
tree5fc49c008d64f92eaf79edd7e03b89ad7dfb1a37
parent1f980b7a957f4112dff8d1f7bf0d15bab32c3c11 (diff)
downloadfpc-a7fc993faeff98ddfc46a8561619e3e7215791c0.tar.gz
+ support for .dc.a directive
* read multiple section flags git-svn-id: https://svn.freepascal.org/svn/fpc/trunk@48903 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r--compiler/raatt.pas36
1 files changed, 21 insertions, 15 deletions
diff --git a/compiler/raatt.pas b/compiler/raatt.pas
index 92d1e8c6ad..0bb96d9ec5 100644
--- a/compiler/raatt.pas
+++ b/compiler/raatt.pas
@@ -53,7 +53,7 @@ unit raatt;
AS_DB,AS_DW,AS_DD,AS_DQ,AS_GLOBAL,
AS_ALIGN,AS_BALIGN,AS_P2ALIGN,AS_ASCII,
AS_ASCIIZ,AS_LCOMM,AS_COMM,AS_SINGLE,AS_DOUBLE,AS_EXTENDED,AS_CEXTENDED,
- AS_DATA,AS_TEXT,AS_INIT,AS_FINI,AS_RVA,
+ AS_DATA,AS_TEXT,AS_INIT,AS_FINI,AS_RVA,AS_DC_A,
AS_SET,AS_WEAK,AS_SECTION,AS_END,
{------------------ Assembler Operators --------------------}
AS_TYPE,AS_SIZEOF,AS_VMTOFFSET,AS_MOD,AS_SHL,AS_SHR,AS_NOT,AS_AND,AS_OR,AS_XOR,AS_NOR,AS_AT,
@@ -80,7 +80,7 @@ unit raatt;
'.byte','.word','.long','.quad','.globl',
'.align','.balign','.p2align','.ascii',
'.asciz','.lcomm','.comm','.single','.double','.tfloat','.tcfloat',
- '.data','.text','.init','.fini','.rva',
+ '.data','.text','.init','.fini','.rva','.dc.a',
'.set','.weak','.section','END',
'TYPE','SIZEOF','VMTOFFSET','%','<<','>>','!','&','|','^','~','@','reltype',
'directive');
@@ -227,7 +227,7 @@ unit raatt;
actasmpattern[len]:=c;
{ Let us point to the next character }
c:=current_scanner.asmgetchar;
- while c in ['A'..'Z','a'..'z','0'..'9','_','$'] do
+ while c in ['A'..'Z','a'..'z','0'..'9','_','$','.'] do
begin
inc(len);
actasmpattern[len]:=c;
@@ -1076,6 +1076,7 @@ unit raatt;
section : tai_section;
secflags : TSectionFlags;
secprogbits : TSectionProgbits;
+ i: Integer;
Begin
Message1(asmr_d_start_reading,'GNU AS');
firsttoken:=TRUE;
@@ -1163,6 +1164,12 @@ unit raatt;
BuildConstant(4);
end;
+ AS_DC_A:
+ Begin
+ Consume(AS_DC_A);
+ BuildConstant(sizeof(aint));
+ end;
+
AS_DQ:
Begin
Consume(AS_DQ);
@@ -1342,18 +1349,17 @@ unit raatt;
Consume(AS_COMMA);
if actasmtoken=AS_STRING then
begin
- case actasmpattern of
- 'a':
- Include(secflags,SF_A);
- 'w':
- Include(secflags,SF_W);
- 'x':
- Include(secflags,SF_X);
- '':
- ;
- else
- Message(asmr_e_syntax_error);
- end;
+ for i:=1 to length(actasmpattern) do
+ case actasmpattern[i] of
+ 'a':
+ Include(secflags,SF_A);
+ 'w':
+ Include(secflags,SF_W);
+ 'x':
+ Include(secflags,SF_X);
+ else
+ Message(asmr_e_syntax_error);
+ end;
Consume(AS_STRING);
if actasmtoken=AS_COMMA then
begin