aboutsummaryrefslogtreecommitdiffstats
path: root/src/ortho/llvm6/ortho_llvm.ads
diff options
context:
space:
mode:
Diffstat (limited to 'src/ortho/llvm6/ortho_llvm.ads')
-rw-r--r--src/ortho/llvm6/ortho_llvm.ads40
1 files changed, 34 insertions, 6 deletions
diff --git a/src/ortho/llvm6/ortho_llvm.ads b/src/ortho/llvm6/ortho_llvm.ads
index b342140dc..74bae8ed5 100644
--- a/src/ortho/llvm6/ortho_llvm.ads
+++ b/src/ortho/llvm6/ortho_llvm.ads
@@ -98,8 +98,8 @@ package Ortho_LLVM is
-- Build a record type.
procedure Start_Record_Type (Elements : out O_Element_List);
- -- Add a field in the record; not constrained array are prohibited, since
- -- its size is unlimited.
+ -- Add a field in the record. Unconstrained fields must be at the end,
+ -- and cannot be followed by a constrained one.
procedure New_Record_Field
(Elements : in out O_Element_List;
El : out O_Fnode;
@@ -108,6 +108,17 @@ package Ortho_LLVM is
procedure Finish_Record_Type
(Elements : in out O_Element_List; Res : out O_Tnode);
+ type O_Element_Sublist is limited private;
+
+ -- Build a record subtype.
+ -- Re-declare only unconstrained fields with a subtype of them.
+ procedure Start_Record_Subtype
+ (Rtype : O_Tnode; Elements : out O_Element_Sublist);
+ procedure New_Subrecord_Field
+ (Elements : in out O_Element_Sublist; El : out O_Fnode; Etype : O_Tnode);
+ procedure Finish_Record_Subtype
+ (Elements : in out O_Element_Sublist; Res : out O_Tnode);
+
-- Build an uncomplete record type:
-- First call NEW_UNCOMPLETE_RECORD_TYPE, which returns a record type.
-- This type can be declared or used to define access types on it.
@@ -139,8 +150,8 @@ package Ortho_LLVM is
return O_Tnode;
-- Build a constrained array type.
- function New_Constrained_Array_Type (Atype : O_Tnode; Length : O_Cnode)
- return O_Tnode;
+ function New_Array_Subtype
+ (Atype : O_Tnode; El_Type : O_Tnode; Length : O_Cnode) return O_Tnode;
-- Build a scalar type; size may be 8, 16, 32 or 64.
function New_Unsigned_Type (Size : Natural) return O_Tnode;
@@ -213,9 +224,13 @@ package Ortho_LLVM is
-- Returns the size in bytes of ATYPE. The result is a literal of
-- unsigned type RTYPE
- -- ATYPE cannot be an unconstrained array type.
+ -- ATYPE cannot be an unconstrained type.
function New_Sizeof (Atype : O_Tnode; Rtype : O_Tnode) return O_Cnode;
+ -- Get the size of the bounded part of a record.
+ function New_Record_Sizeof
+ (Atype : O_Tnode; Rtype : O_Tnode) return O_Cnode;
+
-- Returns the alignment in bytes for ATYPE. The result is a literal of
-- unsgined type RTYPE.
function New_Alignof (Atype : O_Tnode; Rtype : O_Tnode) return O_Cnode;
@@ -668,6 +683,14 @@ private
end record;
pragma Convention (C, O_Element_List);
+ type O_Element_Sublist is record
+ -- Number of fields.
+ Count : Natural;
+ Base_Els : O_Element_Vec;
+ Els : O_Element_Vec;
+ end record;
+ pragma Convention (C, O_Element_Sublist);
+
type ValueRefArray_Acc is access Opaque_Type;
pragma Convention (C, ValueRefArray_Acc);
@@ -770,6 +793,10 @@ private
pragma Import (C, New_Uncomplete_Record_Type);
pragma Import (C, Start_Uncomplete_Record_Type);
+ pragma Import (C, Start_Record_Subtype);
+ pragma Import (C, New_Subrecord_Field);
+ pragma Import (C, Finish_Record_Subtype);
+
pragma Import (C, Start_Union_Type);
pragma Import (C, New_Union_Field);
pragma Import (C, Finish_Union_Type);
@@ -782,7 +809,7 @@ private
pragma Import (C, Finish_Access_Type);
pragma Import (C, New_Array_Type);
- pragma Import (C, New_Constrained_Array_Type);
+ pragma Import (C, New_Array_Subtype);
pragma Import (C, New_Boolean_Type);
pragma Import (C, Start_Enum_Type);
@@ -804,6 +831,7 @@ private
pragma Import (C, New_Access_Element);
pragma Import (C, New_Sizeof);
+ pragma Import (C, New_Record_Sizeof);
pragma Import (C, New_Alignof);
pragma Import (C, New_Offsetof);