瀏覽代碼

Added platforms/defaults to StaticLinker (introduced Options.Defaults)

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6942 8c9fc860-2736-0410-a75d-ab315db34111
felixf 8 年之前
父節點
當前提交
43b971c574
共有 3 個文件被更改,包括 110 次插入53 次删除
  1. 11 51
      source/FoxCompiler.Mod
  2. 65 1
      source/Options.Mod
  3. 34 1
      source/StaticLinker.Mod

+ 11 - 51
source/FoxCompiler.Mod

@@ -266,21 +266,6 @@ TYPE
 
 
 		RETURN TRUE;
 		RETURN TRUE;
 	END Modules;
 	END Modules;
-	
-
-	
-	PROCEDURE GetDefaults(CONST name: ARRAY OF CHAR): Streams.Reader;
-	VAR s: Streams.StringReader; platform: Platform;
-	BEGIN
-		s := NIL;
-		platform := GetPlatform(name);
-		IF platform # NIL THEN
-			NEW(s, LEN(platform.defaults));
-			s.Set(platform.defaults);
-		END;
-		RETURN s;
-	END GetDefaults;
-	
 
 
 	PROCEDURE GetOptions*(input: Streams.Reader; error:Streams.Writer; diagnostics: Diagnostics.Diagnostics;
 	PROCEDURE GetOptions*(input: Streams.Reader; error:Streams.Writer; diagnostics: Diagnostics.Diagnostics;
 		VAR compilerOptions: CompilerOptions): BOOLEAN;
 		VAR compilerOptions: CompilerOptions): BOOLEAN;
@@ -328,7 +313,7 @@ TYPE
 		position := input.Pos();
 		position := input.Pos();
 		parsed := options.Parse(input,NIL);
 		parsed := options.Parse(input,NIL);
 		IF options.GetString("platform", name) THEN
 		IF options.GetString("platform", name) THEN
-			defaults := GetDefaults(name);
+			defaults := platforms.Get(name);
 			IF defaults = NIL THEN 	
 			IF defaults = NIL THEN 	
 				error.String("Unknown platform"); error.Ln 
 				error.String("Unknown platform"); error.Ln 
 			ELSE
 			ELSE
@@ -520,52 +505,27 @@ TYPE
 			context.out.Update;
 			context.out.Update;
 		END;
 		END;
 	END CompileReader;
 	END CompileReader;
-	
-	TYPE 
-	Platform = POINTER TO RECORD
-		name: ARRAY 32 OF CHAR;
-		defaults: ARRAY 256 OF CHAR;
-	END;
-	
-	Platforms = OBJECT(Basic.List)
-		PROCEDURE GetPlatform(i: LONGINT): Platform;
-		BEGIN
-			RETURN Get(i)(Platform);
-		END GetPlatform;
-	END Platforms;
-	
-	VAR platforms: Platforms;
+
+	VAR platforms: Options.Defaults;
 	
 	
 	PROCEDURE AddPlatform(CONST name: ARRAY OF CHAR; CONST defaults: ARRAY OF CHAR);
 	PROCEDURE AddPlatform(CONST name: ARRAY OF CHAR; CONST defaults: ARRAY OF CHAR);
-	VAR i: LONGINT; platform: Platform;
 	BEGIN
 	BEGIN
-		platform := GetPlatform(name);
-		IF platform = NIL THEN 
-			NEW(platform);
-			COPY(name, platform.name);
-			platforms.Add(platform);
-		END;
-		COPY(defaults, platform.defaults);
+		platforms.Add(name, defaults);
 	END AddPlatform;
 	END AddPlatform;
 	
 	
-	PROCEDURE GetPlatform(CONST name: ARRAY OF CHAR): Platform;
-	VAR i: LONGINT; platform: Platform;
+	PROCEDURE ShowDefaults*(context: Commands.Context);
 	BEGIN
 	BEGIN
-		FOR i := 0 TO platforms.Length()-1 DO
-			platform := platforms.GetPlatform(i);
-			IF platform.name = name THEN
-				RETURN platform
-			END;
-		END;
-		RETURN  NIL;
-	END GetPlatform;
+		platforms.Show(context.out)
+	END ShowDefaults;
+	
 
 
 BEGIN
 BEGIN
-	NEW(platforms,8);
+	NEW(platforms);
 	(* platform definitions hard coded for the common cases -- maybe (parts of it) should be outsourced to a file ?*)
 	(* platform definitions hard coded for the common cases -- maybe (parts of it) should be outsourced to a file ?*)
 	AddPlatform("Win32","-b=AMD --objectFile=Binary --symbolFile=Binary --objectFileExtensions=.Obw --symbolFileExtension=.Obw");
 	AddPlatform("Win32","-b=AMD --objectFile=Binary --symbolFile=Binary --objectFileExtensions=.Obw --symbolFileExtension=.Obw");
 	AddPlatform("Win32G","-b=AMD --objectFile=Generic --symbolFile=Textual --newObjectFile --mergeSections --objectFileExtension=.GofW --symbolFileExtension=.SymW --preciseGC");
 	AddPlatform("Win32G","-b=AMD --objectFile=Generic --symbolFile=Textual --newObjectFile --mergeSections --objectFileExtension=.GofW --symbolFileExtension=.SymW --preciseGC");
-	AddPlatform("Minos","-b=ARM --objectFile=Generic --newObjectFile --metaData=simple --objectFileExtension=.Goa --symbolFileExtension=.Sya");
+	AddPlatform("ARM","-b=ARM --objectFile=Generic --newObjectFile --metaData=simple --objectFileExtension=.Goa --symbolFileExtension=.Sya");
+	AddPlatform("Minos","-b=ARM --objectFile=Minos"); 
 	AddPlatform("TRM","-b=TRM --objectFile=Generic --newObjectFile --metaData=simple --objectFileExtension=.GofT --symbolFileExtension=.SymT");
 	AddPlatform("TRM","-b=TRM --objectFile=Generic --newObjectFile --metaData=simple --objectFileExtension=.GofT --symbolFileExtension=.SymT");
 	AddPlatform("TRMI","-b=TRM --objectFile=Intermediate --newObjectFile --metaData=simple --objectFileExtension=.IroT --symbolFileExtension=.IrsT");
 	AddPlatform("TRMI","-b=TRM --objectFile=Intermediate --newObjectFile --metaData=simple --objectFileExtension=.IroT --symbolFileExtension=.IrsT");
 	AddPlatform("A2","-b=AMD --objectFile=Binary --objectFileExtension=.Obx --symbolFileExtension=.Obx");
 	AddPlatform("A2","-b=AMD --objectFile=Binary --objectFileExtension=.Obx --symbolFileExtension=.Obx");

+ 65 - 1
source/Options.Mod

@@ -40,7 +40,7 @@ MODULE Options; (** AUTHOR "staubesv"; PURPOSE "Command line options parsing"; *
  *)
  *)
 
 
 IMPORT
 IMPORT
-	KernelLog, Streams, Commands;
+	KernelLog, Streams, Strings, Commands;
 
 
 CONST
 CONST
 
 
@@ -577,6 +577,70 @@ TYPE
 
 
 	END Options;
 	END Options;
 
 
+	Default = POINTER TO RECORD
+		name: Name;
+		defaults: Strings.String;
+		next: Default;
+	END;
+	
+	Defaults* = OBJECT
+	VAR
+		head, tail: Default;
+		
+		PROCEDURE &InitDefaults*;
+		BEGIN
+			head := NIL; tail := NIL;
+		END InitDefaults;
+		
+		PROCEDURE Add*(CONST name, defaults: ARRAY OF CHAR);
+		VAR default: Default;
+		BEGIN
+			default := head;
+			WHILE (default # NIL) & (default.name # name) DO
+				default := default.next;
+			END;
+			IF default = NIL THEN 
+				NEW(default); 
+				COPY(name, default.name); default.defaults := Strings.NewString(defaults);
+				IF tail = NIL THEN head := default 
+				ELSE tail.next := default;
+				END;
+				tail := default;
+			ELSE
+				default.defaults := Strings.ConcatToNew(default.defaults^, " ");
+				default.defaults := Strings.ConcatToNew(default.defaults^, defaults);
+			END;
+		END Add;
+	
+		PROCEDURE Get*(CONST name: ARRAY OF CHAR): Streams.Reader;
+		VAR s: Streams.StringReader; default: Default;
+		BEGIN
+			s := NIL;
+			default := head;
+			WHILE (default # NIL) & (default.name # name) DO
+				default := default.next;
+			END;
+			IF default # NIL THEN
+				NEW(s, LEN(default.defaults));
+				s.Set(default.defaults^);
+			END;
+			RETURN s;
+		END Get;
+		
+		PROCEDURE Show*(out: Streams.Writer);
+		VAR default: Default;
+		BEGIN
+			default := head;
+			WHILE (default # NIL)  DO
+				out.String(default.name); out.String(" : "); out.String(default.defaults^); out.Ln;
+				default := default.next;
+			END;
+
+		END Show;
+		
+
+	END Defaults; 
+
 (** merge base options into options -- replacing only options that had not been set previously *)
 (** merge base options into options -- replacing only options that had not been set previously *)
 PROCEDURE Merge*(VAR this: Options;  base: Options);
 PROCEDURE Merge*(VAR this: Options;  base: Options);
 VAR i,index: LONGINT;
 VAR i,index: LONGINT;

+ 34 - 1
source/StaticLinker.Mod

@@ -170,6 +170,8 @@ END Arrangement;
 
 
 TYPE FileFormat = PROCEDURE (linker: GenericLinker.Linker; arrangement: Arrangement; writer: Files.Writer);
 TYPE FileFormat = PROCEDURE (linker: GenericLinker.Linker; arrangement: Arrangement; writer: Files.Writer);
 
 
+VAR defaults: Options.Defaults;
+
 PROCEDURE Align(this, to: LONGINT): LONGINT;
 PROCEDURE Align(this, to: LONGINT): LONGINT;
 BEGIN
 BEGIN
 	this := this + (-this) MOD to;
 	this := this + (-this) MOD to;
@@ -902,8 +904,13 @@ VAR options: Options.Options;
 	use: SET;
 	use: SET;
 	exportString: ARRAY 1024 OF CHAR;
 	exportString: ARRAY 1024 OF CHAR;
 	error: BOOLEAN;
 	error: BOOLEAN;
+	parsed: BOOLEAN;
+	position: LONGINT;
+	name: ARRAY 32 OF CHAR;
+	reader: Streams.Reader;
 BEGIN
 BEGIN
 	NEW (options);
 	NEW (options);
+	options.Add('p',"platform", Options.String);
 	options.Add (0X, "silent", Options.Flag);
 	options.Add (0X, "silent", Options.Flag);
 	options.Add ('a', "useAll", Options.Flag);
 	options.Add ('a', "useAll", Options.Flag);
 	options.Add ('s', "strict", Options.Flag);
 	options.Add ('s', "strict", Options.Flag);
@@ -914,7 +921,22 @@ BEGIN
 	options.Add (0X, "logFileName", Options.String);
 	options.Add (0X, "logFileName", Options.String);
 	options.Add(0X,"linkRoot", Options.String);
 	options.Add(0X,"linkRoot", Options.String);
 	options.Add(0X,"exports", Options.String);
 	options.Add(0X,"exports", Options.String);
-	IF ~options.Parse (context.arg, context.error) THEN context.result := Commands.CommandParseError; RETURN; END;
+
+	position := context.arg.Pos();
+	parsed := options.Parse(context.arg,NIL);
+	IF options.GetString("platform", name) THEN
+		reader := defaults.Get(name);
+		IF reader = NIL THEN 
+			context.error.String("Unknown platform"); context.error.Ln 
+		ELSE
+			parsed := options.Parse(reader, NIL) & parsed;
+			context.arg.SetPos(position);
+			context.arg.SetPos(position);
+			parsed := options.Parse(context.arg, context.error) & parsed; (* reparse overwrites *)
+		END;
+	END;
+		
+	IF ~parsed THEN context.result := Commands.CommandParseError; RETURN; END;
 	silent := options.GetFlag ("silent");
 	silent := options.GetFlag ("silent");
 	useAll := options.GetFlag ("useAll");
 	useAll := options.GetFlag ("useAll");
 	strict := options.GetFlag ("strict");
 	strict := options.GetFlag ("strict");
@@ -981,6 +1003,17 @@ BEGIN
 	IF error THEN context.result := Commands.CommandError; END;
 	IF error THEN context.result := Commands.CommandError; END;
 END Link;
 END Link;
 
 
+PROCEDURE ShowDefaults*(context: Commands.Context);
+BEGIN
+	defaults.Show(context.out);
+END ShowDefaults;
+
+BEGIN
+	NEW(defaults);
+	defaults.Add("Win32C","--fileFormat=PE32CUI --fileName=oberon.exe --extension=GofW --displacement=401000H");
+	defaults.Add("Linux32G","--fileFormat=Raw --fileName=oberon --extension=.GofU --displacement=08048000H");
+	defaults.Add("RPI","--fileName=kernel.img --extension=.Goa --displacement=8000H -sa ");
+	
 END StaticLinker.
 END StaticLinker.
 
 
 StaticLinker.Link --fileName=test.exe --fileFormat=PE32 --displacement=401000H Test ~
 StaticLinker.Link --fileName=test.exe --fileFormat=PE32 --displacement=401000H Test ~