DMD Source code

This is the source code to the DMD compiler for the D Programming Language defined in the documents at https://dlang.org/

These sources are free, they are redistributable and modifiable under the terms of the Boost Software License, Version 1.0. The terms of this license are in the file boostlicense.txt, or see https://www.boost.org/LICENSE_1_0.txt.

If a particular file has a different license in it, that overrides this license for that file.

-Walter Bright

Directory structure

Folder Purpose
dmd/ The dmd driver and front-end
dmd/backend/ Code generation for x86 or x86-64. Shared by the Digital Mars C compiler, but not LDC or GDC.
dmd/common/ Code shared by the front-end and back-end
dmd/root/ Meant as a portable utility library, but "it wasn't very good and the only project left using it is dmd".

DMD has a mostly flat directory structure, so this section aims to divide all source files into logical groups for easier navigation. The groups are roughly ordered by how late they appear in the compilation process. Note that these groups have no strict meaning, the category assignments are a bit subjective.

Driver

File Purpose
mars.d The entry point. Contains main.
cli.d Define the command line interface
dmdparams.d DMD-specific parameters
globals.d Define a structure storing command line options
dinifile.d Parse settings from .ini file (sc.ini / dmd.conf)
vsoptions.d Detect the Microsoft Visual Studio toolchain for linking
frontend.d An interface for using DMD as a library
errors.d Error reporting functionality
target.d Manage target-specific parameters for cross-compiling (for LDC/GDC)
compiler.d Describe a back-end compiler and implements compiler-specific actions

Lexing / parsing

File Purpose
lexer.d Convert source code into tokens for the D and ImportC parsers
entity.d Define "\&Entity;" escape sequence for strings / character literals
tokens.d Define lexical tokens.
parse.d D parser, converting tokens into an Abstract Syntax Tree (AST)
cparse.d ImportC parser, converting tokens into an Abstract Syntax Tree (AST)

Semantic analysis

Symbols and declarations

File Purpose
dsymbol.d Base class for a D symbol, e.g. a variable, function, module, enum etc.
identifier.d Represents the name of a Dsymbol
id.d Define strings for pre-defined identifiers (e.g. sizeof, string)
dscope.d Define a 'scope' on which symbol lookup can be performed
dtemplate.d A template declaration or instance
dmodule.d Define a package and module
mtype.d Define expression types such as int, char[], void function()
arraytypes.d For certain Declaration nodes of type T, provides aliases for Array!T
declaration.d Misc. declarations of alias, variables, type tuples, ClassInfo etc.
denum.d Defines enum declarations and enum members
attrib.d Declarations of 'attributes' such as private, pragma(), immutable, @UDA, align, extern(C++) and more
func.d Define a function declaration (includes function literals, invariant, unittest)
dversion.d Defines a version symbol, e.g. version = ident, debug = ident

AST nodes

File Purpose
ast_node.d Define an abstract AST node class
astbase.d Namespace of AST nodes that can be produced by the parser
astcodegen.d Namespace of AST nodes of a AST ready for code generation
astenums.d Enums common to DMD and AST
expression.d Define expression AST nodes
statement.d Define statement AST nodes
staticassert.d Define a static assert AST node
aggregate.d Define an aggregate (struct, union or class) AST node
dclass.d Define a class AST node
dstruct.d Define a struct or union AST node
init.d Define variable initializers

AST visitors

File Purpose
parsetimevisitor.d General visitor for AST nodes
permissivevisitor.d Subclass of ParseTimeVisitor that does not assert(0) on unimplemented nodes
strictvisitor.d Visitor that forces derived classes to implement visit for every possible node
visitor.d A visitor implementing visit for all nodes present in the compiler
transitivevisitor.d Provide a mixin template with visit methods for the parse time AST
apply.d Depth-first expression visitor
sapply.d Depth-first statement visitor
statement_rewrite_walker.d Statement visitor that allows replacing the currently visited node

Semantic passes

File Purpose
dsymbolsem.d Do semantic 1 pass (symbol identifiers/types)
semantic2.d Do semantic 2 pass (symbol initializers)
semantic3.d Do semantic 3 pass (function bodies)
inline.d Do inline pass (optimization pass that dmd does in the front-end)
inlinecost.d Compute the cost of inlining a function call.
expressionsem.d Do semantic analysis for expressions
statementsem.d Do semantic analysis for statements
initsem.d Do semantic analysis for initializers
templateparamsem.d Do semantic analysis for template parameters
typesem.d Do semantic analysis for types

Semantic helpers

File Purpose
opover.d Operator overloading
clone.d Generate automatic opEquals, opAssign and constructors for structs
blockexit.d Find out in what ways control flow can exit a block
ctorflow.d Control flow in constructors
constfold.d Do constant folding of arithmetic expressions
optimize.d Do constant folding more generally
dcast.d Implicit or explicit cast(), finding common types e.g. in x ? a : b, integral promotions
impcnvtab.d Define an implicit conversion table for basic types
importc.d Helpers specific to ImportC
sideeffect.d Extract side-effects of expressions for certain lowerings.
mustuse.d Helpers related to the @mustuse attribute

Compile Time Function Execution (CTFE)

File Purpose
dinterpret.d CTFE entry point
ctfeexpr.d CTFE for expressions involving pointers, slices, array concatenation etc.
builtin.d Allow CTFE of certain external functions (core.math, std.math and core.bitop)

Specific language features

Attribute checks

File Purpose
nogc.d @nogc checks
safe.d @safe checks
canthrow.d nothrow checks
escape.d scope checks
access.d public / private checks
ob.d Ownership / borrowing (@live) checks

Inline Assembly

File Purpose
iasm.d Inline assembly depending on the compiler
iasmdmd.d Inline assembly for DMD
iasmgcc.d Inline assembly for GDC

Other

File Purpose
aliasthis.d Resolve implicit conversions for alias X this
traits.d __traits()
lambdacomp.d __traits(isSame, x => y, z => w)
cond.d Evaluate static if, version debug
staticcond.d Lazily evaluate static conditions for static if, static assert and template constraints
delegatize.d Converts expression to delegates for lazy parameters
eh.d Generate tables for exception handling
nspace.d Namespace for extern (C++, Module)
intrange.d Value range propagation
dimport.d Renamed imports (import aliasSymbol = pkg1.pkg2.symbol)
arrayop.d Array operations (a[] = b[] + c[])
typinf.d Generate typeinfo for typeid() (as well as internals)
File Purpose
chkformat.d Validate arguments with format specifiers for printf / scanf etc.
imphint.d Give a suggestion to e.g. import std.stdio when writeln could not be resolved.

Library files

File Purpose
lib.d Abstract library class
libelf.d Library in ELF format (Unix)
libmach.d Library in Mach-O format (macOS)
libmscoff.d Library in COFF format (32/64-bit Windows)
libomf.d Library in OMF format (legacy 32-bit Windows)
scanelf.d Extract symbol names from a library in ELF format
scanmach.d Extract symbol names from a library in Mach-O format
scanmscoff.d Extract symbol names from a library in COFF format
scanomf.d Extract symbol names from a library in OMF format

Code generation / back-end interfacing

File Purpose
dmsc.d Configures and initializes the back-end
toobj.d Convert an AST that went through all semantic phases into an object file
toir.d Convert Dsymbols intermediate representation
e2ir.d Convert Expressions to intermediate representation
s2ir.d Convert Statements to intermediate representation
stmtstate.d Used to help transform statement AST into flow graph
toctype.d Convert a D type to a type the back-end understands
tocsym.d Convert a D symbol to a symbol the linker understands (with mangled name)
argtypes_x86.d Convert a D type into simple (register) types for the 32-bit x86 ABI
argtypes_sysv_x64.d 'argtypes' for the x86_64 System V ABI
argtypes_aarch64.d 'argtypes' for the AArch64 ABI
glue.d Generate the object file for function declarations
gluelayer.d Declarations for back-end functions that the front-end invokes
todt.d Convert initializers into structures that the back-end will add to the data segment
tocvdebug.d Generate debug info in the CV4 debug format.
objc.d Objective-C interfacing
objc_glue.d Glue code for Objective-C interop.

Name mangling

File Purpose
cppmangle.d C++ name mangling
cppmanglewin.d C++ name mangling for Windows
dmangle.d D name mangling

Linking

File Purpose
link.d Invoke the linker as a separate process

Special output

File Purpose
doc.d Documentation generation
dmacro.d DDoc macro processing
hdrgen.d Convert an AST into D source code for .di header generation, as well as -vcg-ast and error messages
json.d Describe the module in a .json file for the -X flag
dtoh.d C++ header generation from D source files

Utility

Note: many other utilities are in dmd/root.

File Purpose
console.d Print error messages in color
file_manager.d Keep file contents in memory
utils.d Utility functions related to files and file paths
File Purpose
asttypename.d Print the internal name of an AST node (for debugging only)
printast.d Print the AST data structure
foreachvar.d Used in ob.d to iterate over all variables in an expression