diff options
Diffstat (limited to 'ortho/mcode/binary_file.ads')
-rw-r--r-- | ortho/mcode/binary_file.ads | 305 |
1 files changed, 0 insertions, 305 deletions
diff --git a/ortho/mcode/binary_file.ads b/ortho/mcode/binary_file.ads deleted file mode 100644 index 1a2bf588d..000000000 --- a/ortho/mcode/binary_file.ads +++ /dev/null @@ -1,305 +0,0 @@ --- Binary file handling. --- 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 System; -with Interfaces; use Interfaces; -with Ada.Unchecked_Deallocation; -with Ortho_Ident; use Ortho_Ident; -with GNAT.Table; -with Memsegs; - -package Binary_File is - type Section_Type is limited private; - type Section_Acc is access Section_Type; - - type Section_Flags is new Unsigned_32; - Section_None : constant Section_Flags; - Section_Exec : constant Section_Flags; - Section_Read : constant Section_Flags; - Section_Write : constant Section_Flags; - Section_Zero : constant Section_Flags; - Section_Strtab : constant Section_Flags; - Section_Debug : constant Section_Flags; - - type Byte is new Unsigned_8; - - type Symbol is range -2 ** 31 .. 2 ** 31 - 1; - for Symbol'Size use 32; - Null_Symbol : constant Symbol := 0; - - type Pc_Type is mod System.Memory_Size; - Null_Pc : constant Pc_Type := 0; - - type Arch_Kind is (Arch_Unknown, Arch_X86, Arch_Sparc, Arch_Ppc); - Arch : Arch_Kind := Arch_Unknown; - - -- Dump assembly when generated. - Dump_Asm : Boolean := False; - - Debug_Hex : Boolean := False; - - -- Create a section. - procedure Create_Section (Sect : out Section_Acc; - Name : String; Flags : Section_Flags); - procedure Set_Section_Info (Sect : Section_Acc; - Link : Section_Acc; - Align : Natural; - Esize : Natural); - - procedure Merge_Section (Dest : Section_Acc; Src : Section_Acc); - - -- Set the current section. - procedure Set_Current_Section (Sect : Section_Acc); - - -- Create an undefined local (anonymous) symbol in the current section. - function Create_Local_Symbol return Symbol; - function Create_Symbol (Name : O_Ident) return Symbol; - - -- Research symbol NAME, very expansive call. - -- Return NULL_Symbol if not found. - function Get_Symbol (Name : String) return Symbol; - - -- Get the virtual address of a symbol. - function Get_Symbol_Vaddr (Sym : Symbol) return Pc_Type; - pragma Inline (Get_Symbol_Vaddr); - - -- Set the value of a symbol. - procedure Set_Symbol_Pc (Sym : Symbol; Export : Boolean); - function Get_Symbol_Value (Sym : Symbol) return Pc_Type; - - -- Get the current PC. - function Get_Current_Pc return Pc_Type; - pragma Inline (Get_Current_Pc); - - function Get_Pc (Sect : Section_Acc) return Pc_Type; - pragma Inline (Get_Pc); - - -- Align the current section of 2 ** ALIGN. - procedure Gen_Pow_Align (Align : Natural); - - -- Generate LENGTH times 0. - procedure Gen_Space (Length : Integer_32); - - -- Add a reloc in the current section at the current address. - procedure Gen_X86_Pc32 (Sym : Symbol); - procedure Gen_Sparc_Disp22 (W : Unsigned_32; Sym : Symbol); - procedure Gen_Sparc_Disp30 (W : Unsigned_32; Sym : Symbol); - procedure Gen_Sparc_Hi22 (W : Unsigned_32; - Sym : Symbol; Off : Unsigned_32); - procedure Gen_Sparc_Lo10 (W : Unsigned_32; - Sym : Symbol; Off : Unsigned_32); - - -- Add a 32 bits value with a symbol relocation in the current section at - -- the current address. - procedure Gen_X86_32 (Sym : Symbol; Offset : Integer_32); - procedure Gen_Sparc_32 (Sym : Symbol; Offset : Integer_32); - procedure Gen_Sparc_Ua_32 (Sym : Symbol; Offset : Integer_32); - - procedure Gen_Ppc_24 (V : Unsigned_32; Sym : Symbol); - - procedure Gen_Ua_32 (Sym : Symbol; Offset : Integer_32); - - -- Start/finish an instruction in the current section. - procedure Start_Insn; - procedure End_Insn; - -- Pre allocate L bytes. - procedure Prealloc (L : Pc_Type); - - -- Add bits in the current section. - procedure Gen_B8 (B : Byte); - procedure Gen_B16 (B0, B1 : Byte); - procedure Gen_Le8 (B : Unsigned_32); - procedure Gen_Le16 (B : Unsigned_32); - procedure Gen_Be16 (B : Unsigned_32); - procedure Gen_Le32 (B : Unsigned_32); - procedure Gen_Be32 (B : Unsigned_32); - - procedure Gen_16 (B : Unsigned_32); - procedure Gen_32 (B : Unsigned_32); - - -- Add bits in the current section, but as stand-alone data. - procedure Gen_Data_Le8 (B : Unsigned_32); - procedure Gen_Data_Le16 (B : Unsigned_32); - procedure Gen_Data_32 (Sym : Symbol; Offset : Integer_32); - - -- Modify already generated code. - procedure Patch_B8 (Pc : Pc_Type; V : Unsigned_8); - procedure Patch_Le32 (Pc : Pc_Type; V : Unsigned_32); - procedure Patch_Be32 (Pc : Pc_Type; V : Unsigned_32); - procedure Patch_Be16 (Pc : Pc_Type; V : Unsigned_32); - procedure Patch_32 (Pc : Pc_Type; V : Unsigned_32); - - -- Binary writers: - - -- Set ERROR in case of error (undefined symbol). - --procedure Write_Memory (Error : out Boolean); - - procedure Disp_Stats; - procedure Finish; -private - type Byte_Array_Base is array (Pc_Type range <>) of Byte; - subtype Byte_Array is Byte_Array_Base (Pc_Type); - type Byte_Array_Acc is access Byte_Array; - type String_Acc is access String; - --type Section_Flags is new Unsigned_32; - - -- Relocations. - type Reloc_Kind is (Reloc_32, Reloc_Pc32, - Reloc_Ua_32, - Reloc_Disp22, Reloc_Disp30, - Reloc_Hi22, Reloc_Lo10, - Reloc_Ppc_Addr24); - type Reloc_Type; - type Reloc_Acc is access Reloc_Type; - type Reloc_Type is record - Kind : Reloc_Kind; - -- If true, the reloc was already applied. - Done : Boolean; - -- Next in simply linked list. - -- next reloc in the section. - Sect_Next : Reloc_Acc; - -- next reloc for the symbol. - Sym_Next : Reloc_Acc; - -- Address that must be relocated. - Addr : Pc_Type; - -- Symbol. - Sym : Symbol; - end record; - - type Section_Type is record - -- Simply linked list of sections. - Next : Section_Acc; - -- Flags. - Flags : Section_Flags; - -- Name of the section. - Name : String_Acc; - -- Link to another section (used by ELF). - Link : Section_Acc; - -- Alignment (in power of 2). - Align : Natural; - -- Entry size (if any). - Esize : Natural; - -- Offset of the next data in DATA. - Pc : Pc_Type; - -- Offset of the current instruction. - Insn_Pc : Pc_Type; - -- Data for this section. - Data : Byte_Array_Acc; - -- Max address for data (before extending the area). - Data_Max : Pc_Type; - -- Chain of relocs defined in this section. - First_Reloc : Reloc_Acc; - Last_Reloc : Reloc_Acc; - -- Number of relocs in this section. - Nbr_Relocs : Natural; - -- Section number (set and used by binary writer). - Number : Natural; - -- Virtual address, if set. - Vaddr : Pc_Type; -- SSE.Integer_Address; - -- Memory for this segment. - Seg : Memsegs.Memseg_Type; - end record; - - Section_Exec : constant Section_Flags := 2#0000_0001#; - Section_Read : constant Section_Flags := 2#0000_0010#; - Section_Write : constant Section_Flags := 2#0000_0100#; - Section_Zero : constant Section_Flags := 2#0000_1000#; - Section_Strtab : constant Section_Flags := 2#0001_0000#; - Section_Debug : constant Section_Flags := 2#0010_0000#; - Section_None : constant Section_Flags := 2#0000_0000#; - - -- Scope of a symbol: - -- SYM_PRIVATE: not visible outside of the file. - -- SYM_UNDEF: not (yet) defined, unresolved. - -- SYM_GLOBAL: visible to all files. - -- SYM_LOCAL: locally generated symbol. - type Symbol_Scope is (Sym_Undef, Sym_Global, Sym_Private, Sym_Local); - subtype Symbol_Scope_External is Symbol_Scope range Sym_Undef .. Sym_Global; - type Symbol_Type is record - Section : Section_Acc; - Value : Pc_Type; - Scope : Symbol_Scope; - -- True if the symbol is referenced/used. - Used : Boolean; - -- Name of the symbol. - Name : O_Ident; - -- List of relocation made with this symbol. - Relocs : Reloc_Acc; - -- Symbol number, from 0. - Number : Natural; - end record; - - -- Number of sections. - Nbr_Sections : Natural := 0; - -- Simply linked list of sections. - Section_Chain : Section_Acc := null; - Section_Last : Section_Acc := null; - - package Symbols is new GNAT.Table - (Table_Component_Type => Symbol_Type, - Table_Index_Type => Symbol, - Table_Low_Bound => 2, - Table_Initial => 1024, - Table_Increment => 100); - - function Pow_Align (V : Pc_Type; Align : Natural) return Pc_Type; - - function Get_Symbol_Name (Sym : Symbol) return String; - function Get_Symbol_Name_Length (Sym : Symbol) return Natural; - - procedure Set_Symbol_Value (Sym : Symbol; Val : Pc_Type); - pragma Inline (Set_Symbol_Value); - - procedure Set_Scope (Sym : Symbol; Scope : Symbol_Scope); - pragma Inline (Set_Scope); - - function Get_Scope (Sym : Symbol) return Symbol_Scope; - pragma Inline (Get_Scope); - - function Get_Section (Sym : Symbol) return Section_Acc; - pragma Inline (Get_Section); - - procedure Set_Section (Sym : Symbol; Sect : Section_Acc); - pragma Inline (Set_Section); - - function Get_Name (Sym : Symbol) return O_Ident; - pragma Inline (Get_Name); - - procedure Apply_Reloc (Sect : Section_Acc; Reloc : Reloc_Acc); - pragma Inline (Apply_Reloc); - - procedure Set_Number (Sym : Symbol; Num : Natural); - pragma Inline (Set_Number); - - function Get_Number (Sym : Symbol) return Natural; - pragma Inline (Get_Number); - - function Get_Used (Sym : Symbol) return Boolean; - pragma Inline (Get_Used); - - procedure Do_Intra_Section_Reloc (Sect : Section_Acc); - - function S_Local (Sym : Symbol) return Boolean; - pragma Inline (S_Local); - - procedure Resize (Sect : Section_Acc; Size : Pc_Type); - - procedure Free is new Ada.Unchecked_Deallocation - (Name => Reloc_Acc, Object => Reloc_Type); - - Write_Error : exception; -end Binary_File; |