GDC(1)
π GDC β bestie edition π
okay so this is the gdc manual page, from the GNU manual, section 1. yes it's long. no we're not skipping anything. grab a snack. π
β¨ NAME β¨
gdc β a GCC-based compiler for the D language. that's it, that's the whole vibe. π
β¨ SYNOPSIS β¨
gdc [-c|-S] [-g] [-pg]
[-Olevel] [-Wwarn...]
[-Idir...] [-Ldir...]
[-foption...] [-mmachine-option...]
[-o outfile] [@file] infile...
Only the most useful options are listed up there, bestie β see below for the rest of them. there are SO many more. we'll get to them. π«Ά
β¨ DESCRIPTION β¨
The gdc command is the GNU compiler for the D language, and it supports many of the same options as gcc. This manual only documents the options specific to gdc. lowkey important: it's only the gdc-specific ones here, so if you're looking for the gcc-flavoured stuff, that's a different page, iykyk. π
β¨ OPTIONS β¨
π Input and Output files
So for any given input file, the file name suffix decides what kind of compilation happens. it's giving "your file extension is your destiny." the following kinds of input file names are supported:
file.dβ D source files. the classic. the main character. πfile.ddβ Ddoc source files.file.diβ D interface files.
You can put more than one input file on the gdc command line, and each one gets compiled separately in the compilation process. and if you pass a -o file option, then all the input files get compiled together, producing a single output file, named file. this is allowed even when you're using -S or -c, no cap. π
A D interface file contains only what an import of the module needs, rather than the whole entire implementation of that module. They can be created by gdc from a D source file by using the -H option. When the compiler resolves an import declaration, it searches for matching .di files first, then for .d. order matters, bestie. π¦
A Ddoc source file contains code in the D macro processor language. It's primarily designed for use in producing user documentation from embedded comments, with a slight affinity towards HTML generation. and here's the plot twist: if a .d source file starts with the string "Ddoc", then it's treated as general purpose documentation, not as a D source file. sneaky. π
πΈ Runtime Options
These options affect the runtime behavior of programs compiled with gdc. so like, how your program behaves when it actually runs. yes we're going there.
-fall-instantiationsβ Generate code for all template instantiations. The default template emission strategy is to not generate code for declarations that were either instantiated speculatively (like from__traits(compiles, ...)) or that come from an imported module not being compiled.-fno-assertβ Turn off code generation forassertcontracts. bye bye asserts. π-fno-bounds-checkβ Turns off array bounds checking for all functions, which can improve performance for code that uses arrays extensively. Note that this can result in unpredictable behavior if the code in question actually does violate array bounds constraints. It is safe to use this option if you are sure that your code never throws aRangeError.
β οΈ okay so real talk: turning this off when your code does go out of bounds = unpredictable behavior. only do it if you're certain your code never throws a RangeError. don't be brave for no reason. π
-fbounds-check=valueβ An alternative to-fbounds-checkthat allows more control as to where bounds checking is turned on or off. The following values are supported:onβ Turns on array bounds checking for all functions.safeonlyβ Turns on array bounds checking only for@safefunctions.offβ Turns off array bounds checking completely.
-fno-builtinβ Don't recognize built-in functions unless they begin with the prefix__builtin_. By default, the compiler will recognize when a function in thecore.stdcpackage is a built-in function.-fcheckaction=valueβ This option controls what code is generated on an assertion, bounds check, or final switch failure. The following values are supported:contextβ Throw anAssertErrorwith extra context information.haltβ Halt the program execution.throwβ Throw anAssertError(the default).
-fdebug-fdebug=valueβ Turn on compilation of conditionaldebugcode into the program. The-fdebugoption itself sets the debug level to 1, while-fdebug=enablesdebugcode that are identified by any of the following values:identβ Turns on compilation of anydebugcode identified by ident.
-fno-druntimeβ Implements<https://dlang.org/spec/betterc.html>. Assumes that compilation targets an environment without a D runtime library.
This is equivalent to compiling with the following options:
gdc -nophoboslib -fno-exceptions -fno-moduleinfo -fno-rtti
-fextern-std=standardβ Sets the C++ name mangling compatibility to the version identified by standard. The following values are supported:c++98c++03β Sets__traits(getTargetInfo, "cppStd")to199711.c++11β Sets__traits(getTargetInfo, "cppStd")to201103.c++14β Sets__traits(getTargetInfo, "cppStd")to201402.c++17β Sets__traits(getTargetInfo, "cppStd")to201703. This is the default.c++20β Sets__traits(getTargetInfo, "cppStd")to202002.
-fno-invariantsβ Turns off code generation for classinvariantcontracts.-fmainβ Generates a defaultmain()function when compiling. This is useful when unittesting a library, because it enables running the unittests in a library without having to manually define an entry-point function. This option does nothing whenmainis already defined in user code.-fno-moduleinfoβ Turns off generation of theModuleInfoand related functions that would become unreferenced without it, which may allow linking to programs not written in D. Functions that are not be generated include module constructors and destructors (static thisandstatic ~this),unittestcode, andDSOregistry functions for dynamically linked code.-fonly=filenameβ Tells the compiler to parse and run semantic analysis on all modules on the command line, but only generate code for the module specified by filename.-fno-postconditionsβ Turns off code generation for postconditionoutcontracts.-fno-preconditionsβ Turns off code generation for preconditionincontracts.-fpreview=idβ Turns on an upcoming D language change identified by id. The following values are supported:allβ Turns on all upcoming D language features.bitfieldsβ Implements bit-fields in D.dip1000β Implements<https://github.com/dlang/DIPs/blob/master/DIPs/other/DIP1000.md>(Scoped pointers).dip1008β Implements<https://github.com/dlang/DIPs/blob/master/DIPs/other/DIP1008.md>(Allow exceptions in @nogc code).dip1021β Implements<https://github.com/dlang/DIPs/blob/master/DIPs/accepted/DIP1021.md>(Mutable function arguments).dip25β Implements<https://github.com/dlang/DIPs/blob/master/DIPs/archive/DIP25.md>(Sealed references).dtorfieldsβ Turns on generation for destructing fields of partially constructed objects.fieldwiseβ Turns on generation of struct equality to use field-wise comparisons.fixaliasthisβ Implements new lookup rules that check the current scope foralias thisbefore searching in upper scopes.fiximmutableconvβ Disallows unsound immutable conversions that were formerly incorrectly permitted.inβ Implementsinparameters to meanscope const [ref]and accepts rvalues.inclusiveincontractsβ Implementsincontracts of overridden methods to be a superset of parent contract.nosharedaccessβ Turns off and disallows all access to shared memory objects.rvaluerefparamβ Implements rvalue arguments torefparameters.systemvariablesβ Disables access to variables marked @system from @safe code.
-freleaseβ Turns on compiling in release mode, which means not emitting runtime checks for contracts and asserts. Array bounds checking is not done for @system and @trusted functions, and assertion failures are undefined behavior.
This is equivalent to compiling with the following options:
gdc -fno-assert -fbounds-check=safe -fno-invariants \
-fno-postconditions -fno-preconditions -fno-switch-errors
-frevert=β Turns off a D language feature identified by id. The following values are supported:allβ Turns off all revertable D language features.dip1000β Reverts<https://github.com/dlang/DIPs/blob/master/DIPs/other/DIP1000.md>(Scoped pointers).dip25β Reverts<https://github.com/dlang/DIPs/blob/master/DIPs/archive/DIP25.md>(Sealed references).dtorfieldsβ Turns off generation for destructing fields of partially constructed objects.intpromoteβ Turns off C-style integral promotion for unary+,-and~expressions.
-fno-rttiβ Turns off generation of run-time type information for all user defined types. Any code that uses features of the language that require access to this information will result in an error. π-fno-switch-errorsβ This option controls what code is generated when no case is matched in afinal switchstatement. The default run time behavior is to throw aSwitchError. Turning off-fswitch-errorsmeans that instead the execution of the program is immediately halted. π-funittestβ Turns on compilation ofunittestcode, and turns on theversion(unittest)identifier. This implies-fassert. slay, test your code bestie. β¨-fversion=valueβ Turns on compilation of conditionalversioncode into the program identified by any of the following values:identβ Turns on compilation ofversioncode identified by ident.
-fno-weak-templatesβ Turns off emission of declarations that can be defined in multiple objects as weak symbols. The default is to emit all public symbols as weak, unless the target lacks support for weak symbols. Disabling this option means that common symbols are instead put in COMDAT or become private.
π¦ Options for Directory Search
These options specify directories to search for files, libraries, and other parts of the compiler. basically: "where do I look for my stuff." π
-Idirβ Specify a directory to use when searching for imported modules at compile time. Multiple-Ioptions can be used, and the paths are searched in the same order.-Jdirβ Specify a directory to use when searching for files in string imports at compile time. This switch is required in order to useimport(file)expressions. Multiple-Joptions can be used, and the paths are searched in the same order.
π«Ά bestie there's MORE. this page keeps going. stay with me, part 2 is coming. π
-Ldirβ when you're linking, this says "hey, also look in dir for libraries," same energy asgccπ-Bdirβ tells the compiler where to find its own executables, libraries, source files and data files, just likegccdoes π«Ά-fmodule-file=module=specβ okay bestie, this one massages the file paths of imported modules. If an imported module matches all of module, or just the leftmost part of it, then the file path in spec becomes the spot to search for D sources. You use this when your source file paths and names don't line up with the package and module hierarchy. Lowkey the examples make it click:
gdc test.d -fmodule-file=A.B=foo.d -fmodule-file=C=bar
That tells the compiler: search all import paths for the source file foo.d when importing A.B, and the directory bar/ when importing C, exactly like this D code annotates:
module test;
import A.B; // Matches A.B, searches for foo.d
import C.D.E; // Matches C, searches for bar/D/E.d
import A.B.C; // No match, searches for A/B/C.d
-imultilib dirβ use dir as a subdirectory of the gcc directory that holds target-specific D sources and interfaces β¨-iprefix prefixβ set prefix as the prefix for the gcc directory containing target-specific D sources and interfaces. If that prefix is a directory, you gotta include the final/fr π-nostdincβ do not go searching the standard system directories for D source and interface files. Only the directories you named with-Ioptions get searched (plus the directory of the current file, if that's appropriate) πΈ
π Code Generation π
Besides the many gcc options that control code generation, gdc has several options that are just its own thing π
-Hβ generates D interface files for every module being compiled. The compiler figures out the output file from the name of the input file: it strips any directory components and the suffix, then slaps on a.disuffix π-Hd dirβ same as-H, but it writes those interface files to directory dir. You can pair this with-Hf fileto set the output file and the directory path independently π-Hf fileβ same as-Hbut it writes interface files to file. Pair it with-Hd dirto set the output file and the directory path independently π-Mβ outputs the module dependencies of all source files being compiled, in a format thatmakecan eat. The compiler spits out one make rule containing the object file name for that source file, a colon, and the names of all the imported files π-MMβ like-Mbut it does not mention imported modules from the D standard library package directories π-MF fileβ when you use it with-Mor-MM, it names a file to write the dependencies to. When you use it with the driver options-MDor-MMD,-MFoverrides the default dependency output file π¦-MGβ this option exists for compatibility withgcc, and the compiler just... ignores it π-MPβ outputs a phony target for each dependency other than the modules being compiled, which makes each one depend on nothing β¨-MT targetβ change the target of the rule emitted by dependency generation to be exactly the string you specify. Want multiple targets? Pass them as a single argument to-MT, or just use multiple-MToptions, your call π«Ά-MQ targetβ same as-MT, except it quotes any characters that are special tomakeπ-MDβ this is equivalent to-M -MF file. The driver determines file by removing any directory components and suffix from the input file, then adding a.depssuffix πΈ-MMDβ like-MDbut it does not mention imported modules from the D standard library package directories π-Xβ outputs info describing the contents of all source files being compiled, in JSON format, to a file. The driver determines file by removing any directory components and suffix from the input file, then adding a.jsonsuffix π-Xf fileβ same as-X, but it writes all that JSON content to the file you specify β¨-fdocβ generates "Ddoc" documentation and writes it to a file. The compiler determines file by removing any directory components and suffix from the input file, then adding a.htmlsuffix π-fdoc-dir=dirβ same as-fdoc, but it writes documentation to directory dir. Pair it with-fdoc-file=fileto set the output file and the directory path independently π-fdoc-file=fileβ same as-fdoc, but it writes documentation to file. Pair it with-fdoc-dir=dirto set the output file and the directory path independently π-fdoc-inc=fileβ specify file as a Ddoc macro file to be read. You can stack multiple-fdoc-incoptions, and the files get read and processed in the same order π-fdump-c++-spec=fileβ for D source files, generate the corresponding C++ declarations into file π¦-fdump-c++-spec-verboseβ used together with-fdump-c++-spec=above, it adds comments for ignored declarations in the generated C++ header π-fsave-mixins=fileβ generates code expanded from D "mixin" statements and writes the processed sources to file. Super useful for debugging compilation errors, and it gives debuggers source to show when they ask for it π«Ά
π Warnings π
Warnings are diagnostic messages that report constructions that aren't inherently erroneous but that are risky, or that suggest there's probably a bug lurking in the program. Unless you pass -Werror, they do not stop the program from compiling, bestie π
-Wallβ turns on all warning messages. Warnings are not a defined part of the D language, and every construct that might generate a warning here is still valid code β¨-Wallocaβ this one warns on all uses of "alloca" in the source π-Walloca-larger-than=nβ warns on unbounded uses ofalloca, and on bounded uses ofallocawhose bound can be larger than n bytes.-Wno-alloca-larger-thandisables the-Walloca-larger-thanwarning and is equivalent to-Walloca-larger-than=SIZE_MAXor larger π-Wno-builtin-declaration-mismatchβ warns if a built-in function is declared with an incompatible signature πΈ-Wcast-resultβ warns about casts that will produce a null or zero result. Right now this only happens for casting between an imaginary and non-imaginary data type, or casting between a D and C++ class π-Wno-deprecatedβ don't warn about usage of deprecated features and symbols that carry "deprecated" attributes π-Werrorβ turns all warnings into errors. no cap π₯-Wextraβ this enables some extra warning flags that-Walldoesn't turn on:-Waddress-Wcast-result-Wmismatched-special-enum-Wunknown-pragmas
-Wmismatched-special-enumβ warns when an enum that the compiler recognizes as special is declared with a different size than the built-in type it's representing π-Wspeculativeβ lists all error messages from speculative compiles, like__traits(compiles, ...). Heads up: this option does not report messages as warnings, so these messages never become errors even when you also use-Werrorπ¦-Wunknown-pragmasβ warns when apragma()shows up thatgdcdoesn't understand. This differs from-fignore-unknown-pragmas, where a pragma that is part of the D language but just isn't implemented by the compiler won't get reported π-Wno-varargsβ don't warn on questionable usage of the macros used to handle variable arguments, likeva_startπΈ-fignore-unknown-pragmasβ turns off errors for unsupported pragmas β¨-fmax-errors=nβ caps the maximum number of error messages at n, at which pointgdcbails out instead of trying to keep processing the source code. If n is 0 (which is the default), there's no limit on how many error messages get produced π-fsyntax-onlyβ checks the code for syntax errors but doesn't actually compile it. You can use it with-fdocor-Hto generate files for each module present on the command-line, but no other output file π-ftransition=idβ reports extra info about D language changes identified by id. These are the supported values:allβ list information on all D language transitions.complexβ list all usages of complex or imaginary types.fieldβ list all non-mutable fields which occupy an object instance.inβ list all usages of "in" on parameter.nogcβ list all hidden GC allocations.templatesβ list statistics on template instantiations.tlsβ list all variables going into thread local storage.
π Options for Linking π
These options show up when the compiler links object files into an executable output file. They're meaningless if the compiler isn't doing a link step, periodt π
-defaultlib=libnameβ specify the library to use instead oflibphoboswhen linking. Options that specify the linkage of libphobos, like-static-libphobosor-shared-libphobos, get ignored π-debuglib=libnameβ specify the debug library to use instead oflibphoboswhen linking. This has no effect unless you also gave the-goption on the command line. Options specifying the linkage of libphobos, like-static-libphobosor-shared-libphobos, get ignored πΈ-nophoboslibβ do not use the Phobos or D runtime library when linking. Options specifying the linkage of libphobos, like-static-libphobosor-shared-libphobos, get ignored. The standard system libraries are used normally, unless-nostdlibor-nodefaultlibsis used π-shared-libphobosβ on systems that providelibgphobosandlibgdruntimeas both a shared and a static library, this option forces the use of the shared version. If no shared version was built when the compiler was configured, this option has no effect π¦-static-libphobosβ on systems that providelibgphobosandlibgdruntimeas both a shared and a static library, this option forces the use of the static version. If no static version was built when the compiler was configured, this option has no effect β¨
π§ Developer Options π§
This section describes command-line options that are mainly of interest to developers or language tooling, iykyk π
-fdump-d-originalβ outputs the internal front-end AST after the "semantic3" stage. This option is only useful for debugging the GNU D compiler itself π₯-vβ okay bestie, this one is the gossip mode for the compiler π it dumps all the info about the compiler language processing stages while your source program is being compiled. So what's in the dump? literally everything: a list of all the modules getting processed through the"parse","semantic","semantic2", and"semantic3"stages, plus all the"import"modules and their file paths, plus all the"function"bodies that are being compiled. it's giving backstage pass energy fr fr π₯
π SEE ALSO (go read these too bestie) π
and also the Info entries for gdc and gcc. that's the whole squad π«Ά go say hi π
π COPYRIGHT (the legal slay) π
Copyright (c) 2006-2023 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the man page gfdl(7). πβ¨
no cap, that's the real license text up there β don't skip it, it's doing important main character work π
and that's a wrap on the whole page, bestie πΈ this edition is gcc-13, dated 2024-09-04, and it lives in section GDC(1). periodt π
ππ¦
π¦ where this page comes from
- ubuntu noble: gdc-13-mips64-linux-gnuabi64 13.3.0-6ubuntu2~24.04cross1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms