language: C package: Orange C version: 4.1.7 parts: compiler, assembler, linker, post-linkers, librarian, grep variant, make program, resource compiler, import librarian author: David Lindauer location: http://members.tripod.com/~ladsoft/orangec.htm description: Orange C is an optimizing C99 compiler for MSDOS/WIN32. It features many of the things a standard DOS/Windows C compiler features. As some history it was started as a research project to learn about optimization, and to get away from a whole range of problems with supporting an older compiler/tool chain. Much of the user feedback from the old compiler was also incorporated in the new compiler. There is also some direction being made in terms of retargetability. conformance: The parser was designed against the C99 draft standard, with reference to the C99 rationale. The floating point operations may not act in 100% accordance with the floating point portions of the standard. Two advanced floating point functions are missing from the RTL. The RTL was taken from an older compiler and there was much feedback about it historically, so it should be reasonably conformant. reference: ISO standard n869.pdf - draft standard for C99 C99 rationale version 5.10 - comments on C99 standard Various x86 architecture documentation IEEE-695 - object file format "Building an Optimizing Compiler" - Robert Morgan - Basic information about optimizing compilers and some of the basic optimizations culled from this source "Iterated Register Coalescing" - George & Appel Basics for register allocation "A new MLRISC Register Allocator" - Leung & George Enhancements to the basic register allocation mechanism "A Generalized algorithm for Graph-Coloring Register Allocation" - Smith, et.al enhancements to register allocation that help cope with irregularities between architectures "Lazy Code Motion" - Jens Knoop, Oliver Ruthing, Bernhard Steffen The global common subexpression optimization phase was culled from this source "Analysis of a Simple Algorithm for Global Data Flow Problems" Matthew S. Hecht, Jeffrey D. Uhlman Comments on efficient mechanisms for bit field algorithms that iterate over a flow graph Notes from the 'Scribble' project where used to cull the idea of how to do basic loop invariant code motion while the intermediate code is in SSA form. "Practical and Accurate Low-Level Pointer Analysis" - Bolei Guo, Matthew J. Bridges, Spyridon Triantafyllis Guilherme Ottoni, Easwaran Raman, David I. August this paper gives insite on how to do aliasing calculations on assembly language code without help from the front end; it was adapted to work on intermediate code. "The Lengauer Tarjan Algorithm for Computing the Immediate Dominator Tree of a Flowgraph" - Martin Richards The Local Common Subexpression algorithm was written with some help from members of the comp.compilers newsgroup. features: + both source code and WIN32 executables are available + includes sources for a C language runtime library + the major test programs for this platform are various archivers + dos version can target a wide variety of MSDOS extenders + everything but the compiler and RTL is written in C++ + source code is reused between tools to the extent possible + linker is generic, this project adds a post-link stage to generate OS-specific binaries. Post-linkers can be added by customizing an XML file the linker reads, and adding linker control files to set up standard declarations for link addresses, alignment, and so forth. Since the object file format is abstracted in helper classes that are used across the tool chain, post linkers are generally easy to write. + supports common win32 compiler and tool extensions + utilizes a human-readable object file format + assembler uses XML-based architecture description file to allow for retargeting, it is intended to extend this to support the compiler as well. Assembler syntax similar to NASM. Compiler for this file is included with the sources. + current version of compiler is somewhat customizable to different architectures. + RTL features an OS abstraction layer - OS specific functions are wrapped into this layer and isolated from the main RTL functions. + make program is similar to GNU make + Basic WIN32 headers - this version of the compiler has a recursive-descent parser. bugs: may be some issues with floating point and signal handling restriction: The main portions of source code are new work that is BSD Licensed. The run-time library has also been relicensed with the BSD license. MSDOS extenders from outside sources are included with this package; licensing for each extender is included with the executables (most are freeware). Source code for the basic extender is included; source code for other extenders is unmodified and is usually available from the author(s) of the original packages. This project includes modified WIN32 headers that were derived from GNU sources and are GPL'd. requires: WIN32. Make files are for omake and Borland C++ 5.5. portability: mostly system independent, with some dependencies on WIN32 in the omake program and in generic libraries. OS dependencies are generally isolated in wrapper classes. The compiler itself is designed to be free of dependencies that don't exist in standard runtime libraries. As usual, the RTL is os-dependent but main functions of the RTL are kept as isolated from these dependencies as possible. There may be some residual issues with const correctness in the C++ sources as the Borland compiler is lax in enforcing this. status: active, worked on for several years, released spring of 2010 updated: 2010/10/14