LDC
The LDC project aims to provide a portable D programming language compiler with modern optimization and code generation capabilities. The compiler uses the official DMD frontend to support the latest D2 version and relies on the LLVM Core libraries for code generation.
LDC is fully Open Source; the parts of the code not taken/adapted from other projects are BSD-licensed (see the LICENSE file for details).
D1 is no longer supported in the current development tree; the last version supporting it can be found at the d1 Git branch.
Contents
Getting started
- Download an official release or the latest CI build, incl. prebuilt binaries for Linux/OSX/Windows.
- Building LDC from source
- Building and hacking LDC on Windows using MSVC
- Using LDC (LDC-specific language changes — LDC inline assembly expressions — LDC inline IR)
- Cross-compiling with LDC
- Generating WebAssembly with LDC
- Reporting LDC issues — LDC contributor's guide
Project status
NOTE: As Wiki pages usually don't keep up with development, the changelog might be of use to check for recent developments and newly conquered targets.
Architectures
x86 / x86_64 | Fine, CI-tested. |
---|---|
64-bit ARM | Usable, a few testsuite failures remain (at least for non-Apple OS). See tracker issue and latest Linux CI logs for current status. |
32-bit ARM | Should be okay-ish, not really CI-tested though (Android ARMv7-A somewhat is). E.g., see tracker issue and Minimal semihosted ARM Cortex-M "Hello_World". |
WebAssembly | Should work fine; currently limited to -betterC (lacking druntime/Phobos support). |
PowerPC | Incomplete; has been worked on (32-bit, 64-bit big & little endian) but not touched/tested in years. E.g., see tracker issue. |
MIPS | Incomplete; has been worked on but not really touched/tested in years. E.g., see tracker issue. |
Others | Basic code generation should work as long as there's an LLVM backend, and simple -betterC code might just work. druntime/Phobos support is most likely lacking (and probably requires a new version predefined by the compiler). Proper C(++) interop most likely requires a new TargetABI implementation in the compiler. |
Operating Systems
Linux | glibc environments are working fine & CI-tested (on i686/x86_64 and AArch64). musl/uClibc should be usable but aren't tested. |
---|---|
macOS | Fine, CI-tested on x86_64. Requires macOS v10.7+ for native TLS. 32-bit support was dropped with LDC v1.15. |
Windows | Fine for 'native' MSVC (Microsoft Visual C++) environments, CI-tested on Win32 & Win64. NOTE: LDC uses 64-bit double precision for real, unlike DMD, for MSVC long double compatibility. 32-bit MinGW support was almost complete at one stage but got neglected; a manageable number of adaptations (mainly in druntime) would probably suffice to support it again. |
Android | Should be usable for ARMv7-A / AArch64 / i686 / x86_64, only rudimentarily CI-tested though (compilability). NOTE: Requires an LDC linked against our LLVM fork due to a custom TLS emulation scheme. See Cross-compiling with LDC for how to set up cross-compilation with the Android NDK. Also check out the extensive (but a bit dated) Build D for Android article, but note that quite a few steps would now be much simpler with a properly set up ldc2.conf. |
iOS / tvOS / watchOS | Should be usable with 64-bit ARM (all druntime/Phobos unittests pass on iOS with LDC v1.21), only rudimentarily CI-tested though. The official prebuilt macOS package supports cross-compilation out-of-the-box, just use -mtriple=arm64-apple-ios12.0. |
BSDs | Should be usable, not CI-tested though. |
Solaris | Ditto. |
Contributing
LDC is an entirely community-driven effort, so all contributions are warmly welcomed. The easiest way to help with development is to write high-quality bug reports for any issues you run into. For a quick guide on what a useful report should contain, please see Reporting LDC issues.
If you are interested in getting into compiler development, anecdotal evidence suggests that hacking on LDC might be a nice first step, particularly because the LLVM backend is very comfortable to work with. To get started, just browse through the issue list, find a ticket that tickles your fancy (some of them are specifically marked as "junior jobs"), and work on a fix – and of course don't hesitate to ask for advice at the mailing list or on IRC. An LDC contributor's guide is in the works. Have a look at LDC project ideas for a list of features/improvements to add to LDC.
We would also be excited to see LDC packages in more OS distributions, particular Debian and its derivatives. So, if you think you might be able to help, please just drop us a line at the development mailing list. We will actively try to make packaging as smooth as possible, but besides the fact that upstream-maintained packages are sometimes discouraged, it is hard to build good packages for a system you don't know well, so we need to rely on external contributors here.
Presentations
LDC is an active project and the team promotes the use of D and LDC.
- David's talk about LDC at DConf 2013: Slides Video HD Video SD
- Kai's talk about LDC in the LLVM devroom at FOSDEM'14: Slides (PPTX) Slides (PDF) Video
- Kai's talk about the LLVM assembler in the LLVM toolchain devroom at FOSDEM'15: Slides Video
- David's talk about DRuntime at DConf 2015: Slides Video HD Video SD
- Johan's talk about Abstraction Cost and Optimization at DConf 2017: Slides Video
- Johan's talk about PGO, fuzzing, and Address Sanitizer at DConf 2018: Slides Video
Useful Links
- Issue tracker (GitHub)
- Source code (GitHub)
- LDC discussion forum (also available via NNTP and a mailing list interface, see the forum index)
- Gitter chat room
- LDC IRC channel (#ldc on Freenode)