aboutsummaryrefslogtreecommitdiffstats
path: root/src/ghdldrv
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2021-04-10 11:07:13 +0200
committerTristan Gingold <tgingold@free.fr>2021-04-10 18:14:09 +0200
commit849a25e02cfb359e3d9313060156b0643495548b (patch)
tree3d84c0107a7a7beccc780a352da1393c2cdd633f /src/ghdldrv
parent6b4051a0b29effd4210d99609dcbd0eceff8111f (diff)
downloadghdl-849a25e02cfb359e3d9313060156b0643495548b.tar.gz
ghdl-849a25e02cfb359e3d9313060156b0643495548b.tar.bz2
ghdl-849a25e02cfb359e3d9313060156b0643495548b.zip
ghdldrv,configure: allow LIB.UNIT name for -e/-r commands. Fix #1718
Diffstat (limited to 'src/ghdldrv')
-rw-r--r--src/ghdldrv/ghdlcomp.adb16
-rw-r--r--src/ghdldrv/ghdldrv.adb42
-rw-r--r--src/ghdldrv/ghdllocal.adb50
-rw-r--r--src/ghdldrv/ghdllocal.ads4
-rw-r--r--src/ghdldrv/ghdlsynth.adb6
5 files changed, 91 insertions, 27 deletions
diff --git a/src/ghdldrv/ghdlcomp.adb b/src/ghdldrv/ghdlcomp.adb
index c62348752..c778ecfb5 100644
--- a/src/ghdldrv/ghdlcomp.adb
+++ b/src/ghdldrv/ghdlcomp.adb
@@ -327,14 +327,15 @@ package body Ghdlcomp is
Opt_Arg : out Natural;
Config : out Iir)
is
+ Lib_Id : Name_Id;
Prim_Id : Name_Id;
Sec_Id : Name_Id;
begin
- Extract_Elab_Unit (Cmd_Name, Args, Opt_Arg, Prim_Id, Sec_Id);
+ Extract_Elab_Unit (Cmd_Name, Args, Opt_Arg, Lib_Id, Prim_Id, Sec_Id);
Flags.Flag_Elaborate := True;
- Config := Vhdl.Configuration.Configure (Prim_Id, Sec_Id);
+ Config := Vhdl.Configuration.Configure (Lib_Id, Prim_Id, Sec_Id);
if Config = Null_Iir
or else Errorout.Nbr_Errors > 0
then
@@ -730,6 +731,7 @@ package body Ghdlcomp is
is
pragma Unreferenced (Cmd);
+ Lib_Id : Name_Id;
Prim_Id : Name_Id;
Sec_Id : Name_Id;
Files_List : Iir_List;
@@ -741,13 +743,13 @@ package body Ghdlcomp is
Unit : Iir_Design_Unit;
Lib : Iir_Library_Declaration;
begin
- Extract_Elab_Unit ("-m", Args, Next_Arg, Prim_Id, Sec_Id);
+ Extract_Elab_Unit ("-m", Args, Next_Arg, Lib_Id, Prim_Id, Sec_Id);
if not Setup_Libraries (True) then
return;
end if;
-- Create list of files.
- Files_List := Build_Dependence (Prim_Id, Sec_Id);
+ Files_List := Build_Dependence (Lib_Id, Prim_Id, Sec_Id);
-- Unmark all libraries.
Lib := Libraries.Std_Library;
@@ -874,6 +876,7 @@ package body Ghdlcomp is
use Name_Table;
HT : constant Character := ASCII.HT;
+ Lib_Id : Name_Id;
Prim_Id : Name_Id;
Sec_Id : Name_Id;
Files_List : Iir_List;
@@ -885,11 +888,12 @@ package body Ghdlcomp is
Next_Arg : Natural;
begin
- Extract_Elab_Unit ("--gen-makefile", Args, Next_Arg, Prim_Id, Sec_Id);
+ Extract_Elab_Unit
+ ("--gen-makefile", Args, Next_Arg, Lib_Id, Prim_Id, Sec_Id);
if not Setup_Libraries (True) then
return;
end if;
- Files_List := Build_Dependence (Prim_Id, Sec_Id);
+ Files_List := Build_Dependence (Lib_Id, Prim_Id, Sec_Id);
Ghdllocal.Gen_Makefile_Disp_Header;
diff --git a/src/ghdldrv/ghdldrv.adb b/src/ghdldrv/ghdldrv.adb
index fea5a9a40..2d56dd821 100644
--- a/src/ghdldrv/ghdldrv.adb
+++ b/src/ghdldrv/ghdldrv.adb
@@ -954,6 +954,7 @@ package body Ghdldrv is
-- Elaboration.
+ Library_Id : Name_Id;
Primary_Id : Name_Id;
Secondary_Id : Name_Id;
Base_Name : String_Access;
@@ -964,19 +965,39 @@ package body Ghdldrv is
procedure Set_Elab_Units (Cmd : in out Command_Comp'Class;
Cmd_Name : String;
Args : Argument_List;
- Run_Arg : out Natural) is
+ Run_Arg : out Natural)
+ is
+ function Library_Prefix_Image (Id : Name_Id) return String is
+ begin
+ if Id = Null_Identifier then
+ return "";
+ else
+ return Image (Id) & '.';
+ end if;
+ end Library_Prefix_Image;
+
+ function Arch_Suffix_Image (Id : Name_Id) return String is
+ begin
+ if Id = Null_Identifier then
+ return "";
+ else
+ return '(' & Image (Id) & ')';
+ end if;
+ end Arch_Suffix_Image;
begin
- Extract_Elab_Unit (Cmd_Name, Args, Run_Arg, Primary_Id, Secondary_Id);
+ Library_Id := Null_Identifier;
+ Extract_Elab_Unit (Cmd_Name, Args, Run_Arg,
+ Library_Id, Primary_Id, Secondary_Id);
if Secondary_Id = Null_Identifier then
Base_Name := new String'(Image (Primary_Id));
- Unit_Name := new String'(Image (Primary_Id));
else
- Base_Name :=
- new String'(Image (Primary_Id) & '-' & Image (Secondary_Id));
- Unit_Name :=
- new String'(Image (Primary_Id) & '(' & Image (Secondary_Id) & ')');
+ Base_Name := new String'(Image (Primary_Id)
+ & '-' & Image (Secondary_Id));
end if;
+ Unit_Name := new String'(Library_Prefix_Image (Library_Id)
+ & Image (Primary_Id)
+ & Arch_Suffix_Image (Secondary_Id));
Filelist_Name := null;
-- Choose a default name for the executable.
@@ -1231,11 +1252,12 @@ package body Ghdldrv is
procedure Perform_Action (Cmd : in out Command_Run; Args : Argument_List)
is
Suffix : constant String_Access := Get_Executable_Suffix;
+ Lib_Id : Name_Id;
Prim_Id : Name_Id;
Sec_Id : Name_Id;
Opt_Arg : Natural;
begin
- Extract_Elab_Unit ("-r", Args, Opt_Arg, Prim_Id, Sec_Id);
+ Extract_Elab_Unit ("-r", Args, Opt_Arg, Lib_Id, Prim_Id, Sec_Id);
if Sec_Id = Null_Identifier then
Base_Name := new String'
(Image (Prim_Id) & Suffix.all);
@@ -1614,7 +1636,7 @@ package body Ghdldrv is
Setup_Compiler (Cmd, True);
-- Create list of files.
- Files_List := Build_Dependence (Primary_Id, Secondary_Id);
+ Files_List := Build_Dependence (Library_Id, Primary_Id, Secondary_Id);
if Errorout.Nbr_Errors /= 0 then
raise Errorout.Compilation_Error;
@@ -1885,7 +1907,7 @@ package body Ghdldrv is
if not Setup_Libraries (True) then
raise Option_Error;
end if;
- Files_List := Build_Dependence (Primary_Id, Secondary_Id);
+ Files_List := Build_Dependence (Library_Id, Primary_Id, Secondary_Id);
Ghdllocal.Gen_Makefile_Disp_Header;
diff --git a/src/ghdldrv/ghdllocal.adb b/src/ghdldrv/ghdllocal.adb
index b77992520..92a7e1c7e 100644
--- a/src/ghdldrv/ghdllocal.adb
+++ b/src/ghdldrv/ghdllocal.adb
@@ -1437,7 +1437,8 @@ package body Ghdllocal is
end loop;
end Check_No_Elab_Flag;
- function Build_Dependence (Prim : Name_Id; Sec : Name_Id) return Iir_List
+ function Build_Dependence (Lib : Name_Id; Prim : Name_Id; Sec : Name_Id)
+ return Iir_List
is
procedure Build_Dependence_List (File : Iir_Design_File; List : Iir_List)
is
@@ -1515,7 +1516,7 @@ package body Ghdllocal is
Flag_Load_All_Design_Units := True;
Flag_Build_File_Dependence := True;
- Top := Configure (Prim, Sec);
+ Top := Configure (Lib, Prim, Sec);
if Top = Null_Iir then
-- Error during configuration (primary unit not found).
raise Option_Error;
@@ -1742,6 +1743,7 @@ package body Ghdllocal is
procedure Extract_Elab_Unit (Cmd_Name : String;
Args : Argument_List;
Next_Arg : out Natural;
+ Lib_Id : out Name_Id;
Prim_Id : out Name_Id;
Sec_Id : out Name_Id) is
begin
@@ -1750,10 +1752,40 @@ package body Ghdllocal is
raise Option_Error;
end if;
- Prim_Id := Convert_Name (Args (Args'First).all);
- if Prim_Id = Null_Identifier then
- raise Option_Error;
- end if;
+ declare
+ S : constant String_Access := Args (Args'First);
+ Dot : Natural;
+ begin
+ Lib_Id := Null_Identifier;
+
+ Dot := S'First - 1;
+ if S (S'First) /= '\' then
+ for I in S'Range loop
+ if S (I) = '.' then
+ if I = S'First then
+ Error ("missing library name before '.'");
+ raise Option_Error;
+ end if;
+ if I = S'Last then
+ Error ("missing primary name after '.'");
+ raise Option_Error;
+ end if;
+ Dot := I;
+ Lib_Id := Convert_Name (S (S'First .. Dot - 1));
+ if Lib_Id = Null_Identifier then
+ raise Option_Error;
+ end if;
+ exit;
+ end if;
+ end loop;
+ end if;
+
+ Prim_Id := Convert_Name (S (Dot + 1 .. S'Last));
+ if Prim_Id = Null_Identifier then
+ raise Option_Error;
+ end if;
+ end;
+
Next_Arg := Args'First + 1;
Sec_Id := Null_Identifier;
@@ -1828,6 +1860,7 @@ package body Ghdllocal is
pragma Unreferenced (Cmd);
use Name_Table;
+ Lib_Id : Name_Id;
Prim_Id : Name_Id;
Sec_Id : Name_Id;
Files_List : Iir_List;
@@ -1838,11 +1871,12 @@ package body Ghdllocal is
Next_Arg : Natural;
begin
- Extract_Elab_Unit ("--elab-order", Args, Next_Arg, Prim_Id, Sec_Id);
+ Extract_Elab_Unit
+ ("--elab-order", Args, Next_Arg, Lib_Id, Prim_Id, Sec_Id);
if not Setup_Libraries (True) then
return;
end if;
- Files_List := Build_Dependence (Prim_Id, Sec_Id);
+ Files_List := Build_Dependence (Lib_Id, Prim_Id, Sec_Id);
Files_It := List_Iterate (Files_List);
while Is_Valid (Files_It) loop
diff --git a/src/ghdldrv/ghdllocal.ads b/src/ghdldrv/ghdllocal.ads
index 2d0ddb7a8..c182f6c0e 100644
--- a/src/ghdldrv/ghdllocal.ads
+++ b/src/ghdldrv/ghdllocal.ads
@@ -130,7 +130,8 @@ package Ghdllocal is
-- Raise errorout.compilation_error in case of error (parse error).
procedure Load_All_Libraries_And_Files;
- function Build_Dependence (Prim : Name_Id; Sec : Name_Id) return Iir_List;
+ function Build_Dependence (Lib : Name_Id; Prim : Name_Id; Sec : Name_Id)
+ return Iir_List;
-- Return True iff file FILE has been modified (the file time stamp does
-- no correspond to what was recorded in the library).
@@ -144,6 +145,7 @@ package Ghdllocal is
procedure Extract_Elab_Unit (Cmd_Name : String;
Args : Argument_List;
Next_Arg : out Natural;
+ Lib_Id : out Name_Id;
Prim_Id : out Name_Id;
Sec_Id : out Name_Id);
diff --git a/src/ghdldrv/ghdlsynth.adb b/src/ghdldrv/ghdlsynth.adb
index b0c85ba26..d95ea55e3 100644
--- a/src/ghdldrv/ghdlsynth.adb
+++ b/src/ghdldrv/ghdlsynth.adb
@@ -247,6 +247,7 @@ package body Ghdlsynth is
Design_File : Iir;
Config : Iir;
Top : Iir;
+ Lib_Id : Name_Id;
Prim_Id : Name_Id;
Sec_Id : Name_Id;
begin
@@ -359,18 +360,19 @@ package body Ghdlsynth is
-- No need to configure if there are missing units.
return Null_Iir;
end if;
+ Lib_Id := Null_Identifier;
Prim_Id := Get_Identifier (Top);
Sec_Id := Null_Identifier;
else
Extract_Elab_Unit ("--synth", Args (E_Opt + 1 .. Args'Last), Opt_Arg,
- Prim_Id, Sec_Id);
+ Lib_Id, Prim_Id, Sec_Id);
if Opt_Arg <= Args'Last then
Ghdlmain.Error ("extra options ignored");
return Null_Iir;
end if;
end if;
- Config := Vhdl.Configuration.Configure (Prim_Id, Sec_Id);
+ Config := Vhdl.Configuration.Configure (Lib_Id, Prim_Id, Sec_Id);
if Nbr_Errors > 0 then
-- No need to configure if there are missing units.