diff options
Diffstat (limited to 'ortho/mcode/ortho_code-disps.adb')
-rw-r--r-- | ortho/mcode/ortho_code-disps.adb | 790 |
1 files changed, 0 insertions, 790 deletions
diff --git a/ortho/mcode/ortho_code-disps.adb b/ortho/mcode/ortho_code-disps.adb deleted file mode 100644 index 9e8ac1272..000000000 --- a/ortho/mcode/ortho_code-disps.adb +++ /dev/null @@ -1,790 +0,0 @@ --- Mcode back-end for ortho - Internal tree dumper. --- Copyright (C) 2006 Tristan Gingold --- --- GHDL is free software; you can redistribute it and/or modify it under --- the terms of the GNU General Public License as published by the Free --- Software Foundation; either version 2, or (at your option) any later --- version. --- --- GHDL is distributed in the hope that it will be useful, but WITHOUT ANY --- WARRANTY; without even the implied warranty of MERCHANTABILITY or --- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --- for more details. --- --- You should have received a copy of the GNU General Public License --- along with GCC; see the file COPYING. If not, write to the Free --- Software Foundation, 59 Temple Place - Suite 330, Boston, MA --- 02111-1307, USA. -with Ada.Text_IO; use Ada.Text_IO; -with Ortho_Code.Debug; -with Ortho_Code.Consts; -with Ortho_Code.Decls; -with Ortho_Code.Types; -with Ortho_Code.Flags; -with Ortho_Ident; -with Interfaces; - -package body Ortho_Code.Disps is - procedure Disp_Subprg (Ident : Natural; S_Entry : O_Enode); - procedure Disp_Expr (Expr : O_Enode); - - procedure Disp_Indent (Indent : Natural) - is - begin - Put ((1 .. 2 * Indent => ' ')); - end Disp_Indent; - - procedure Disp_Ident (Id : O_Ident) - is - use Ortho_Ident; - begin - Put (Get_String (Id)); - end Disp_Ident; - - procedure Disp_Storage (Storage : O_Storage) is - begin - case Storage is - when O_Storage_External => - Put ("external"); - when O_Storage_Public => - Put ("public"); - when O_Storage_Private => - Put ("private"); - when O_Storage_Local => - Put ("local"); - end case; - end Disp_Storage; - - procedure Disp_Label (Label : O_Enode) - is - N : Int32; - begin - case Get_Expr_Kind (Label) is - when OE_Label => - Put ("label"); - N := Int32 (Label); - when OE_Loop => - Put ("loop"); - N := Int32 (Label); - when OE_BB => - Put ("BB"); - N := Get_BB_Number (Label); - when others => - raise Program_Error; - end case; - Put (Int32'Image (N)); - Put (":"); - end Disp_Label; - - procedure Disp_Call (Call : O_Enode) - is - Arg : O_Enode; - begin - Decls.Disp_Decl_Name (Get_Call_Subprg (Call)); - - Arg := Get_Arg_Link (Call); - if Arg /= O_Enode_Null then - Put (" ("); - loop - Disp_Expr (Get_Expr_Operand (Arg)); - Arg := Get_Arg_Link (Arg); - exit when Arg = O_Enode_Null; - Put (", "); - end loop; - Put (")"); - end if; - end Disp_Call; - - procedure Put_Trim (Str : String) is - begin - if Str (Str'First) = ' ' then - Put (Str (Str'First + 1 .. Str'Last)); - else - Put (Str); - end if; - end Put_Trim; - - procedure Disp_Typed_Lit (Lit : O_Cnode; Val : String) - is - use Ortho_Code.Consts; - begin - Disp_Type (Get_Const_Type (Lit)); - Put ("'["); - Put_Trim (Val); - Put (']'); - end Disp_Typed_Lit; - - procedure Disp_Lit (Lit : O_Cnode) - is - use Interfaces; - use Ortho_Code.Consts; - begin - case Get_Const_Kind (Lit) is - when OC_Unsigned => - Disp_Typed_Lit (Lit, Unsigned_64'Image (Get_Const_U64 (Lit))); - when OC_Signed => - Disp_Typed_Lit (Lit, Integer_64'Image (Get_Const_I64 (Lit))); - when OC_Subprg_Address => - Disp_Type (Get_Const_Type (Lit)); - Put ("'subprg_addr ("); - Decls.Disp_Decl_Name (Get_Const_Decl (Lit)); - Put (")"); - when OC_Address => - Disp_Type (Get_Const_Type (Lit)); - Put ("'address ("); - Decls.Disp_Decl_Name (Get_Const_Decl (Lit)); - Put (")"); - when OC_Sizeof => - Disp_Type (Get_Const_Type (Lit)); - Put ("'sizeof ("); - Disp_Type (Get_Sizeof_Type (Lit)); - Put (")"); - when OC_Null => - Disp_Type (Get_Const_Type (Lit)); - Put ("'[null]"); - when OC_Lit => - declare - L : O_Cnode; - begin - L := Types.Get_Type_Enum_Lit - (Get_Const_Type (Lit), Get_Lit_Value (Lit)); - Disp_Typed_Lit - (Lit, Ortho_Ident.Get_String (Get_Lit_Ident (L))); - end; - when OC_Array => - Put ('{'); - for I in 1 .. Get_Const_Aggr_Length (Lit) loop - if I /= 1 then - Put (", "); - end if; - Disp_Lit (Get_Const_Aggr_Element (Lit, I - 1)); - end loop; - Put ('}'); - when OC_Record => - declare - use Ortho_Code.Types; - F : O_Fnode; - begin - F := Get_Type_Record_Fields (Get_Const_Type (Lit)); - Put ('{'); - for I in 1 .. Get_Const_Aggr_Length (Lit) loop - if I /= 1 then - Put (", "); - end if; - Put ('.'); - Disp_Ident (Get_Field_Ident (F)); - Put (" = "); - Disp_Lit (Get_Const_Aggr_Element (Lit, I - 1)); - F := Get_Field_Chain (F); - end loop; - Put ('}'); - end; - when OC_Union => - Put ('{'); - Put ('.'); - Disp_Ident (Types.Get_Field_Ident (Get_Const_Union_Field (Lit))); - Put ('='); - Disp_Lit (Get_Const_Union_Value (Lit)); - Put ('}'); - when others => - Put ("*lit " & OC_Kind'Image (Get_Const_Kind (Lit)) & '*'); - end case; - end Disp_Lit; - - procedure Disp_Expr (Expr : O_Enode) - is - Kind : OE_Kind; - begin - Kind := Get_Expr_Kind (Expr); - case Kind is - when OE_Const => - case Get_Expr_Mode (Expr) is - when Mode_I8 - | Mode_I16 - | Mode_I32 => - Put_Trim (Int32'Image (To_Int32 (Get_Expr_Low (Expr)))); - when Mode_U8 - | Mode_U16 - | Mode_U32 => - Put_Trim (Uns32'Image (Get_Expr_Low (Expr))); - when others => - Put ("const:"); - Debug.Disp_Mode (Get_Expr_Mode (Expr)); - end case; - when OE_Lit => - Disp_Lit (Get_Expr_Lit (Expr)); - when OE_Case_Expr => - Put ("{case}"); - when OE_Kind_Dyadic - | OE_Kind_Cmp - | OE_Add - | OE_Mul - | OE_Shl => - Put ("("); - Disp_Expr (Get_Expr_Left (Expr)); - Put (' '); - case Kind is - when OE_Eq => - Put ('='); - when OE_Neq => - Put ("/="); - when OE_Lt => - Put ("<"); - when OE_Gt => - Put (">"); - when OE_Ge => - Put (">="); - when OE_Le => - Put ("<="); - when OE_Add => - Put ('+'); - when OE_Mul => - Put ('*'); - when OE_Add_Ov => - Put ("+#"); - when OE_Sub_Ov => - Put ("-#"); - when OE_Mul_Ov => - Put ("*#"); - when OE_Shl => - Put ("<<"); - when OE_And => - Put ("and"); - when OE_Or => - Put ("or"); - when others => - Put (OE_Kind'Image (Kind)); - end case; - Put (' '); - Disp_Expr (Get_Expr_Right (Expr)); - Put (")"); - when OE_Not => - Put ("not "); - Disp_Expr (Get_Expr_Operand (Expr)); - when OE_Neg_Ov => - Put ("neg "); - Disp_Expr (Get_Expr_Operand (Expr)); - when OE_Abs_Ov => - Put ("abs "); - Disp_Expr (Get_Expr_Operand (Expr)); - when OE_Indir => - declare - Op : O_Enode; - begin - Op := Get_Expr_Operand (Expr); - case Get_Expr_Kind (Op) is - when OE_Addrg - | OE_Addrl => - Decls.Disp_Decl_Name (Get_Addr_Object (Op)); - when others => - --Put ("*"); - Disp_Expr (Op); - end case; - end; - when OE_Addrl - | OE_Addrg => - -- Put ('@'); - Decls.Disp_Decl_Name (Get_Addr_Object (Expr)); - when OE_Call => - Disp_Call (Expr); - when OE_Alloca => - Put ("alloca ("); - Disp_Expr (Get_Expr_Operand (Expr)); - Put (")"); - when OE_Conv => - Disp_Type (Get_Conv_Type (Expr)); - Put ("'conv ("); - Disp_Expr (Get_Expr_Operand (Expr)); - Put (")"); - when OE_Conv_Ptr => - Disp_Type (Get_Conv_Type (Expr)); - Put ("'address ("); - Disp_Expr (Get_Expr_Operand (Expr)); - Put (")"); - when OE_Typed => - Disp_Type (Get_Conv_Type (Expr)); - Put ("'"); - -- Note: there is always parenthesis around comparison. - Disp_Expr (Get_Expr_Operand (Expr)); - when OE_Record_Ref => - Disp_Expr (Get_Expr_Operand (Expr)); - Put ("."); - Disp_Ident (Types.Get_Field_Ident (Get_Ref_Field (Expr))); - when OE_Access_Ref => - Disp_Expr (Get_Expr_Operand (Expr)); - Put (".all"); - when OE_Index_Ref => - Disp_Expr (Get_Expr_Operand (Expr)); - Put ('['); - Disp_Expr (Get_Ref_Index (Expr)); - Put (']'); - when OE_Slice_Ref => - Disp_Expr (Get_Expr_Operand (Expr)); - Put ('['); - Disp_Expr (Get_Ref_Index (Expr)); - Put ("...]"); - when OE_Get_Stack => - Put ("%sp"); - when OE_Get_Frame => - Put ("%fp"); - when others => - Put_Line (Standard_Error, "disps.disp_expr: unknown expr " - & OE_Kind'Image (Kind)); - end case; - end Disp_Expr; - - procedure Disp_Fields (Indent : Natural; Atype : O_Tnode) - is - use Types; - Nbr : Uns32; - F : O_Fnode; - begin - Nbr := Get_Type_Record_Nbr_Fields (Atype); - F := Get_Type_Record_Fields (Atype); - for I in 1 .. Nbr loop - Disp_Indent (Indent); - Disp_Ident (Get_Field_Ident (F)); - Put (": "); - Disp_Type (Get_Field_Type (F)); - Put (";"); - New_Line; - F := Get_Field_Chain (F); - end loop; - end Disp_Fields; - - procedure Disp_Type (Atype : O_Tnode; Force : Boolean := False) - is - use Types; - Kind : OT_Kind; - Decl : O_Dnode; - begin - if not Force then - Decl := Decls.Get_Type_Decl (Atype); - if Decl /= O_Dnode_Null then - Decls.Disp_Decl_Name (Decl); - return; - end if; - end if; - - Kind := Get_Type_Kind (Atype); - case Kind is - when OT_Signed => - Put ("signed ("); - Put_Trim (Uns32'Image (8 * Get_Type_Size (Atype))); - Put (")"); - when OT_Unsigned => - Put ("unsigned ("); - Put_Trim (Uns32'Image (8 * Get_Type_Size (Atype))); - Put (")"); - when OT_Float => - Put ("float"); - when OT_Access => - Put ("access"); - declare - Acc_Type : O_Tnode; - begin - Acc_Type := Get_Type_Access_Type (Atype); - if Acc_Type /= O_Tnode_Null then - Put (' '); - Disp_Type (Acc_Type); - end if; - end; - when OT_Ucarray => - Put ("array ["); - Disp_Type (Get_Type_Ucarray_Index (Atype)); - Put ("] of "); - Disp_Type (Get_Type_Ucarray_Element (Atype)); - when OT_Subarray => - Put ("subarray "); - Disp_Type (Get_Type_Subarray_Base (Atype)); - Put ("["); - Put_Trim (Uns32'Image (Get_Type_Subarray_Length (Atype))); - Put ("]"); - when OT_Record => - Put_Line ("record"); - Disp_Fields (1, Atype); - Put ("end record"); - when OT_Union => - Put_Line ("union"); - Disp_Fields (1, Atype); - Put ("end union"); - when OT_Boolean => - declare - Lit : O_Cnode; - begin - Put ("boolean {"); - Lit := Get_Type_Bool_False (Atype); - Disp_Ident (Consts.Get_Lit_Ident (Lit)); - Put (", "); - Lit := Get_Type_Bool_True (Atype); - Disp_Ident (Consts.Get_Lit_Ident (Lit)); - Put ("}"); - end; - when OT_Enum => - declare - use Consts; - Lit : O_Cnode; - begin - Put ("enum {"); - Lit := Get_Type_Enum_Lits (Atype); - for I in 1 .. Get_Type_Enum_Nbr_Lits (Atype) loop - if I /= 1 then - Put (", "); - end if; - Disp_Ident (Get_Lit_Ident (Lit)); - Put (" ="); - Put (Uns32'Image (I - 1)); - Lit := Get_Lit_Chain (Lit); - end loop; - Put ('}'); - end; - when OT_Complete => - Put ("-- complete: "); - Disp_Type (Get_Type_Complete_Type (Atype)); - end case; - end Disp_Type; - - procedure Disp_Decl_Storage (Decl : O_Dnode) is - begin - Disp_Storage (Decls.Get_Decl_Storage (Decl)); - Put (' '); - end Disp_Decl_Storage; - - procedure Disp_Subprg_Decl (Indent : Natural; Decl : O_Dnode) - is - use Decls; - Kind : OD_Kind; - Inter : O_Dnode; - begin - Disp_Decl_Storage (Decl); - Kind := Get_Decl_Kind (Decl); - case Kind is - when OD_Function => - Put ("function "); - when OD_Procedure => - Put ("procedure "); - when others => - raise Program_Error; - end case; - - Disp_Decl_Name (Decl); - Inter := Get_Subprg_Interfaces (Decl); - Put (" ("); - New_Line; - if Inter /= O_Dnode_Null then - loop - Disp_Indent (Indent + 1); - Disp_Decl_Name (Inter); - Put (": "); - Disp_Type (Get_Decl_Type (Inter)); - Inter := Get_Interface_Chain (Inter); - exit when Inter = O_Dnode_Null; - Put (";"); - New_Line; - end loop; - else - Disp_Indent (Indent + 1); - end if; - Put (")"); - if Kind = OD_Function then - New_Line; - Disp_Indent (Indent + 1); - Put ("return "); - Disp_Type (Get_Decl_Type (Decl)); - end if; - end Disp_Subprg_Decl; - - procedure Disp_Decl (Indent : Natural; - Decl : O_Dnode; - Nl : Boolean := False) - is - use Decls; - Kind : OD_Kind; - Dtype : O_Tnode; - begin - Kind := Get_Decl_Kind (Decl); - if Kind = OD_Interface then - return; - end if; - Disp_Indent (Indent); - case Kind is - when OD_Type => - Dtype := Get_Decl_Type (Decl); - Put ("type "); - Disp_Decl_Name (Decl); - Put (" is "); - Disp_Type (Dtype, True); - Put_Line (";"); - when OD_Local - | OD_Var => - Disp_Decl_Storage (Decl); - Put ("var "); - Disp_Decl_Name (Decl); - Put (" : "); - Dtype := Get_Decl_Type (Decl); - Disp_Type (Dtype); - if True then - Put (" {size=" - & Uns32'Image (Types.Get_Type_Size (Dtype)) & "}"); - end if; - Put_Line (";"); - when OD_Const => - Disp_Decl_Storage (Decl); - Put ("constant "); - Disp_Decl_Name (Decl); - Put (" : "); - Disp_Type (Get_Decl_Type (Decl)); - Put_Line (";"); - when OD_Const_Val => - Put ("constant "); - Disp_Decl_Name (Get_Val_Decl (Decl)); - Put (" := "); - Disp_Lit (Get_Val_Val (Decl)); - Put_Line (";"); - when OD_Function - | OD_Procedure => - Disp_Subprg_Decl (Indent, Decl); - Put_Line (";"); - when OD_Interface => - null; - when OD_Body => - -- Put ("body "); - Disp_Subprg_Decl (Indent, Get_Body_Decl (Decl)); - -- Disp_Decl_Name (Get_Body_Decl (Decl)); - New_Line; - Disp_Subprg (Indent, Get_Body_Stmt (Decl)); - when OD_Block | OD_Subprg_Ext => - null; - end case; - if Nl then - New_Line; - end if; - end Disp_Decl; - - procedure Disp_Stmt (Indent : in out Natural; Stmt : O_Enode) - is - use Decls; - Expr : O_Enode; - begin - case Get_Expr_Kind (Stmt) is - when OE_Beg => - Disp_Indent (Indent); - Put_Line ("declare"); - declare - Last : O_Dnode; - Decl : O_Dnode; - begin - Decl := Get_Block_Decls (Stmt); - Last := Get_Block_Last (Decl); - Decl := Decl + 1; - while Decl <= Last loop - case Get_Decl_Kind (Decl) is - when OD_Block => - Decl := Get_Block_Last (Decl) + 1; - when others => - Disp_Decl (Indent + 1, Decl, False); - Decl := Decl + 1; - end case; - end loop; - end; - Disp_Indent (Indent); - Put_Line ("begin"); - Indent := Indent + 1; - when OE_End => - Indent := Indent - 1; - Disp_Indent (Indent); - Put_Line ("end;"); - when OE_Line => - Disp_Indent (Indent); - Put_Line ("--#" & Int32'Image (Get_Expr_Line_Number (Stmt))); - when OE_BB => - Disp_Indent (Indent); - Put_Line ("# BB" & Int32'Image (Get_BB_Number (Stmt))); - when OE_Asgn => - Disp_Indent (Indent); - Disp_Expr (Get_Assign_Target (Stmt)); - Put (" := "); - Disp_Expr (Get_Expr_Operand (Stmt)); - Put_Line (";"); - when OE_Call => - Disp_Indent (Indent); - Disp_Call (Stmt); - Put_Line (";"); - when OE_Jump_F => - Disp_Indent (Indent); - Put ("jump "); - Disp_Label (Get_Jump_Label (Stmt)); - Put (" if not "); - Disp_Expr (Get_Expr_Operand (Stmt)); - New_Line; - when OE_Jump_T => - Disp_Indent (Indent); - Put ("jump "); - Disp_Label (Get_Jump_Label (Stmt)); - Put (" if "); - Disp_Expr (Get_Expr_Operand (Stmt)); - New_Line; - when OE_Jump => - Disp_Indent (Indent); - Put ("jump "); - Disp_Label (Get_Jump_Label (Stmt)); - New_Line; - when OE_Label => - Disp_Indent (Indent); - Disp_Label (Stmt); - New_Line; - when OE_Ret => - Disp_Indent (Indent); - Put ("return"); - Expr := Get_Expr_Operand (Stmt); - if Expr /= O_Enode_Null then - Put (" "); - Disp_Expr (Expr); - end if; - Put_Line (";"); - when OE_Set_Stack => - Disp_Indent (Indent); - Put ("%sp := "); - Disp_Expr (Get_Expr_Operand (Stmt)); - Put_Line (";"); - when OE_Leave => - Disp_Indent (Indent); - Put_Line ("# leave"); - when OE_If => - Disp_Indent (Indent); - Put ("if "); - Disp_Expr (Get_Expr_Operand (Stmt)); - Put (" then"); - New_Line; - Indent := Indent + 1; - when OE_Else => - Disp_Indent (Indent - 1); - Put ("else"); - New_Line; - when OE_Endif => - Indent := Indent - 1; - Disp_Indent (Indent); - Put_Line ("end if;"); - when OE_Loop => - Disp_Indent (Indent); - Disp_Label (Stmt); - New_Line; - Indent := Indent + 1; - when OE_Exit => - Disp_Indent (Indent); - Put ("exit "); - Disp_Label (Get_Jump_Label (Stmt)); - Put (";"); - New_Line; - when OE_Next => - Disp_Indent (Indent); - Put ("next "); - Disp_Label (Get_Jump_Label (Stmt)); - Put (";"); - New_Line; - when OE_Eloop => - Indent := Indent - 1; - Disp_Indent (Indent); - Put_Line ("end loop;"); - when OE_Case => - Disp_Indent (Indent); - Put ("case "); - Disp_Expr (Get_Expr_Operand (Stmt)); - Put (" is"); - New_Line; - if Debug.Flag_Debug_Hli then - Indent := Indent + 2; - end if; - when OE_Case_Branch => - Disp_Indent (Indent - 1); - Put ("when "); - declare - C : O_Enode; - L, H : O_Enode; - begin - C := Get_Case_Branch_Choice (Stmt); - loop - L := Get_Expr_Left (C); - H := Get_Expr_Right (C); - if L = O_Enode_Null then - Put ("others"); - else - Disp_Expr (L); - if H /= O_Enode_Null then - Put (" ... "); - Disp_Expr (H); - end if; - end if; - C := Get_Case_Choice_Link (C); - exit when C = O_Enode_Null; - New_Line; - Disp_Indent (Indent - 1); - Put (" | "); - end loop; - Put (" =>"); - New_Line; - end; - when OE_Case_End => - Indent := Indent - 2; - Disp_Indent (Indent); - Put ("end case;"); - New_Line; - when others => - Put_Line (Standard_Error, "debug.disp_stmt: unknown statement " & - OE_Kind'Image (Get_Expr_Kind (Stmt))); - end case; - end Disp_Stmt; - - procedure Disp_Subprg (Ident : Natural; S_Entry : O_Enode) - is - Stmt : O_Enode; - N_Ident : Natural := Ident; - begin - Stmt := S_Entry; - loop - Stmt := Get_Stmt_Link (Stmt); - Disp_Stmt (N_Ident, Stmt); - exit when Get_Expr_Kind (Stmt) = OE_Leave; - end loop; - end Disp_Subprg; - - Last_Decl : O_Dnode := O_Dnode_First; - - procedure Disp_Decls_Until (Last : O_Dnode; Nl : Boolean := False) is - begin - while Last_Decl <= Last loop - Disp_Decl (0, Last_Decl, Nl); - Last_Decl := Last_Decl + 1; - end loop; - end Disp_Decls_Until; - - procedure Disp_Subprg (Subprg : Subprogram_Data_Acc) - is - use Decls; - begin - Disp_Decls_Until (Subprg.D_Body, True); - if Get_Decl_Kind (Last_Decl) /= OD_Block then - raise Program_Error; - end if; - if Debug.Flag_Debug_Keep then - -- If nodes are kept, the next declaration to be displayed (at top - -- level) is the one that follow the subprogram block. - Last_Decl := Get_Block_Last (Last_Decl) + 1; - else - -- If nodes are not kept, this subprogram block will be freed, and - -- the next declaration is the block itself. - Last_Decl := Subprg.D_Body; - end if; - end Disp_Subprg; - - procedure Init is - begin - Flags.Flag_Type_Name := True; - end Init; - - procedure Finish is - begin - Disp_Decls_Until (Decls.Get_Decl_Last, True); - end Finish; - -end Ortho_Code.Disps; |