diff --git a/src/main.cpp b/src/main.cpp
index 64ba76f99..04d3bdf52 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -2179,137 +2179,15 @@ gb_internal void print_show_help(String const arg0, String const &command) {
print_usage_line(1, "Flags");
print_usage_line(0, "");
- if (check) {
- print_usage_line(1, "-file");
- print_usage_line(2, "Tells `%.*s %.*s` to treat the given file as a self-contained package.", LIT(arg0), LIT(command));
- print_usage_line(2, "This means that `
/a.odin` won't have access to `/b.odin`'s contents.");
- print_usage_line(0, "");
- }
if (doc) {
- print_usage_line(1, "-short");
- print_usage_line(2, "Shows shortened documentation for the packages.");
- print_usage_line(0, "");
-
print_usage_line(1, "-all-packages");
print_usage_line(2, "Generates documentation for all packages used in the current project.");
print_usage_line(0, "");
-
- print_usage_line(1, "-doc-format");
- print_usage_line(2, "Generates documentation as the .odin-doc format (useful for external tooling).");
- print_usage_line(0, "");
-
- print_usage_line(1, "-out:");
- print_usage_line(2, "Sets the base name of the resultig .odin-doc file.");
- print_usage_line(2, "The extension can be optionally included; the resulting file will always have an extension of '.odin-doc'.");
- print_usage_line(2, "Example: -out:foo");
- print_usage_line(0, "");
}
-
- if (run_or_build) {
- print_usage_line(1, "-out:");
- print_usage_line(2, "Sets the file name of the outputted executable.");
- print_usage_line(2, "Example: -out:foo.exe");
- print_usage_line(0, "");
-
- print_usage_line(1, "-o:");
- print_usage_line(2, "Sets the optimization mode for compilation.");
- print_usage_line(2, "Available options:");
- print_usage_line(3, "-o:none");
- print_usage_line(3, "-o:minimal");
- print_usage_line(3, "-o:size");
- print_usage_line(3, "-o:speed");
- if (LB_USE_NEW_PASS_SYSTEM) {
- print_usage_line(3, "-o:aggressive");
- }
- print_usage_line(2, "The default is -o:minimal.");
- print_usage_line(0, "");
- }
-
- if (check) {
- print_usage_line(1, "-show-timings");
- print_usage_line(2, "Shows basic overview of the timings of different stages within the compiler in milliseconds.");
- print_usage_line(0, "");
-
- print_usage_line(1, "-show-more-timings");
- print_usage_line(2, "Shows an advanced overview of the timings of different stages within the compiler in milliseconds.");
- print_usage_line(0, "");
-
- print_usage_line(1, "-show-system-calls");
- print_usage_line(2, "Prints the whole command and arguments for calls to external tools like linker and assembler.");
- print_usage_line(0, "");
-
- print_usage_line(1, "-export-timings:");
- print_usage_line(2, "Exports timings to one of a few formats. Requires `-show-timings` or `-show-more-timings`.");
- print_usage_line(2, "Available options:");
- print_usage_line(3, "-export-timings:json Exports compile time stats to JSON.");
- print_usage_line(3, "-export-timings:csv Exports compile time stats to CSV.");
- print_usage_line(0, "");
-
- print_usage_line(1, "-export-timings-file:");
- print_usage_line(2, "Specifies the filename for `-export-timings`.");
- print_usage_line(2, "Example: -export-timings-file:timings.json");
- print_usage_line(0, "");
-
- print_usage_line(1, "-export-dependencies:");
- print_usage_line(2, "Exports dependencies to one of a few formats. Requires `-export-dependencies-file`.");
- print_usage_line(2, "Available options:");
- print_usage_line(3, "-export-dependencies:make Exports in Makefile format");
- print_usage_line(3, "-export-dependencies:json Exports in JSON format");
- print_usage_line(0, "");
-
- print_usage_line(1, "-export-dependencies-file:");
- print_usage_line(2, "Specifies the filename for `-export-dependencies`.");
- print_usage_line(2, "Example: -export-dependencies-file:dependencies.d");
- print_usage_line(0, "");
-
- print_usage_line(1, "-thread-count:");
- print_usage_line(2, "Overrides the number of threads the compiler will use to compile with.");
- print_usage_line(2, "Example: -thread-count:2");
- print_usage_line(0, "");
- }
-
- if (check_only) {
- print_usage_line(1, "-show-unused");
- print_usage_line(2, "Shows unused package declarations within the current project.");
- print_usage_line(0, "");
- print_usage_line(1, "-show-unused-with-location");
- print_usage_line(2, "Shows unused package declarations within the current project with the declarations source location.");
- print_usage_line(0, "");
- }
-
- if (run_or_build) {
- print_usage_line(1, "-keep-temp-files");
- print_usage_line(2, "Keeps the temporary files generated during compilation.");
- print_usage_line(0, "");
- } else if (strip_semicolon) {
- print_usage_line(1, "-keep-temp-files");
- print_usage_line(2, "Keeps the temporary files generated during stripping the unneeded semicolons from files.");
- print_usage_line(0, "");
- }
-
- if (check) {
- print_usage_line(1, "-collection:=");
- print_usage_line(2, "Defines a library collection used for imports.");
- print_usage_line(2, "Example: -collection:shared=dir/to/shared");
- print_usage_line(2, "Usage in Code:");
- print_usage_line(3, "import \"shared:foo\"");
- print_usage_line(0, "");
-
- print_usage_line(1, "-define:=");
- print_usage_line(2, "Defines a scalar boolean, integer or string as global constant.");
- print_usage_line(2, "Example: -define:SPAM=123");
- print_usage_line(2, "Usage in code:");
- print_usage_line(3, "#config(SPAM, default_value)");
- print_usage_line(0, "");
-
- print_usage_line(1, "-show-defineables");
- print_usage_line(2, "Shows an overview of all the #config/#defined usages in the project.");
- print_usage_line(0, "");
-
- print_usage_line(1, "-export-defineables:");
- print_usage_line(2, "Exports an overview of all the #config/#defined usages in CSV format to the given file path.");
- print_usage_line(2, "Example: -export-defineables:defineables.csv");
+ if (test_only) {
+ print_usage_line(1, "-all-packages");
+ print_usage_line(2, "Tests all packages imported into the given initial package.");
print_usage_line(0, "");
}
@@ -2334,8 +2212,20 @@ gb_internal void print_show_help(String const arg0, String const &command) {
}
if (check) {
- print_usage_line(1, "-target:");
- print_usage_line(2, "Sets the target for the executable to be built in.");
+ print_usage_line(1, "-collection:=");
+ print_usage_line(2, "Defines a library collection used for imports.");
+ print_usage_line(2, "Example: -collection:shared=dir/to/shared");
+ print_usage_line(2, "Usage in Code:");
+ print_usage_line(3, "import \"shared:foo\"");
+ print_usage_line(0, "");
+
+ print_usage_line(1, "-custom-attribute:");
+ print_usage_line(2, "Add a custom attribute which will be ignored if it is unknown.");
+ print_usage_line(2, "This can be used with metaprogramming tools.");
+ print_usage_line(2, "Examples:");
+ print_usage_line(3, "-custom-attribute:my_tag");
+ print_usage_line(3, "-custom-attribute:my_tag,the_other_thing");
+ print_usage_line(3, "-custom-attribute:my_tag -custom-attribute:the_other_thing");
print_usage_line(0, "");
}
@@ -2343,23 +2233,196 @@ gb_internal void print_show_help(String const arg0, String const &command) {
print_usage_line(1, "-debug");
print_usage_line(2, "Enables debug information, and defines the global constant ODIN_DEBUG to be 'true'.");
print_usage_line(0, "");
+ }
+ if (check) {
+ print_usage_line(1, "-default-to-nil-allocator");
+ print_usage_line(2, "Sets the default allocator to be the nil_allocator, an allocator which does nothing.");
+ print_usage_line(0, "");
+
+ print_usage_line(1, "-define:=");
+ print_usage_line(2, "Defines a scalar boolean, integer or string as global constant.");
+ print_usage_line(2, "Example: -define:SPAM=123");
+ print_usage_line(2, "Usage in code:");
+ print_usage_line(3, "#config(SPAM, default_value)");
+ print_usage_line(0, "");
+ }
+
+ if (run_or_build) {
print_usage_line(1, "-disable-assert");
print_usage_line(2, "Disables the code generation of the built-in run-time 'assert' procedure, and defines the global constant ODIN_DISABLE_ASSERT to be 'true'.");
print_usage_line(0, "");
+ print_usage_line(1, "-disable-red-zone");
+ print_usage_line(2, "Disables red zone on a supported freestanding target.");
+ print_usage_line(0, "");
+ }
+
+ if (check) {
+ print_usage_line(1, "-disallow-do");
+ print_usage_line(2, "Disallows the 'do' keyword in the project.");
+ print_usage_line(0, "");
+ }
+
+ if (doc) {
+ print_usage_line(1, "-doc-format");
+ print_usage_line(2, "Generates documentation as the .odin-doc format (useful for external tooling).");
+ print_usage_line(0, "");
+ }
+
+ if (run_or_build) {
+ print_usage_line(1, "-dynamic-map-calls");
+ print_usage_line(2, "Uses dynamic map calls to minimize code generation at the cost of runtime execution.");
+ print_usage_line(0, "");
+ }
+
+ if (check) {
+ print_usage_line(1, "-error-pos-style:");
+ print_usage_line(2, "Available options:");
+ print_usage_line(3, "-error-pos-style:unix file/path:45:3:");
+ print_usage_line(3, "-error-pos-style:odin file/path(45:3)");
+ print_usage_line(3, "-error-pos-style:default (Defaults to 'odin'.)");
+ print_usage_line(0, "");
+
+ print_usage_line(1, "-export-defineables:");
+ print_usage_line(2, "Exports an overview of all the #config/#defined usages in CSV format to the given file path.");
+ print_usage_line(2, "Example: -export-defineables:defineables.csv");
+ print_usage_line(0, "");
+
+ print_usage_line(1, "-export-dependencies:");
+ print_usage_line(2, "Exports dependencies to one of a few formats. Requires `-export-dependencies-file`.");
+ print_usage_line(2, "Available options:");
+ print_usage_line(3, "-export-dependencies:make Exports in Makefile format");
+ print_usage_line(3, "-export-dependencies:json Exports in JSON format");
+ print_usage_line(0, "");
+
+ print_usage_line(1, "-export-dependencies-file:");
+ print_usage_line(2, "Specifies the filename for `-export-dependencies`.");
+ print_usage_line(2, "Example: -export-dependencies-file:dependencies.d");
+ print_usage_line(0, "");
+
+ print_usage_line(1, "-export-timings:");
+ print_usage_line(2, "Exports timings to one of a few formats. Requires `-show-timings` or `-show-more-timings`.");
+ print_usage_line(2, "Available options:");
+ print_usage_line(3, "-export-timings:json Exports compile time stats to JSON.");
+ print_usage_line(3, "-export-timings:csv Exports compile time stats to CSV.");
+ print_usage_line(0, "");
+
+ print_usage_line(1, "-export-timings-file:");
+ print_usage_line(2, "Specifies the filename for `-export-timings`.");
+ print_usage_line(2, "Example: -export-timings-file:timings.json");
+ print_usage_line(0, "");
+ }
+
+ if (run_or_build) {
+ print_usage_line(1, "-extra-assembler-flags:");
+ print_usage_line(2, "Adds extra assembler specific flags in a string.");
+ print_usage_line(0, "");
+
+ print_usage_line(1, "-extra-linker-flags:");
+ print_usage_line(2, "Adds extra linker specific flags in a string.");
+ print_usage_line(0, "");
+ }
+
+ if (check) {
+ print_usage_line(1, "-file");
+ print_usage_line(2, "Tells `%.*s %.*s` to treat the given file as a self-contained package.", LIT(arg0), LIT(command));
+ print_usage_line(2, "This means that `/a.odin` won't have access to `/b.odin`'s contents.");
+ print_usage_line(0, "");
+
+ print_usage_line(1, "-foreign-error-procedures");
+ print_usage_line(2, "States that the error procedures used in the runtime are defined in a separate translation unit.");
+ print_usage_line(0, "");
+
+ print_usage_line(1, "-ignore-unknown-attributes");
+ print_usage_line(2, "Ignores unknown attributes.");
+ print_usage_line(2, "This can be used with metaprogramming tools.");
+ print_usage_line(0, "");
+ }
+
+ if (run_or_build) {
+ #if defined(GB_SYSTEM_WINDOWS)
+ print_usage_line(1, "-ignore-vs-search");
+ print_usage_line(2, "[Windows only]");
+ print_usage_line(2, "Ignores the Visual Studio search for library paths.");
+ print_usage_line(0, "");
+ #endif
+ }
+
+ if (check) {
+ print_usage_line(1, "-ignore-warnings");
+ print_usage_line(2, "Ignores warning messages.");
+ print_usage_line(0, "");
+
+ print_usage_line(1, "-json-errors");
+ print_usage_line(2, "Prints the error messages as json to stderr.");
+ print_usage_line(0, "");
+ }
+
+ if (run_or_build) {
+ print_usage_line(1, "-keep-temp-files");
+ print_usage_line(2, "Keeps the temporary files generated during compilation.");
+ print_usage_line(0, "");
+ } else if (strip_semicolon) {
+ print_usage_line(1, "-keep-temp-files");
+ print_usage_line(2, "Keeps the temporary files generated during stripping the unneeded semicolons from files.");
+ print_usage_line(0, "");
+ }
+
+ if (run_or_build) {
+ print_usage_line(1, "-lld");
+ print_usage_line(2, "Uses the LLD linker rather than the default.");
+ print_usage_line(0, "");
+ }
+
+ if (check) {
+ print_usage_line(1, "-max-error-count:");
+ print_usage_line(2, "Sets the maximum number of errors that can be displayed before the compiler terminates.");
+ print_usage_line(2, "Must be an integer >0.");
+ print_usage_line(2, "If not set, the default max error count is %d.", DEFAULT_MAX_ERROR_COLLECTOR_COUNT);
+ print_usage_line(0, "");
+ }
+
+ if (run_or_build) {
+ print_usage_line(1, "-microarch:");
+ print_usage_line(2, "Specifies the specific micro-architecture for the build in a string.");
+ print_usage_line(2, "Examples:");
+ print_usage_line(3, "-microarch:sandybridge");
+ print_usage_line(3, "-microarch:native");
+ print_usage_line(3, "-microarch:\"?\" for a list");
+ print_usage_line(0, "");
+ }
+
+ if (check) {
+ print_usage_line(1, "-min-link-libs");
+ print_usage_line(2, "If set, the number of linked libraries will be minimized to prevent duplications.");
+ print_usage_line(2, "This is useful for so called \"dumb\" linkers compared to \"smart\" linkers.");
+ print_usage_line(0, "");
+ }
+
+ if (run_or_build) {
+ print_usage_line(1, "-minimum-os-version:");
+ print_usage_line(2, "Sets the minimum OS version targeted by the application.");
+ print_usage_line(2, "Default: -minimum-os-version:11.0.0");
+ print_usage_line(2, "Only used when target is Darwin, if given, linking mismatched versions will emit a warning.");
+ print_usage_line(0, "");
+
print_usage_line(1, "-no-bounds-check");
print_usage_line(2, "Disables bounds checking program wide.");
print_usage_line(0, "");
- print_usage_line(1, "-no-type-assert");
- print_usage_line(2, "Disables type assertion checking program wide.");
- print_usage_line(0, "");
-
print_usage_line(1, "-no-crt");
print_usage_line(2, "Disables automatic linking with the C Run Time.");
print_usage_line(0, "");
+ }
+ if (check && command != "test") {
+ print_usage_line(1, "-no-entry-point");
+ print_usage_line(2, "Removes default requirement of an entry point (e.g. main procedure).");
+ print_usage_line(0, "");
+ }
+
+ if (run_or_build) {
print_usage_line(1, "-no-rpath");
print_usage_line(2, "Disables automatic addition of an rpath linked to the executable directory.");
print_usage_line(0, "");
@@ -2368,10 +2431,180 @@ gb_internal void print_show_help(String const arg0, String const &command) {
print_usage_line(2, "Ignores @thread_local attribute, effectively treating the program as if it is single-threaded.");
print_usage_line(0, "");
- print_usage_line(1, "-lld");
- print_usage_line(2, "Uses the LLD linker rather than the default.");
+ print_usage_line(1, "-no-threaded-checker");
+ print_usage_line(2, "Disables multithreading in the semantic checker stage.");
print_usage_line(0, "");
+ print_usage_line(1, "-no-type-assert");
+ print_usage_line(2, "Disables type assertion checking program wide.");
+ print_usage_line(0, "");
+ }
+
+ if (run_or_build) {
+ print_usage_line(1, "-o:");
+ print_usage_line(2, "Sets the optimization mode for compilation.");
+ print_usage_line(2, "Available options:");
+ print_usage_line(3, "-o:none");
+ print_usage_line(3, "-o:minimal");
+ print_usage_line(3, "-o:size");
+ print_usage_line(3, "-o:speed");
+ if (LB_USE_NEW_PASS_SYSTEM) {
+ print_usage_line(3, "-o:aggressive (use this with caution)");
+ }
+ print_usage_line(2, "The default is -o:minimal.");
+ print_usage_line(0, "");
+
+
+ print_usage_line(1, "-obfuscate-source-code-locations");
+ print_usage_line(2, "Obfuscate the file and procedure strings, and line and column numbers, stored with a 'runtime.Source_Code_Location' value.");
+ print_usage_line(0, "");
+
+
+ print_usage_line(1, "-out:");
+ print_usage_line(2, "Sets the file name of the outputted executable.");
+ print_usage_line(2, "Example: -out:foo.exe");
+ print_usage_line(0, "");
+ }
+
+ if (doc) {
+ print_usage_line(1, "-out:");
+ print_usage_line(2, "Sets the base name of the resultig .odin-doc file.");
+ print_usage_line(2, "The extension can be optionally included; the resulting file will always have an extension of '.odin-doc'.");
+ print_usage_line(2, "Example: -out:foo");
+ print_usage_line(0, "");
+ }
+
+ if (run_or_build) {
+ #if defined(GB_SYSTEM_WINDOWS)
+ print_usage_line(1, "-pdb-name:");
+ print_usage_line(2, "[Windows only]");
+ print_usage_line(2, "Defines the generated PDB name when -debug is enabled.");
+ print_usage_line(2, "Example: -pdb-name:different.pdb");
+ print_usage_line(0, "");
+ #endif
+ }
+
+ if (build) {
+ print_usage_line(1, "-print-linker-flags");
+ print_usage_line(2, "Prints the all of the flags/arguments that will be passed to the linker.");
+ print_usage_line(0, "");
+ }
+
+ if (run_or_build) {
+ print_usage_line(1, "-reloc-mode:");
+ print_usage_line(2, "Specifies the reloc mode.");
+ print_usage_line(2, "Available options:");
+ print_usage_line(3, "-reloc-mode:default");
+ print_usage_line(3, "-reloc-mode:static");
+ print_usage_line(3, "-reloc-mode:pic");
+ print_usage_line(3, "-reloc-mode:dynamic-no-pic");
+ print_usage_line(0, "");
+
+ #if defined(GB_SYSTEM_WINDOWS)
+ print_usage_line(1, "-resource:");
+ print_usage_line(2, "[Windows only]");
+ print_usage_line(2, "Defines the resource file for the executable.");
+ print_usage_line(2, "Example: -resource:path/to/file.rc");
+ print_usage_line(2, "or: -resource:path/to/file.res for a precompiled one.");
+ print_usage_line(0, "");
+ #endif
+
+ print_usage_line(1, "-sanitize:");
+ print_usage_line(2, "Enables sanitization analysis.");
+ print_usage_line(2, "Available options:");
+ print_usage_line(3, "-sanitize:address");
+ print_usage_line(3, "-sanitize:memory");
+ print_usage_line(3, "-sanitize:thread");
+ print_usage_line(2, "NOTE: This flag can be used multiple times.");
+ print_usage_line(0, "");
+ }
+
+ if (doc) {
+ print_usage_line(1, "-short");
+ print_usage_line(2, "Shows shortened documentation for the packages.");
+ print_usage_line(0, "");
+ }
+
+ if (check) {
+ print_usage_line(1, "-show-defineables");
+ print_usage_line(2, "Shows an overview of all the #config/#defined usages in the project.");
+ print_usage_line(0, "");
+
+ print_usage_line(1, "-show-system-calls");
+ print_usage_line(2, "Prints the whole command and arguments for calls to external tools like linker and assembler.");
+ print_usage_line(0, "");
+
+ print_usage_line(1, "-show-timings");
+ print_usage_line(2, "Shows basic overview of the timings of different stages within the compiler in milliseconds.");
+ print_usage_line(0, "");
+
+ print_usage_line(1, "-show-more-timings");
+ print_usage_line(2, "Shows an advanced overview of the timings of different stages within the compiler in milliseconds.");
+ print_usage_line(0, "");
+ }
+
+ if (check_only) {
+ print_usage_line(1, "-show-unused");
+ print_usage_line(2, "Shows unused package declarations within the current project.");
+ print_usage_line(0, "");
+ print_usage_line(1, "-show-unused-with-location");
+ print_usage_line(2, "Shows unused package declarations within the current project with the declarations source location.");
+ print_usage_line(0, "");
+ }
+
+ if (check) {
+ print_usage_line(1, "-strict-style");
+ print_usage_line(2, "This enforces parts of same style as the Odin compiler, prefer '-vet-style -vet-semicolon' if you do not want to match it exactly.");
+ print_usage_line(2, "");
+ print_usage_line(2, "Errs on unneeded tokens, such as unneeded semicolons.");
+ print_usage_line(2, "Errs on missing trailing commas followed by a newline.");
+ print_usage_line(2, "Errs on deprecated syntax.");
+ print_usage_line(2, "Errs when the attached-brace style in not adhered to (also known as 1TBS).");
+ print_usage_line(2, "Errs when 'case' labels are not in the same column as the associated 'switch' token.");
+ print_usage_line(0, "");
+ }
+
+ if (run_or_build) {
+ print_usage_line(1, "-strict-target-features");
+ print_usage_line(2, "Makes @(enable_target_features=\"...\") behave the same way as @(require_target_features=\"...\").");
+ print_usage_line(2, "This enforces that all generated code uses features supported by the combination of -target, -microarch, and -target-features.");
+ print_usage_line(0, "");
+
+ #if defined(GB_SYSTEM_WINDOWS)
+ print_usage_line(1, "-subsystem: