2015-03-24 21:31:36 +00:00
|
|
|
======
|
|
|
|
Driver
|
|
|
|
======
|
|
|
|
|
2017-04-16 16:03:39 +00:00
|
|
|
Note: this document discuss Mach-O port of LLD. For ELF and COFF,
|
|
|
|
see :doc:`index`.
|
|
|
|
|
2015-03-24 21:31:36 +00:00
|
|
|
.. contents::
|
|
|
|
:local:
|
|
|
|
|
|
|
|
Introduction
|
|
|
|
============
|
|
|
|
|
|
|
|
This document describes the lld driver. The purpose of this document is to
|
|
|
|
describe both the motivation and design goals for the driver, as well as details
|
|
|
|
of the internal implementation.
|
|
|
|
|
|
|
|
Overview
|
|
|
|
========
|
|
|
|
|
|
|
|
The lld driver is designed to support a number of different command line
|
|
|
|
interfaces. The main interfaces we plan to support are binutils' ld, Apple's
|
|
|
|
ld, and Microsoft's link.exe.
|
|
|
|
|
|
|
|
Flavors
|
|
|
|
-------
|
|
|
|
|
|
|
|
Each of these different interfaces is referred to as a flavor. There is also an
|
|
|
|
extra flavor "core" which is used to exercise the core functionality of the
|
|
|
|
linker it the test suite.
|
|
|
|
|
|
|
|
* gnu
|
|
|
|
* darwin
|
|
|
|
* link
|
|
|
|
* core
|
|
|
|
|
|
|
|
Selecting a Flavor
|
|
|
|
^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
There are two different ways to tell lld which flavor to be. They are checked in
|
|
|
|
order, so the second overrides the first. The first is to symlink :program:`lld`
|
|
|
|
as :program:`lld-{flavor}` or just :program:`{flavor}`. You can also specify
|
|
|
|
it as the first command line argument using ``-flavor``::
|
|
|
|
|
|
|
|
$ lld -flavor gnu
|
|
|
|
|
|
|
|
There is a shortcut for ``-flavor core`` as ``-core``.
|
|
|
|
|
|
|
|
|
|
|
|
Adding an Option to an existing Flavor
|
|
|
|
======================================
|
|
|
|
|
|
|
|
#. Add the option to the desired :file:`lib/Driver/{flavor}Options.td`.
|
|
|
|
|
|
|
|
#. Add to :cpp:class:`lld::FlavorLinkingContext` a getter and setter method
|
|
|
|
for the option.
|
|
|
|
|
|
|
|
#. Modify :cpp:func:`lld::FlavorDriver::parse` in :file:
|
|
|
|
`lib/Driver/{Flavor}Driver.cpp` to call the targetInfo setter
|
|
|
|
for corresponding to the option.
|
|
|
|
|
|
|
|
#. Modify {Flavor}Reader and {Flavor}Writer to use the new targtInfo option.
|
|
|
|
|
|
|
|
|
|
|
|
Adding a Flavor
|
|
|
|
===============
|
|
|
|
|
|
|
|
#. Add an entry for the flavor in :file:`include/lld/Driver/Driver.h` to
|
|
|
|
:cpp:class:`lld::UniversalDriver::Flavor`.
|
|
|
|
|
|
|
|
#. Add an entry in :file:`lib/Driver/UniversalDriver.cpp` to
|
|
|
|
:cpp:func:`lld::Driver::strToFlavor` and
|
|
|
|
:cpp:func:`lld::UniversalDriver::link`.
|
2017-01-02 19:19:15 +00:00
|
|
|
This allows the flavor to be selected via symlink and `-flavor`.
|
2015-03-24 21:31:36 +00:00
|
|
|
|
|
|
|
#. Add a tablegen file called :file:`lib/Driver/{flavor}Options.td` that
|
|
|
|
describes the options. If the options are a superset of another driver, that
|
|
|
|
driver's td file can simply be included. The :file:`{flavor}Options.td` file
|
|
|
|
must also be added to :file:`lib/Driver/CMakeLists.txt`.
|
|
|
|
|
|
|
|
#. Add a ``{flavor}Driver`` as a subclass of :cpp:class:`lld::Driver`
|
|
|
|
in :file:`lib/Driver/{flavor}Driver.cpp`.
|