diff options
author | Tristan Gingold | 2014-01-15 06:12:10 +0100 |
---|---|---|
committer | Tristan Gingold | 2014-01-15 06:12:10 +0100 |
commit | d68bc3f41ad8a750eda9c50878c6728a84ad3097 (patch) | |
tree | 9284690b0797e3ffed8839611d4b8e53ee1d5894 /ortho/oread | |
parent | 9b22b46458f2c80d87ffd957aa7df78cb98ee710 (diff) | |
download | ghdl-d68bc3f41ad8a750eda9c50878c6728a84ad3097.tar.gz ghdl-d68bc3f41ad8a750eda9c50878c6728a84ad3097.tar.bz2 ghdl-d68bc3f41ad8a750eda9c50878c6728a84ad3097.zip |
Add Alignof constant to get the alignment of a type.
Diffstat (limited to 'ortho/oread')
-rw-r--r-- | ortho/oread/ortho_front.adb | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/ortho/oread/ortho_front.adb b/ortho/oread/ortho_front.adb index 8bc5de8..c6e1234 100644 --- a/ortho/oread/ortho_front.adb +++ b/ortho/oread/ortho_front.adb @@ -132,7 +132,7 @@ package body Ortho_Front is if Buf (Pos) = NUL then -- Read line. Buf_Len := Read (Fd, Buf'Address, Buf'Length - 1); - if Buf_Len <= 0 then + if Buf_Len = 0 then -- End of file. return NUL; end if; @@ -212,6 +212,7 @@ package body Ortho_Front is Id_Subprg_Addr : Syment_Acc; Id_Conv : Syment_Acc; Id_Sizeof : Syment_Acc; + Id_Alignof : Syment_Acc; Id_Alloca : Syment_Acc; Id_Offsetof : Syment_Acc; @@ -1263,6 +1264,22 @@ package body Ortho_Front is return Res; end Parse_Sizeof; + function Parse_Alignof (Atype : Node_Acc) return O_Cnode + is + Res : O_Cnode; + begin + Next_Expect (Tok_Left_Paren); + Next_Token; + if Tok /= Tok_Ident then + Parse_Error ("type name expected"); + end if; + Res := New_Alignof + (Get_Decl (Token_Sym).Decl_Dtype.Type_Onode, + Atype.Type_Onode); + Next_Expect (Tok_Right_Paren); + return Res; + end Parse_Alignof; + function Parse_Typed_Literal (Atype : Node_Acc) return O_Cnode is Res : O_Cnode; @@ -1325,6 +1342,8 @@ package body Ortho_Front is Res := Parse_Offsetof (N); elsif Token_Sym = Id_Sizeof then Res := Parse_Sizeof (N); + elsif Token_Sym = Id_Alignof then + Res := Parse_Alignof (N); elsif Token_Sym = Id_Conv then Next_Expect (Tok_Left_Paren); Next_Token; @@ -1412,6 +1431,10 @@ package body Ortho_Front is Res := New_Lit (Parse_Sizeof (Name.Decl_Dtype)); Next_Token; return Res; + elsif Token_Sym = Id_Alignof then + Res := New_Lit (Parse_Alignof (Name.Decl_Dtype)); + Next_Token; + return Res; elsif Token_Sym = Id_Alloca then Next_Expect (Tok_Left_Paren); Next_Token; @@ -2614,6 +2637,7 @@ package body Ortho_Front is Id_Subprg_Addr := New_Symbol ("subprg_addr"); Id_Conv := New_Symbol ("conv"); Id_Sizeof := New_Symbol ("sizeof"); + Id_Alignof := New_Symbol ("alignof"); Id_Alloca := New_Symbol ("alloca"); Id_Offsetof := New_Symbol ("offsetof"); |