Browse Source

+ support for .dc.a directive
* read multiple section flags

git-svn-id: trunk@48903 -

florian 4 years ago
parent
commit
4be5f07f27
1 changed files with 21 additions and 15 deletions
  1. 21 15
      compiler/raatt.pas

+ 21 - 15
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