X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fmcs%2Fdriver.cs;h=f688846d991d93787f8598985831232e4503fdda;hb=b68b65ad17932bbe2d1fd565456063d90e08aaa5;hp=7c5e99d01fea9b4df7e5e707ef687f7574ddedf2;hpb=de7ab4b8b19e7c2fba538bc993b5c32417fcc606;p=mono.git diff --git a/mcs/mcs/driver.cs b/mcs/mcs/driver.cs index 7c5e99d01fe..f688846d991 100644 --- a/mcs/mcs/driver.cs +++ b/mcs/mcs/driver.cs @@ -26,6 +26,12 @@ namespace Mono.CSharp public enum Target { Library, Exe, Module, WinExe }; + +#if GMCS_SOURCE + enum Platform { + AnyCPU, X86, X64, IA64 + }; +#endif /// /// The compiler driver. @@ -35,24 +41,24 @@ namespace Mono.CSharp // // Assemblies references to be linked. Initialized with // mscorlib.dll here. - static ArrayList references; + ArrayList references; // // If any of these fail, we ignore the problem. This is so // that we can list all the assemblies in Windows and not fail // if they are missing on Linux. // - static ArrayList soft_references; + ArrayList soft_references; // // External aliases for assemblies. // - static Hashtable external_aliases; + Hashtable external_aliases; // // Modules to be linked // - static ArrayList modules; + ArrayList modules; // Lookup paths static ArrayList link_paths; @@ -74,9 +80,9 @@ namespace Mono.CSharp // // A list of resource files // - static Resources embedded_resources; - static string win32ResourceFile; - static string win32IconFile; + Resources embedded_resources; + string win32ResourceFile; + string win32IconFile; // // Output file @@ -97,8 +103,6 @@ namespace Mono.CSharp static public void Reset () { - embedded_resources = null; - win32ResourceFile = win32IconFile = null; output_file = null; } @@ -239,7 +243,7 @@ namespace Mono.CSharp " -help Lists all compiler options (short: -?)\n" + " -keycontainer:NAME The key pair container used to sign the output assembly\n" + " -keyfile:FILE The key file used to strongname the ouput assembly\n" + - " -langversion:TEXT Specifies language version modes: ISO-1, ISO-2, or Default\n" + + " -langversion:TEXT Specifies language version: ISO-1, ISO-2, Default, or Future\n" + " -lib:PATH1[,PATHn] Specifies the location of referenced assemblies\n" + " -main:CLASS Specifies the class with the Main method (short: -m)\n" + " -noconfig Disables implicitly referenced assemblies\n" + @@ -250,6 +254,8 @@ namespace Mono.CSharp #if !SMCS_SOURCE " -pkg:P1[,Pn] References packages P1..Pn\n" + #endif + " -platform:ARCH Specifies the target platform of the output assembly\n" + + " ARCH can be one of: anycpu, x86, x64 or itanium\n" + " -recurse:SPEC Recursively compiles files according to SPEC pattern\n" + " -reference:A1[,An] Imports metadata from the specified assembly (short: -r)\n" + " -reference:ALIAS=A Imports metadata using specified extern alias (short: -r)\n" + @@ -257,7 +263,7 @@ namespace Mono.CSharp " KIND can be one of: exe, winexe, library, module\n" + " -unsafe[+|-] Allows to compile code which uses unsafe keyword\n" + " -warnaserror[+|-] Treats all warnings as errors\n" + - " -warnaserror:W1[,Wn] Treats one or more compiler warnings as errors\n" + + " -warnaserror[+|-]:W1[,Wn] Treats one or more compiler warnings as errors\n" + " -warn:0-4 Sets warning level, the default is 4 (short -w:)\n" + " -help2 Shows internal compiler options\n" + "\n" + @@ -291,24 +297,25 @@ namespace Mono.CSharp public static int Main (string[] args) { - RootContext.Version = LanguageVersion.Default; - Location.InEmacs = Environment.GetEnvironmentVariable ("EMACS") == "t"; Driver d = Driver.Create (args, true); if (d == null) return 1; - else if (d.Compile () && Report.Errors == 0) { + if (d.Compile () && Report.Errors == 0) { if (Report.Warnings > 0) { Console.WriteLine ("Compilation succeeded - {0} warning(s)", Report.Warnings); } + Environment.Exit (0); return 0; - } else { - Console.WriteLine("Compilation failed: {0} error(s), {1} warnings", - Report.Errors, Report.Warnings); - return 1; } + + + Console.WriteLine("Compilation failed: {0} error(s), {1} warnings", + Report.Errors, Report.Warnings); + Environment.Exit (1); + return 1; } static public void LoadAssembly (string assembly, bool soft) @@ -404,9 +411,9 @@ namespace Mono.CSharp // Extern aliased refs require special handling if (alias == null) - RootNamespace.Global.AddAssemblyReference (a); + GlobalRootNamespace.Instance.AddAssemblyReference (a); else - RootNamespace.DefineRootNamespace (alias, a); + GlobalRootNamespace.Instance.DefineRootNamespace (alias, a); } catch (BadImageFormatException f) { // .NET 2.0 throws this if we try to load a module without an assembly manifest ... @@ -446,7 +453,7 @@ namespace Mono.CSharp } } - RootNamespace.Global.AddModuleReference (m); + GlobalRootNamespace.Instance.AddModuleReference (m); } catch (BadImageFormatException f) { Error9 ("module", f.FileName, f.FusionLog); @@ -458,7 +465,7 @@ namespace Mono.CSharp /// /// Loads all assemblies referenced on the command line /// - static public void LoadReferences () + public void LoadReferences () { link_paths.Add (GetSystemDir ()); link_paths.Add (Directory.GetCurrentDirectory ()); @@ -478,7 +485,7 @@ namespace Mono.CSharp foreach (DictionaryEntry entry in external_aliases) LoadAssembly ((string) entry.Value, (string) entry.Key, false); - RootNamespace.ComputeNamespaces (); + GlobalRootNamespace.Instance.ComputeNamespaces (); } static string [] LoadArgs (string file) @@ -781,6 +788,8 @@ namespace Mono.CSharp if (RootContext.Version > LanguageVersion.ISO_2) soft_references.Add ("System.Core"); + if (RootContext.Version > LanguageVersion.V_3) + soft_references.Add ("Microsoft.CSharp"); } public static string OutputFile @@ -984,11 +993,6 @@ namespace Mono.CSharp Report.Fatal = true; return true; - case "--werror": - Report.Warning (-29, 1, "Compatibility: Use -warnaserror: option instead of --werror"); - Report.WarningsAreErrors = true; - return true; - case "--nowarn": Report.Warning (-29, 1, "Compatibility: Use -nowarn instead of --nowarn"); if ((i + 1) >= args.Length){ @@ -1228,7 +1232,7 @@ namespace Mono.CSharp if (embedded_resources == null) embedded_resources = new Resources (); - bool embeded = arg.StartsWith ("/r"); + bool embeded = arg [1] == 'r' || arg [1] == 'R'; string[] s = value.Split (argument_value_separator); switch (s.Length) { case 1: @@ -1347,6 +1351,11 @@ namespace Mono.CSharp return true; case "/debug": + if (value == "full" || value == "") + want_debugging_support = true; + + return true; + case "/debug+": want_debugging_support = true; return true; @@ -1378,6 +1387,7 @@ namespace Mono.CSharp return true; case "/warnaserror": + case "/warnaserror+": if (value.Length == 0) { Report.WarningsAreErrors = true; } else { @@ -1386,12 +1396,13 @@ namespace Mono.CSharp } return true; - case "/warnaserror+": - Report.WarningsAreErrors = true; - return true; - case "/warnaserror-": - Report.WarningsAreErrors = false; + if (value.Length == 0) { + Report.WarningsAreErrors = false; + } else { + foreach (string wid in value.Split (argument_value_separator)) + Report.RemoveWarningAsError (wid); + } return true; case "/warn": @@ -1428,6 +1439,33 @@ namespace Mono.CSharp load_default_config = false; return true; + case "/platform": +#if GMCS_SOURCE + switch (value.ToLower (CultureInfo.InvariantCulture)) { + case "anycpu": + RootContext.Platform = Platform.AnyCPU; + break; + case "x86": + RootContext.Platform = Platform.X86; + break; + case "x64": + RootContext.Platform = Platform.X64; + break; + case "itanium": + RootContext.Platform = Platform.IA64; + break; + default: + Report.Error (1672, "Invalid platform type for -platform. Valid options are `anycpu', `x86', `x64' or `itanium'"); + break; + } +#endif + return true; + + // We just ignore this. + case "/errorreport": + case "/filealign": + return true; + case "/help2": OtherFlags (); Environment.Exit(0); @@ -1493,13 +1531,18 @@ namespace Mono.CSharp RootContext.AddConditional ("__V2__"); #endif return true; -#if GMCS_SOURCE case "iso-2": RootContext.Version = LanguageVersion.ISO_2; return true; -#endif + case "3": + RootContext.Version = LanguageVersion.V_3; + return true; + case "future": + RootContext.Version = LanguageVersion.Future; + return true; } - Report.Error (1617, "Invalid option `{0}' for /langversion. It must be either `ISO-1', `ISO-2' or `Default'", value); + + Report.Error (1617, "Invalid -langversion option `{0}'. It must be `ISO-1', `ISO-2', `3' or `Default'", value); return true; case "/codepage": @@ -1554,7 +1597,7 @@ namespace Mono.CSharp return new_args; } - static void AddExternAlias (string identifier, string assembly) + void AddExternAlias (string identifier, string assembly) { if (assembly.Length == 0) { Report.Error (1680, "Invalid reference alias '" + identifier + "='. Missing filename"); @@ -1597,6 +1640,9 @@ namespace Mono.CSharp // public bool Compile () { + // TODO: Should be passed to parser as an argument + RootContext.ToplevelTypes = new ModuleContainer (RootContext.Unsafe); + Parse (); if (Report.Errors > 0) return false; @@ -1640,7 +1686,7 @@ namespace Mono.CSharp set_method.Invoke (CodeGen.Assembly.Builder, BindingFlags.Default, null, new object[]{true}, null); } - RootNamespace.Global.AddModuleReference (CodeGen.Module.Builder); + GlobalRootNamespace.Instance.AddModuleReference (RootContext.ToplevelTypes.Builder); // // Load assemblies required @@ -1666,8 +1712,6 @@ namespace Mono.CSharp if (timestamps) ShowTime (" Core Types done"); - CodeGen.Module.Resolve (); - // // The second pass of the compiler // @@ -1741,7 +1785,7 @@ namespace Mono.CSharp } if (RootContext.NeedsEntryPoint) { - MethodInfo ep = RootContext.EntryPoint; + Method ep = RootContext.EntryPoint; if (ep == null) { if (RootContext.MainClass != null) { @@ -1766,7 +1810,7 @@ namespace Mono.CSharp return false; } - CodeGen.Assembly.Builder.SetEntryPoint (ep, k); + CodeGen.Assembly.Builder.SetEntryPoint (ep.MethodBuilder, k); } else if (RootContext.MainClass != null) { Report.Error (2017, "Cannot specify -main if building a module or library"); } @@ -1788,7 +1832,7 @@ namespace Mono.CSharp try { CodeGen.Assembly.Builder.DefineUnmanagedResource (win32ResourceFile); } catch (ArgumentException) { - Report.RuntimeMissingSupport (Location.Null, "resource embeding"); + Report.RuntimeMissingSupport (Location.Null, "resource embedding "); } } else { CodeGen.Assembly.Builder.DefineVersionInfoResource (); @@ -1797,7 +1841,7 @@ namespace Mono.CSharp if (win32IconFile != null) { MethodInfo define_icon = typeof (AssemblyBuilder).GetMethod ("DefineIconResource", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (define_icon == null) { - Report.RuntimeMissingSupport (Location.Null, "resource embeding"); + Report.RuntimeMissingSupport (Location.Null, "resource embedding"); } else { define_icon.Invoke (CodeGen.Assembly.Builder, new object [] { win32IconFile }); } @@ -1986,14 +2030,14 @@ namespace Mono.CSharp { Driver.Reset (); RootContext.Reset (full_flag); - Tokenizer.Reset (); Location.Reset (); Report.Reset (); TypeManager.Reset (); + PredefinedAttributes.Reset (); TypeHandle.Reset (); if (full_flag) - RootNamespace.Reset (); + GlobalRootNamespace.Reset (); NamespaceEntry.Reset (); CodeGen.Reset (); @@ -2004,6 +2048,9 @@ namespace Mono.CSharp AnonymousMethodStorey.Reset (); SymbolWriter.Reset (); Switch.Reset (); + Linq.QueryBlock.TransparentParameter.Reset (); + Convert.Reset (); + TypeInfo.Reset (); } }