diff options
Diffstat (limited to 'src/errorout.ads')
-rw-r--r-- | src/errorout.ads | 274 |
1 files changed, 274 insertions, 0 deletions
diff --git a/src/errorout.ads b/src/errorout.ads new file mode 100644 index 000000000..1abacca3a --- /dev/null +++ b/src/errorout.ads @@ -0,0 +1,274 @@ +-- Error message handling. +-- Copyright (C) 2002, 2003, 2004, 2005 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 GHDL; see the file COPYING. If not, write to the Free +-- Software Foundation, 59 Temple Place - Suite 330, Boston, MA +-- 02111-1307, USA. +with Types; use Types; +with Vhdl.Nodes; use Vhdl.Nodes; +with Vhdl.Tokens; + +package Errorout is + Option_Error: exception; + Compilation_Error: exception; + + -- This kind can't be handled. + procedure Error_Kind (Msg : String; N : PSL_Node); + pragma No_Return (Error_Kind); + + -- The number of errors (ie, number of calls to error_msg*). + Nbr_Errors : Natural := 0; + + -- Maximum number of errors, before silent them. + Max_Nbr_Errors : constant Natural := 100; + + type Msgid_Type is + ( + -- Any note + Msgid_Note, + + -- Specific warnings + + -- Design unit redefines another design unit. + Warnid_Library, + + -- Missing Xref in pretty print. + Warnid_Missing_Xref, + + -- No default binding for a component instantiation. + Warnid_Default_Binding, + + -- Unbound component. + Warnid_Binding, + + -- Unconnected IN port without defaults (in relaxed mode). + Warnid_Port, + + -- Vhdl93 reserved word is used as a vhdl87 identifier. + Warnid_Reserved_Word, + + -- Start of block comment ('/*') appears in a block comment. + Warnid_Nested_Comment, + + -- Use of a tool directive. + Warnid_Directive, + + -- Weird use of parenthesis. + Warnid_Parenthesis, + + -- Generic of a vital entity is not a vital name. + Warnid_Vital_Generic, + + -- Delayed checks (checks performed at elaboration time). + Warnid_Delayed_Checks, + + -- Package body is not required but is analyzed. + Warnid_Body, + + -- An all/others specification does not apply, because there is no such + -- named entities. + Warnid_Specs, + + -- Incorrect use of universal value. + Warnid_Universal, + + -- Mismatch of bounds between actual and formal in a scalar port + -- association + Warnid_Port_Bounds, + + -- Runtime error detected at analysis time. + Warnid_Runtime_Error, + + -- Signal assignment creates a delta cycle in a postponed process. + Warnid_Delta_Cycle, + + -- Declaration of a shared variable with a non-protected type. + Warnid_Shared, + + -- A declaration hides a previous one. + Warnid_Hide, + + -- Emit a warning when a declaration is never used. + -- FIXME: currently only subprograms are handled. + Warnid_Unused, + + -- Others choice is not needed, all values are already covered. + Warnid_Others, + + -- Violation of pure rules. + Warnid_Pure, + + -- Violation of staticness rules + Warnid_Static, + + -- Any warning + Msgid_Warning, + + -- Any error + Msgid_Error, + + -- Any fatal error + Msgid_Fatal + ); + + -- All specific warning messages. + subtype Msgid_Warnings is Msgid_Type + range Warnid_Library .. Warnid_Static; + + -- Get the image of a warning. This correspond the the identifier of ID, + -- in lower case, without the Msgid_Warn_ prefix and with '_' replaced + -- by '-'. + function Warning_Image (Id : Msgid_Warnings) return String; + + -- Enable or disable a warning. + procedure Enable_Warning (Id : Msgid_Warnings; Enable : Boolean); + + -- Get enable status of a warning. + function Is_Warning_Enabled (Id : Msgid_Warnings) return Boolean; + + -- State of warnings. + type Warnings_Setting is private; + + -- Global control of warnings. + -- Used to disable warnings while a referenced unit is analyzed. + procedure Save_Warnings_Setting (Res : out Warnings_Setting); + procedure Disable_All_Warnings; + procedure Restore_Warnings_Setting (Res : Warnings_Setting); + + type Earg_Type is private; + type Earg_Arr is array (Natural range <>) of Earg_Type; + + -- An empty array (for no arguments). + No_Eargs : constant Earg_Arr; + + -- Report display: + -- %%: % + -- %i: identifier + -- %c: character + -- %t: token + -- %l: location + -- %n: node name + -- %s: a string + -- TODO: %m: mode, %y: type of + function "+" (V : Location_Type) return Earg_Type; + function "+" (V : Name_Id) return Earg_Type; + function "+" (V : Character) return Earg_Type; + function "+" (V : String8_Len_Type) return Earg_Type; + + -- Convert location. + function "+" (L : PSL_Node) return Location_Type; + + -- Pass that detected the error. + type Report_Origin is + (Option, Library, Scan, Parse, Semantic, Elaboration); + + type Error_Record is record + Origin : Report_Origin; + Id : Msgid_Type; + Cont : Boolean; + File : Source_File_Entry; + + -- The first line is line 1, 0 can be used when line number is not + -- relevant. + Line : Natural; + + -- Offset in the line. The first character is at offset 0. + Offset : Natural; + + -- Length of the location (for a range). It is assumed to be on the + -- same line; use 0 when unknown. + Length : Natural; + end record; + + type Error_Start_Handler is access procedure (Err : Error_Record); + type Message_Handler is access procedure (Str : String); + type Message_End_Handler is access procedure; + + type Report_Msg_Handler is record + Error_Start : Error_Start_Handler; + Message : Message_Handler; + Message_End : Message_End_Handler; + end record; + + procedure Set_Report_Handler (Handler : Report_Msg_Handler); + + -- Generic report message. LOC maybe No_Location. + -- If ORIGIN is Option or Library, LOC must be No_Location and the program + -- name is displayed. + procedure Report_Msg (Id : Msgid_Type; + Origin : Report_Origin; + Loc : Location_Type; + Msg : String; + Args : Earg_Arr := No_Eargs; + Cont : Boolean := False); + + -- Disp an error, prepended with program name, and raise option_error. + -- This is used for errors before initialisation, such as bad option or + -- bad filename. + procedure Error_Msg_Option (Msg: String); + pragma No_Return (Error_Msg_Option); + + -- Same as Error_Msg_Option but do not raise Option_Error. + procedure Error_Msg_Option_NR (Msg: String); + + -- Warn about an option. + procedure Warning_Msg_Option (Id : Msgid_Warnings; Msg: String); + + function Make_Earg_Vhdl_Node (V : Iir) return Earg_Type; + function Make_Earg_Vhdl_Token (V : Vhdl.Tokens.Token_Type) return Earg_Type; +private + type Earg_Kind is + (Earg_None, + Earg_Iir, Earg_Location, Earg_Id, Earg_Char, Earg_Token, Earg_String8); + + type Earg_Type (Kind : Earg_Kind := Earg_None) is record + case Kind is + when Earg_None => + null; + when Earg_Iir => + Val_Iir : Iir; + when Earg_Location => + Val_Loc : Location_Type; + when Earg_Id => + Val_Id : Name_Id; + when Earg_Char => + Val_Char : Character; + when Earg_Token => + Val_Tok : Vhdl.Tokens.Token_Type; + when Earg_String8 => + Val_Str8 : String8_Len_Type; + end case; + end record; + + No_Eargs : constant Earg_Arr := (1 .. 0 => (Kind => Earg_None)); + + type Warning_Control_Type is record + Enabled : Boolean; + Error : Boolean; + end record; + + type Warnings_Setting is array (Msgid_Warnings) of Warning_Control_Type; + + Default_Warnings : constant Warnings_Setting := + (Warnid_Library | Warnid_Binding | Warnid_Port | Warnid_Shared + | Warnid_Runtime_Error | Warnid_Pure | Warnid_Specs + | Warnid_Hide => (Enabled => True, Error => False), + others => (Enabled => False, Error => False)); + + -- Compute the column from Error_Record E. + function Get_Error_Col (E : Error_Record) return Natural; + + -- Image of VAL, without the leading space. + function Natural_Image (Val: Natural) return String; +end Errorout; |