Commit Graph

858 Commits

Author SHA1 Message Date
Pete Cooper ebecd6c543 Fix EHFrame processing to add implicit references when needed.
The current code for processCIE and processFDE returns out if it sees
any references.  The problem with this is that some references could be
explicit in the binary, while others are implicit as they can be
inferred from the content of the EHFrame itself.

This change walks the references we have against the references we
need, and verifies that all explicit references are in the correct place,
and generates any missing implicit ones.

Reviewed by Lang Hames and Nick Kledzik.

Differential Revision: http://reviews.llvm.org/D15439

llvm-svn: 263590
2016-03-15 21:33:10 +00:00
Rui Ueyama a453c0a5ad Merge DarwinLdDriver and Driver.
Now that DarwinLdDriver is the only derived class of Driver.
This patch merges them and actually removed the class because
they can now just be non-member functions. This change simplifies
a common header, Driver.h.

http://reviews.llvm.org/D17788

llvm-svn: 262502
2016-03-02 19:08:05 +00:00
Rui Ueyama 515025522b Use C++11 initializers for data members.
http://reviews.llvm.org/D17793

llvm-svn: 262501
2016-03-02 19:06:20 +00:00
Rui Ueyama 52968b58f5 Use C++11 initializers for data members.
llvm-svn: 262447
2016-03-02 01:49:27 +00:00
Rui Ueyama 0c8fad7dba Remove more dead code.
llvm-svn: 262445
2016-03-02 01:34:36 +00:00
Rui Ueyama 0c23bcb252 Remove default implementations that are always overridden by subclasses.
llvm-svn: 262444
2016-03-02 01:34:34 +00:00
Rui Ueyama 01ba8b2f7b Remove more dead code.
llvm-svn: 262443
2016-03-02 01:23:29 +00:00
Rui Ueyama be34a9c24e Remove remaining files of Core.
llvm-svn: 262435
2016-03-02 00:37:50 +00:00
Rui Ueyama 947648f502 Make a few utility functions file-scoped.
makeErrorFile and parseMemberFiles are now used only in DarwinLdDriver.cpp.
This patch moves them to that file.

llvm-svn: 262423
2016-03-01 23:52:04 +00:00
Rui Ueyama 958e44b17d Remove dead code.
llvm-svn: 262422
2016-03-01 23:48:03 +00:00
Rui Ueyama 1054ae7e1e Remove CoreDriver.
CoreDriver implements a driver for a hypothetical platform.
It is intended to be used in unittests. However, it is actually
redundant because the features are tested using the real driver
for the real platforms. So we can remove this.

http://reviews.llvm.org/D17698

llvm-svn: 262421
2016-03-01 23:44:05 +00:00
Rui Ueyama be5e0b07ca Remove dead code for ELF.
llvm-svn: 262195
2016-02-28 21:59:02 +00:00
Rui Ueyama 8cca07eacf Remove dead code for ELF.
The preload feature was buggy that we had disabled it even for ELF.

llvm-svn: 262194
2016-02-28 21:22:44 +00:00
Rui Ueyama 701c3250e5 Remove remaining code for COFF.
llvm-svn: 262193
2016-02-28 21:22:40 +00:00
Rui Ueyama 417553d393 Make the entry point function calls consistent. NFC.
llvm-svn: 262191
2016-02-28 19:54:51 +00:00
Rui Ueyama e7b330052f Move functionality of UniversalDriver to the entry point file.
UniversalDriver was used as a dispatcher to each platform-specific driver.
It had its own Options.td file. It was not just too much to parse only a
few options (we only want to parse -core, -flavor or argv[0]),
but also interpreted arguments too early. For example, if you invoke lld as
"lld -flavor gnu ... -help", then you'd get the UniversalDriver's help
message instead of GnuDriver's. This patch eliminates the use of Options
from the dispatcher.

http://reviews.llvm.org/D17686

llvm-svn: 262190
2016-02-28 19:50:14 +00:00
Rafael Espindola c778aa4a30 Delete more COFF and ELF bits from the old linker.
llvm-svn: 262184
2016-02-28 16:27:08 +00:00
Rafael Espindola 8c3184137b Delete dead arch types.
llvm-svn: 262183
2016-02-28 16:11:53 +00:00
Rafael Espindola 812b032ad4 Delete a bit more ELF and COFF from the old linker.
llvm-svn: 262182
2016-02-28 16:08:21 +00:00
Rafael Espindola fd14979812 Delete more ELF bits from the old linker.
llvm-svn: 262181
2016-02-28 16:03:37 +00:00
Rui Ueyama b4d8c3bd2a Remove dead header file.
llvm-svn: 262173
2016-02-28 04:44:10 +00:00
Rui Ueyama 18c6d313af Remove lld/Core/range.h.
IIUC, range was an experiment to see how N3350 would work in LLD.
It turned out it didn't get traction, and it is basically duplicate
of iterator_range in ADT. We have only two occurrences of range,
and all of them are easily rewritten without it.

http://reviews.llvm.org/D17687

llvm-svn: 262171
2016-02-28 04:03:01 +00:00
Rui Ueyama 0a0d56922f Remove dead code. This error type is for the old linker script reader.
llvm-svn: 262166
2016-02-28 02:51:02 +00:00
Rui Ueyama a73115fc52 Remove dead header files.
llvm-svn: 262165
2016-02-28 02:47:52 +00:00
Rafael Espindola f6f3e2dd05 Remove a few bits of elf from the old linker.
llvm-svn: 262164
2016-02-28 02:22:24 +00:00
Rui Ueyama f09a6b3adb Remove dead code.
llvm-svn: 262160
2016-02-28 00:37:52 +00:00
Rafael Espindola e0df00b91f Rename elf2 to elf.
llvm-svn: 262159
2016-02-28 00:25:54 +00:00
Rafael Espindola 3a4d0a7c17 Remove the old ELF linker.
I think it is clear by now that the new linker is viable.

llvm-svn: 262158
2016-02-28 00:10:58 +00:00
Pete Cooper e8d9df4ea5 Use __nl_symbol_ptr instead of __got in the stubs pass on x86 archs.
The non lazy atoms generated in the stubs pass use an image cache to
hold all of the pointers.  On arm archs, this is the __got section,
but on x86 archs it should be __nl_symbol_ptr.

rdar://problem/24572729

llvm-svn: 260271
2016-02-09 20:11:17 +00:00
Pete Cooper 9b28a4559e Add cmdline options for LC_DATA_IN_CODE load command.
Also added the defaults for whether to generate this load command, which
the cmdline options are able to override.

There was also a difference to ld64 which is fixed here in that ld64 will
generate an empty data in code command if requested.

rdar://problem/24472630

llvm-svn: 260191
2016-02-09 02:10:39 +00:00
Pete Cooper 41f3e8e408 Generate LC_FUNCTION_STARTS load command.
This load command generates data in the LINKEDIT section which
is a list of ULEB128 delta's to all of the functions in the __text section.

It is then 0 terminated and pointer aligned to pad.

ld64 exposes the -function-starts and no-function-starts cmdline options
to override behaviour from the defaults based on file types.

rdar://problem/24472630

llvm-svn: 260188
2016-02-09 01:38:13 +00:00
Pete Cooper cea565593f Reorder enum entry as its used for atom sorting.
The atom content type enum is used as a tie breaker to sort atoms.
In that case, we want MachHeader to be before typeCode as it really will
be before the code in the final executable.

Test case to follow in the next commit or two.

llvm-svn: 260184
2016-02-09 01:27:30 +00:00
Pete Cooper 40576fa0e9 Add support for the source_version cmdline option.
This is of the form A.B.C.D.E and to match ld64's behaviour, is
always output to files, even when the version is 0.

rdar://problem/24472630

llvm-svn: 259746
2016-02-04 02:45:23 +00:00
Pete Cooper 451ec4b68e Add support for -sdk_version cmdline option.
This option is emitted in the min_version load commands.

Note, there's currently a difference in behaviour compared to ld64 in
that we emit a warning if we generate a min_version load command and
didn't give an sdk_version.  We need to decide what the correct behaviour
is here as its possible we want to emit an error and force clients to
provide the option.

llvm-svn: 259729
2016-02-03 23:39:05 +00:00
Pete Cooper 354809e139 Add generation of LC_VERSION_MIN load commands.
If the command line contains something like -macosx_version_min and we
don't explicitly disable generation with -no_version_load_command then
we generate the LC_VERSION_MIN command in the output file.

There's a couple of FIXME's in here.  These will be handled soon with
more tests but I didn't want to grow this patch any more than it already was.

rdar://problem/24472630

llvm-svn: 259718
2016-02-03 22:28:29 +00:00
Rui Ueyama b6940115a8 ELF: Make link() to take an output stream to which error messages are written.
http://reviews.llvm.org/D16668

llvm-svn: 259597
2016-02-02 22:49:32 +00:00
Pete Cooper d4f414583a Fix handling of mach header and DSO handle symbols.
The magic file which contained these symbols inherited from archive
which meant that the resolver didn't add the required atoms as archive
members only get added when referenced.  Instead we now inherit from
SimpleFile which always links in the atoms needed.

The second issue was in the handling of these symbols when we emit
the MachO.  The mach header symbol needs to be in the atom list as
it gets an offset (0), and being in the atom list makes sure it is
emitted to the symbol table.  DSO handles are not emitted to the
symbol table.

rdar://problem/24450654

llvm-svn: 259574
2016-02-02 21:37:15 +00:00
Pete Cooper ab01073765 Add ObjC method list atom type. NFC.
An upcoming patch will use this to create lists of ObjC methods.

Adding it now to reduce the amount of code in that patch.

Test cases will follow in the other patch too.

llvm-svn: 259440
2016-02-01 23:56:27 +00:00
Pete Cooper c2bad09cdd Add command line option to disable ObjC category merging.
This adds the no_objc_category_merging cmdline option which will
be used in an upcoming commit to disable the category optimizer.

It is on by default in ld64 so we match that here.

Test case will come soon with the patch to make use of this option.

llvm-svn: 259439
2016-02-01 23:56:23 +00:00
Pete Cooper f91b22ce2c Move SimpleDefinedAtom::addReference to DefinedAtom.
Most of the other methods to access Reference's were on DefinedAtom so
this just keeps them all together.

This will be used in a future patch in ObjCPass which needs to add
new references.  The method is virtual because we may add references to
different data structures depending on whether we parsed a macho file or
yaml.

llvm-svn: 259436
2016-02-01 23:42:10 +00:00
Pete Cooper bddf6c8c57 Add operator== for DefinedAtom::reference_iterator. NFC.
This will be used by a future commit which wanted to compare iterators
for equality.

Also changed operator!= to be in terms of the new operator==

llvm-svn: 259431
2016-02-01 23:05:20 +00:00
Rui Ueyama 64cfffd333 ELF: Rename error -> fatal and redefine error as a non-noreturn function.
In many situations, we don't want to exit at the first error even in the
process model. For example, it is better to report all undefined symbols
rather than reporting the first one that the linker picked up randomly.

In order to handle such errors, we don't need to wrap everything with
ErrorOr (thanks for David Blaikie for pointing this out!) Instead, we
can set a flag to record the fact that we found an error and keep it
going until it reaches a reasonable checkpoint.

This idea should be applicable to other places. For example, we can
ignore broken relocations and check for errors after visiting all relocs.

In this patch, I rename error to fatal, and introduce another version of
error which doesn't call exit. That function instead sets HasError to true.
Once HasError becomes true, it stays true, so that we know that there
was an error if it is true.

I think introducing a non-noreturn error reporting function is by itself
a good idea, and it looks to me that this also provides a gradual path
towards lld-as-a-library (or at least embed-lld-to-your-program) without
sacrificing code readability with lots of ErrorOr's.

http://reviews.llvm.org/D16641

llvm-svn: 259069
2016-01-28 18:40:06 +00:00
Eugene Zelenko 3f81a9c654 Fix Clang-tidy modernize-use-nullptr warnings in include/lld/Core/range.h; other minor fixes.
Differential revision: http://reviews.llvm.org/D16565

llvm-svn: 258829
2016-01-26 18:27:37 +00:00
Pete Cooper 351164504a Add support for export_dynamic cmdline option and behaviour.
This option matches the behaviour of ld64, that is it prevents globals
from being dead stripped in executables and dylibs.

Reviewed by Lang Hames

Differential Revision: http://reviews.llvm.org/D16026

llvm-svn: 258554
2016-01-22 21:13:24 +00:00
Pete Cooper 90dbab0b0d Add an ObjCPass to the MachO linker.
This pass currently emits an objc image info section if one is required.

This section contains the aggregated version and flags for all of the input
files.

llvm-svn: 258197
2016-01-19 21:54:21 +00:00
Pete Cooper feaa967ee8 Cache the objc image info constraints in file.
Image info flags describe the objc constraint which is GC/retain/release/etc.

These need to be parsed and stored in the file so that we can do error checking.

That will come in a later commit.

llvm-svn: 258160
2016-01-19 18:46:40 +00:00
Pete Cooper a014ffef87 Add checking of differing swift versions in input files.
Swift versions are part of the objc image info section, and must match
for all files linked which actually have an image info section

llvm-svn: 257964
2016-01-16 00:07:22 +00:00
Pete Cooper f0c0f3c477 Add File::kind's for all subclasses of File.
This is to enable isa<> support for any files which need it.

It will be used in an upcoming patch to differentiate MachOFile from other implicitly generated files.

Reviewed by Lang Hames.

Differential Revision: http://reviews.llvm.org/D16103

llvm-svn: 257830
2016-01-14 22:55:38 +00:00
Pete Cooper 80c0974c6b Add handleLoadedFile hook to the context.
This is called from the resolver on each file we decide we actually want to use.

Future commits will make use of this to extract useful information from the files and do
error checking against the context.  For example, ensure that files are the same arch as
each other.

Reviewed by Lang Hames.

Differential Revision: http://reviews.llvm.org/D16093

llvm-svn: 257814
2016-01-14 21:53:13 +00:00
Pete Cooper 7bf3a85e2b Move parsing of LLVM options to parse() method.
We used to parse the LLVM options in Driver::link.  However, that is
after parse() where we load files.  By moving the LLVM option handling
earlier, we can add DEBUG() to code such as MachONormalizedFileToAtoms.cpp
and have it enabled correctly by '-mllvm --debug'.

llvm-svn: 255819
2015-12-16 20:53:27 +00:00