# Support Library

## Abstract

This document provides some details on LLVM's Support Library, located in the
source at `lib/Support` and `include/llvm/Support`. The library's purpose
is to shield LLVM from the differences between operating systems for the few
services LLVM needs from the operating system. Much of LLVM is written using
portability features of standard C++. However, in a few areas, system dependent
facilities are needed and the Support Library is the wrapper around those
system calls.

By centralizing LLVM's use of operating system interfaces, we make it possible
for the LLVM tool chain and runtime libraries to be more easily ported to new
platforms since (theoretically) only `lib/Support` needs to be ported. This
library also unclutters the rest of LLVM from #ifdef use and special cases for
specific operating systems. Such uses are replaced with simple calls to the
interfaces provided in `include/llvm/Support`.

Note that the Support Library is not intended to be a complete operating system
wrapper (such as the Adaptive Communications Environment (ACE) or Apache
Portable Runtime (APR)), but only provides the functionality necessary to
support LLVM.

The Support Library was originally referred to as the System Library, written
by Reid Spencer who formulated the design based on similar work originating
from the eXtensible Programming System (XPS). Several people helped with the
effort; especially, Jeff Cohen and Henrik Bach on the Win32 port.

## Keeping LLVM Portable

In order to keep LLVM portable, LLVM developers should adhere to a set of
portability rules associated with the Support Library. Adherence to these rules
should help the Support Library achieve its goal of shielding LLVM from the
variations in operating system interfaces and doing so efficiently. The
following sections define the rules needed to fulfill this objective.

### Don't Include System Headers

Except in `lib/Support`, no LLVM source code should directly `#include` a
system header. Care has been taken to remove all such `#includes` from LLVM
while `lib/Support` was being developed. Specifically this means that header
files like "`unistd.h`", "`windows.h`", "`stdio.h`", and "`string.h`"
are forbidden to be included by LLVM source code outside the implementation of
`lib/Support`.

To obtain system-dependent functionality, existing interfaces to the system
found in `include/llvm/Support` should be used. If an appropriate interface is
not available, it should be added to `include/llvm/Support` and implemented in
`lib/Support` for all supported platforms.

### Don't Expose System Headers

The Support Library must shield LLVM from **all** system headers. To obtain
system level functionality, LLVM source must
`#include "llvm/Support/Thing.h"` and nothing else. This means that
`Thing.h` cannot expose any system header files. This protects LLVM from
accidentally using system specific functionality and only allows it via
the `lib/Support` interface.

### Use Standard C Headers

The **standard** C headers (the ones beginning with "c") are allowed to be
exposed through the `lib/Support` interface. These headers and the things they
declare are considered to be platform agnostic. LLVM source files may include
them directly or obtain their inclusion through `lib/Support` interfaces.

### Use Standard C++ Headers

The **standard** C++ headers from the standard C++ library and standard
template library may be exposed through the `lib/Support` interface. These
headers and the things they declare are considered to be platform agnostic.
LLVM source files may include them or obtain their inclusion through
`lib/Support` interfaces.

### High Level Interface

The entry points specified in the interface of `lib/Support` must be aimed at
completing some reasonably high level task needed by LLVM. We do not want to
simply wrap each operating system call. It would be preferable to wrap several
operating system calls that are always used in conjunction with one another by
LLVM.

For example, consider what is needed to execute a program, wait for it to
complete, and return its result code. On Unix, this involves the following
operating system calls: `getenv`, `fork`, `execve`, and `wait`. The
correct thing for `lib/Support` to provide is a function, say
`ExecuteProgramAndWait`, that implements the functionality completely. what
we don't want is wrappers for the operating system calls involved.

There must **not** be a one-to-one relationship between operating system
calls and the Support library's interface. Any such interface function will be
suspicious.

### No Unused Functionality

There must be no functionality specified in the interface of `lib/Support`
that isn't actually used by LLVM. We're not writing a general purpose operating
system wrapper here, just enough to satisfy LLVM's needs. And, LLVM doesn't
need much. This design goal aims to keep the `lib/Support` interface small and
understandable which should foster its actual use and adoption.

### No Duplicate Implementations

The implementation of a function for a given platform must be written exactly
once. This implies that it must be possible to apply a function's
implementation to multiple operating systems if those operating systems can
share the same implementation. This rule applies to the set of operating
systems supported for a given class of operating system (e.g. Unix, Win32).

### No Virtual Methods

The Support Library interfaces can be called quite frequently by LLVM. In order
to make those calls as efficient as possible, we discourage the use of virtual
methods. There is no need to use inheritance for implementation differences, it
just adds complexity. The `#include` mechanism works just fine.

### No Exposed Functions

Any functions defined by system libraries (i.e. not defined by `lib/Support`)
must not be exposed through the `lib/Support` interface, even if the header
file for that function is not exposed. This prevents inadvertent use of system
specific functionality.

For example, the `stat` system call is notorious for having variations in the
data it provides. `lib/Support` must not declare `stat` nor allow it to be
declared. Instead it should provide its own interface to discovering
information about files and directories. Those interfaces may be implemented in
terms of `stat` but that is strictly an implementation detail. The interface
provided by the Support Library must be implemented on all platforms (even
those without `stat`).

### No Exposed Data

Any data defined by system libraries (i.e. not defined by `lib/Support`) must
not be exposed through the `lib/Support` interface, even if the header file
for that function is not exposed. As with functions, this prevents inadvertent
use of data that might not exist on all platforms.

### Minimize Soft Errors

Operating system interfaces will generally provide error results for every
little thing that could go wrong. In almost all cases, you can divide these
error results into two groups: normal/good/soft and abnormal/bad/hard. That is,
some of the errors are simply information like "file not found", "insufficient
privileges", etc. while other errors are much harder like "out of space", "bad
disk sector", or "system call interrupted". We'll call the first group "*soft*"
errors and the second group "*hard*" errors.

`lib/Support` must always attempt to minimize soft errors. This is a design
requirement because the minimization of soft errors can affect the granularity
and the nature of the interface. In general, if you find that you're wanting to
throw soft errors, you must review the granularity of the interface because it
is likely you're trying to implement something that is too low level. The rule
of thumb is to provide interface functions that **can't** fail, except when
faced with hard errors.

For a trivial example, suppose we wanted to add an "`OpenFileForWriting`"
function. For many operating systems, if the file doesn't exist, attempting to
open the file will produce an error. However, `lib/Support` should not simply
throw that error if it occurs because its a soft error. The problem is that the
interface function, `OpenFileForWriting` is too low level. It should be
`OpenOrCreateFileForWriting`. In the case of the soft "doesn't exist" error,
this function would just create it and then open it for writing.

This design principle needs to be maintained in `lib/Support` because it
avoids the propagation of soft error handling throughout the rest of LLVM.
Hard errors will generally just cause a termination for an LLVM tool so don't
be bashful about throwing them.

Rules of thumb:

1. Don't throw soft errors, only hard errors.
2. If you're tempted to throw a soft error, re-think the interface.
3. Handle internally the most common normal/good/soft error conditions
   so the rest of LLVM doesn't have to.

### No throw Specifications

None of the `lib/Support` interface functions may be declared with C++
`throw()` specifications on them. This requirement makes sure that the
compiler does not insert additional exception handling code into the interface
functions. This is a performance consideration: `lib/Support` functions are
at the bottom of many call chains and as such can be frequently called. We
need them to be as efficient as possible. However, no routines in the system
library should actually throw exceptions.

### Code Organization

Implementations of the Support Library interface are separated by their general
class of operating system. Currently only Unix and Win32 classes are defined
but more could be added for other operating system classifications. To
distinguish which implementation to compile, the code in `lib/Support` uses
the `LLVM_ON_UNIX` and `_WIN32` `#defines`. Each source file in
`lib/Support`, after implementing the generic (operating system independent)
functionality needs to include the correct implementation using a set of
`#if defined(LLVM_ON_XYZ)` directives. For example, if we had
`lib/Support/Path.cpp`, we'd expect to see in that file:

```c++
#if defined(LLVM_ON_UNIX)
#include "Unix/Path.inc"
#endif
#if defined(_WIN32)
#include "Windows/Path.inc"
#endif
```

The implementation in `lib/Support/Unix/Path.inc` should handle all Unix
variants. The implementation in `lib/Support/Windows/Path.inc` should handle
all Windows variants. What this does is quickly inc the basic class
of operating system that will provide the implementation. The specific details
for a given platform must still be determined through the use of `#ifdef`.

### Consistent Semantics

The implementation of a `lib/Support` interface can vary drastically between
platforms. That's okay as long as the end result of the interface function is
the same. For example, a function to create a directory is pretty straight
forward on all operating system. System V IPC on the other hand isn't even
supported on all platforms. Instead of "supporting" System V IPC,
`lib/Support` should provide an interface to the basic concept of
inter-process communications. The implementations might use System V IPC if
that was available or named pipes, or whatever gets the job done effectively
for a given operating system. In all cases, the interface and the
implementation must be semantically consistent.

