80 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
======
 | 
						|
Driver
 | 
						|
======
 | 
						|
 | 
						|
.. 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`.
 | 
						|
   This allows the flavor to be selected via symlink and :option:`-flavor`.
 | 
						|
 | 
						|
#. 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`.
 |