From b1e8a53e0b65ea6ebd11620ff6d91bdf9ec5a1cb Mon Sep 17 00:00:00 2001 From: Nick Kledzik Date: Tue, 13 Mar 2012 00:10:27 +0000 Subject: [PATCH] Added first round of documentation llvm-svn: 152591 --- lld/www/content.css | 27 +++ lld/www/hello.png | Bin 0 -> 27616 bytes lld/www/index.html | 99 +++++++++ lld/www/linker_design.html | 421 +++++++++++++++++++++++++++++++++++++ lld/www/menu.css | 39 ++++ 5 files changed, 586 insertions(+) create mode 100644 lld/www/content.css create mode 100644 lld/www/hello.png create mode 100644 lld/www/index.html create mode 100644 lld/www/linker_design.html create mode 100644 lld/www/menu.css diff --git a/lld/www/content.css b/lld/www/content.css new file mode 100644 index 000000000000..dca6a3291436 --- /dev/null +++ b/lld/www/content.css @@ -0,0 +1,27 @@ +html { margin: 0px; } body { margin: 8px; } + +html, body { + padding:0px; + font-size:small; font-family:"Lucida Grande", "Lucida Sans Unicode", Arial, Verdana, Helvetica, sans-serif; background-color: #fff; color: #222; + line-height:1.5; +} + +h1, h2, h3, tt { color: #000 } + +h1 { padding-top:0px; margin-top:0px;} +h2 { color:#333333; padding-top:0.5em; } +h3 { padding-top: 0.5em; margin-bottom: -0.25em; color:#2d58b7} +li { padding-bottom: 0.5em; } +ul { padding-left:1.5em; } + +/* Slides */ +IMG.img_slide { + display: block; + margin-left: auto; + margin-right: auto +} + +.itemTitle { color:#2d58b7 } + +/* Tables */ +tr { vertical-align:top } diff --git a/lld/www/hello.png b/lld/www/hello.png new file mode 100644 index 0000000000000000000000000000000000000000..70df111f1abd151f2a0ffe133bb6d00b4467d73e GIT binary patch literal 27616 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 WeM-GeSUR|TI9W+0iBd76p#K7$0(0X4 literal 0 HcmV?d00001 diff --git a/lld/www/index.html b/lld/www/index.html new file mode 100644 index 000000000000..b73371a623c5 --- /dev/null +++ b/lld/www/index.html @@ -0,0 +1,99 @@ + + + + + + lld: a linker for LLMV + + + + + + + +
+ +

lld: a linker for LLVM

+ + +

lld is a new set of modular code for creating linker tools.

+ + +

Features and Goals

+ + +

End-User Features:

+
    +
  • Compatible with existing linker options
  • +
  • Fast link times
  • +
  • Minimal memory use
  • +
  • Remove clang's reliance on "the system linker"
  • +
+ +

Applications:

+
    +
  • Use the LLVM 'BSD' License
  • +
  • Modular design
  • +
  • Support cross linking
  • +
  • Easy to add new CPU support
  • +
  • Can be built as static tool or library
  • +
+ +

Design and Implementation:

+
    +
  • Extensive unit tests
  • +
  • Internal linker model can be dumped/read to textual format
  • +
  • Internal linker model can be dumped/read to new native format
  • +
  • Additional linking features can be plugged in as "passes"
  • +
  • OS specific and CPU specific code factored out
  • +
+ + +

Why a new linker?

+ + +

The fact that clang relies on whatever linker tool you happen to have + installed means that clang has been very conservative adopting features + which require a recent linker.

+ +

In the same way that the MC layer of LLVM has removed clang's reliance + on the system assembler tool, the lld project will remove clang's reliance + on the system linker tool.

+ + + +

Current Status

+ + +

lld is in its very early stages of development.

+ + +

Design Documents

+ + + + +
+ + diff --git a/lld/www/linker_design.html b/lld/www/linker_design.html new file mode 100644 index 000000000000..63da416938f1 --- /dev/null +++ b/lld/www/linker_design.html @@ -0,0 +1,421 @@ + + + Design of lld + + + + +

+ Design of lld +

+ +

+ Introduction +

+ +

lld is a new generation of linker. It is not "section" based +like traditional linkers which mostly just interlace sections from multiple +object files into the output file. Instead, lld is based on "Atoms". +Traditional section based linking work well for simple linking, but their model +makes advanced linking features difficult to implement. Features like dead code +stripping, reordering functions for locality, and C++ coalescing require the +linker to work at a finer grain. +

+ +

An atom is an indivisible chunk of code or data. An atom has a set of +attributes, such as: name, scope, content-type, alignment, etc. An atom also +has a list of References. A Reference contains: a kind, an optional offset, +an optional addend, and an optional target atom.

+ +

The Atom model allows the linker to use standard graph theory models for +linking data structures. Each atom is a node, and each Reference is an edge. +The feature of dead code stripping is implemented by following edges to mark +all live atoms, and then delete the non-live atoms.

+
+

+ Atom model +

+ +

An atom is an indivisible chuck of code or data. Typically each user +written function or global variable is an atom. In addition, the compiler may +emit other atoms, such as for literal c-strings or floating point constants, or +for runtime data structures like dwarf unwind info or pointers to initializers. +

+ +

A simple "hello world" object file would be modeled like this:

+hello world graphic +

There are three atoms: main, a proxy for printf, and an anonymous atom +containing the c-string literal "hello world". The Atom "main" has two +references. One is the call site for the call to printf, and the other is +a refernce for the instruction that loads the address of the c-string literal. +

+ +
+

+ File model +

+ +

The linker views the input files as basically containers of Atoms and +References, and just a few attributes of their own. The linker works with three +kinds of files: object files, static libraries, and dynamic shared libraries. +Each kind of file has reader object which presents the file in the model +expected by the linker.

+

Object File +

+An object file is just a container of atoms. When linking +an object file, a reader is instantiated which parses the object file and +instantiates a set of atoms representing all content in the .o file. The +linker adds all those atoms to a master graph. + +

Static Library (Archive) +

+This is the traditional unix static archive which is just a collection of +object files with a "table of contents". When linking with a static library, +by default nothing is added to the master graph of atoms. Instead, if after +merging all atoms from object files into a master graph, if any "undefined" atoms +are left remaining in the master graph, the linker reads the +table of contents for each static library to see if any have the needed +definitions. If so, the set of atoms from the specified object file in the +static library is added to the master graph of atoms. + +

Dynamic Library (Shared Object) +

+Dynamic libraries are different than object files and static libraries in that +they don't directly add any content. +Their purpose is to check at build time that the remaining undefined references +can be resolved at runtime, and provide a list of dynamic libraries (SO_NEEDED) +that will be needed at runtime. +The way this is modeled in the linker is that a dynamic library contributes +no atoms to the initial graph of atoms. Instead, (like static libraries) if +there are "undefined" atoms in the master graph of all atoms, then each +dynamic library is checked to see if exports the required symbol. If so, +a "shared library" atom is instantiated by the by the reader which the linker +uses to replace the "undefined" atom.

+ +
+

+ Linking Steps +

+

Through the use of abstract Atoms, the core of linking is architecture +independent and file format independent. All command line parsing is factored +out into a separate "options" abstraction which enables the linker to be driven +with different command line sets.

+

The overall steps in linking are:

+

    +
  1. Command line processing
  2. +
  3. Parsing input files
  4. +
  5. Resolving
  6. +
  7. Passes/Optimizations
  8. +
  9. Generate output file
  10. +
+ +

The Resolving and Passes steps are done purely on the master graph of atoms, +so they have no notion of file formats such as mach-o or ELF.

+ +

Resolving +

+

The resolving step takes all the atoms graphs from each object file and +combines them into one master object graph. Unfortunately, it is not as simple +as appending the atom list from each file into one big list. There are many +cases where atoms need to be coalesced. That is, two or more atoms need to +be coalesced into one atom. This is necessary to support: C language + "tentative definitions", C++ weak symbols for templates and inlines defined +in headers, replacing undefined atoms with actual definition atoms, and +for merging copies of constants like c-strings and floating point constants.

+ +

The linker support coalescing by-name and by-content. By-name is used for +tentative definitions and weak symbols. By-content is used for constant data +that can be merged.

+ +

The resolving process maintains some global linking "state", including +a "symbol table" which is a map from llvm::StringRef to lld::Atom*. +With these data structures, the linker iterates all atoms in all input files. F +or each atom, it checks if the atom is named and has a global or hidden scope. +If so, the atom is added to the symbol table map. If there already is +a matching atom in that table, that means the current atom needs to be +coalesced with the found atom, or it is a multiple definition error. +

+ +

When all initial input file atoms have been processed by the resolver, +a scan is made to see if there are any undefined atoms in the graph. If there +are, the linker scans all libraries (both static and dynamic) looking for +definitions to replace the undefined atoms. It is an error if any undefined +atoms are left remaining. +

+ +

Dead code stripping (if requested) is done at the end of resolving. The +linker does a simple mark-and-sweep. It starts with "root" atoms (like "main" +in a main executable) and follows each references and marks each Atom that +it visits as "live". When done, all atoms not marked "live" are removed. +

+ +

The result of the Resolving phase is the creation of an lld::File object. +The goal is that the lld::File model is the internal representation throughout +the linker. The file readers parse (mach-o, ELF, COFF) into an lld::File. +The file writers (mach-o, ELF, COFF) taken an lld::File and produce their +file kind, and every Pass only operates on an lld::File. This is not only +a simpler, consistent model, but it enables the state of the linker to be +dumped at any point in the link for testing purposes. +

+ + +

Passes +

+

The Passes step +is an open ended set of routines that each get a change to modify or enhance +the current lld::File object. Some example Passes are:

+
    +
  • stub (PLT) generation
  • +
  • GOT instantiation
  • +
  • order_file optimization
  • +
  • branch island generation
  • +
  • branch shim generation
  • +
  • Objective-C optimizations (Darwin specific)
  • +
  • TLV instantiation (Darwin specific)
  • +
  • dtrace probe processing (Darwin specific)
  • +
  • compact unwind encoding (Darwin specific)
  • +
+

Some of these passes are specific to Darwin's runtime environments. But many +of the passes are applicable to any OS (such as generating branch island for +out of range branch instructions).

+ +

The general structure of a pass is to iterate through the atoms in the +current lld::File object, inspecting each atom and doing something. +For instance, the stub pass, looks for call sites to shared library atoms +(e.g. call to printf). It then +instantiates a "stub" atom (PLT entry) and a "lazy pointer" atom for each +proxy atom needed, and these new atoms are added to the current lld::File +object. Next, all the noted call sites to shared library atoms have their +References altered to point to the stub atom instead of the shared library +atom.

+ +

Generate Output File +

+

Once the passes are done, the output file writer is given current lld::File +object. The writer's job is to create the executable content file wrapper +and place the content of the atoms into it. +

+ + +

+ lld::File representations +

+

Just as LLMV has three representations of its IR model, lld has three +representations of its File/Atom/Reference model: +

    +
  • In memory, abstract C++ classes + (lld::Atom, lld::Reference, and lld::File)
  • +
  • textual (in YAML)
  • +
  • binary format ("native")
  • +
+

+ +

Binary File Format +

+

In theory, lld::File objects could be written to disk in an existing +Object File format standard (e.g. ELF). Instead we choose to define a new +binary file format. There are two main reasons for this: fidelity and +performance.

+

In order for lld to work as a linker on all platforms, its internal model +must be rich enough to model all CPU and OS linking features. But if we choose +an existing Object File format as the lld binary format, that means an on +going need to retrofit each platform specific feature needed from alternate +platforms into the existing Object File format. Having our own "native" +binary format side steps that issue. We still need to be able to binary +encode all the features, but once the in-memory model can represent the feature, +it is straight forward to binary encode it.

+ +

The reason to use a binary file format at all, instead of a textual file +format, is speed. You want the binary format to be as fast as possible to read +into the in-memory model. Given that we control the in-memory model and the +binary format, the obvious way to make reading super fast it to make the file +format be basically just an array of atoms. The reader just mmaps in the file +and looks at the header to see how many atoms there are and instantiate that +many atom objects with the atom attribute information coming from that array. +The trick is designing this in a way that can be extended as the Atom mode +evolves and new attributes are added. +

+ +

The native object file format starts with a header that lists how many +"chunks" are in the file. A chunk is an array of "ivar data". The native +file reader instantiates an array of Atom objects (with one large malloc call). +Each atom contains just a pointer to its vtable and a pointer to its ivar data. +All methods on lld::Atom are virtual, so all the method implementations return +values based on the ivar data to which it has a pointer. +If a new linking features is added which requires a change to the lld::Atom +model, a new native reader class (e.g. version 2) is defined which knows +how to read the new feature information from the new ivar data. The old +reader class (e.g. version 1) is updated to do its best to model (the lack +of the new feature) given the old ivar data in existing native object files. +

+ +

With this model for the native file format, files can be read and turned +into the in-memory graph of lld::Atoms with just a few memory allocations. +And the format can easily adapt over time to new features

+ + +

Textual representations in YAML +

+

+In designing a textual format we want something easy for humans to read and +easy for the linker to parse. Since an atom has lots of attributes most of +which are usually just the default, we should define default values for +every attribute so that those can be omitted from the text representation. +Here is the atoms for a simple hello world program expressed in YAML. +

+
+---
+target-triple:   x86_64-apple-darwin11
+
+atoms:
+    - name:    _main
+      scope:   global
+      type:    code
+      content: [ 55, 48, 89, e5, 48, 8d, 3d, 00, 00, 00, 00, 30, c0, e8, 00, 00,
+                 00, 00, 31, c0, 5d, c3 ]
+      fixups:
+      - offset: 07
+        kind:   pcrel32
+        target: 2
+      - offset: 0E
+        kind:   call32
+        target: _fprintf
+
+    - type:    c-string
+      content: [ 73, 5A, 00 ]
+
+...
+
+ +

The biggest use for the textual format will be writing test cases. +Writing test cases in C is problematic because the compiler +may vary its output over time for its own optimization reasons which my +inadvertently disable or break the linker feature trying to be tested. By +writing test cases in the linkers own textual format, we can exactly specify +every attribute of every atom and thus target specific linker logic. +

+ + + + +

+ Testing +

+

The lld project contains a test suite which is being built up as new code +is added to lld. All new lld functionality should have a tests added to the +test suite.

+

The test suite is lit driven. +Each test is a text file with comments telling lit how to run the test and +check the result

+

To facilitate testing, the lld project builds a tool called lld-core. +This tool reads a YAML file (default from stdin), parses it into one or +more lld::File objects in memory and then feeds those lld::File objects +to the resolver phase. The output of the resolver is written as a native +object file. It is then read back in using the native object file reader +and then pass to the YAML writer. This round-about path means that all three +representations (in-memory, binary, and text) are exercised, and any new +feature has to work in all the representations to pass the test. +

+ +

Resolver testing +

+

Basic testing is the "core linking" or resolving phase. That +is where the linker merges object files. All test cases are written in YAML. +One feature of YAML is that it allows multiple "documents" to be encoding in +one YAML stream. That means one text file can appear to the linker as +multiple .o files - the normal case for the linker. +

+

Here is a simple example of a core linking test case. It checks that +an undefined atom from one file will be replaced by a definition from +another file.

+
+# RUN: lld-core %s | FileCheck %s
+
+#
+# Test that undefined atoms are replaced with defined atoms.
+#
+
+---
+atoms:
+    - name:              foo
+      definition:        undefined
+---
+atoms:
+    - name:              foo
+      scope:             global
+      type:              code
+...
+
+# CHECK:       name:       foo
+# CHECK:       scope:      global
+# CHECK:       type:       code
+# CHECK-NOT:   name:       foo
+# CHECK:       ...
+
+ +

Passes testing +

+

Since Passes just operate on an lld::File object, the lld-core tool has +the option to run a particular pass (after resolving). Thus, you can write +a YAML test case with carefully crafted input to exercise areas of a Pass +and the check the resulting lld::File object as represented in YAML. +

+ + +

+ Design Issues +

+ +

There are a number of open issues in the design of lld. The plan is to +wait and make these design decisions when we need to.

+ + +

Debug Info +

+

Currently, the lld model says nothing about debug info. But the most +popular debug format is DWARF and there is some impedance mismatch with the +lld model and DWARF. In lld there are just Atoms and only Atoms that need +to be in a special section at runtime have an associated section. Also, +Atoms do not have addresses. The way DWARF is spec'ed different parts of +DWARF are supposed to go into specially named sections and the DWARF references +function code by address.

+ +

CPU and OS specific functionality +

+

Currently, lld has an abstract "Platform" that deals with any CPU or OS +specific differences in linking. We just keep adding virtual methods to +the base Platform class as we find linking areas that might need customization. +At some point we'll need to structure this better. +

+ +

File Attributes +

+

Currently, lld::File just has a path and a way to iterate its atoms. We +will need to add mores attributes on a File. For example, some equivalent +to the target triple. There is also a number of cached or computed attributes +that could make various Passes more efficient. For instance, on Darwin +there are a number of Objective-C optimizations that can be done by a Pass. +But it would improve the plain C case if the Objective-C optimization Pass did +not have to scan all atoms looking for any Objective-C data structures. This +could be done if the lld::File object had an attribute that said if the file +had any Objective-C data in it. The Resolving phase would then be required +to "merge" that attribute as object files are added. +

+ +

Command Line Processing +

+

Eventually, we may want this linker to be able to be a drop in replacement +linker for existing linker tools. That means being able to handle command +line arguments for different platforms (e.g. darwin or linux). Currently, +there is no command line processing code in lld. If clang winds up +incorporating the lld libraries into the clang binary, lld may be able to punt +this work because clang will be responsible for setting up the state for lld. +

+ + + + + + + + diff --git a/lld/www/menu.css b/lld/www/menu.css new file mode 100644 index 000000000000..4a887b1907a3 --- /dev/null +++ b/lld/www/menu.css @@ -0,0 +1,39 @@ +/***************/ +/* page layout */ +/***************/ + +[id=menu] { + position:fixed; + width:25ex; +} +[id=content] { + /* ***** EDIT THIS VALUE IF CONTENT OVERLAPS MENU ***** */ + position:absolute; + left:29ex; + padding-right:4ex; +} + +/**************/ +/* menu style */ +/**************/ + +#menu .submenu { + padding-top:1em; + display:block; +} + +#menu label { + display:block; + font-weight: bold; + text-align: center; + background-color: rgb(192,192,192); +} +#menu a { + padding:0 .2em; + display:block; + text-align: center; + background-color: rgb(235,235,235); +} +#menu a:visited { + color:rgb(100,50,100); +}