162 Commits

Author SHA1 Message Date
Rui Ueyama
cace52091b [PECOFF] Do not skip COMDAT section symbols.
LLD skipped COMDAT section symbols when reading them because
I thought we don't want to have symbols with the same name.
But they are actually needed because relocations may refer to
the section symbols. So we shoulnd't skip them.

llvm-svn: 221329
2014-11-05 02:21:39 +00:00
Saleem Abdulrasool
3ff2064241 PE/COFF: add ARM NT reference kinds
Teach the reader about ARM NT relocation types.  Although the writer cannot yet
perform the actual application of these relocations, the reader can at least now
identify the relocation types.

llvm-svn: 219178
2014-10-07 01:12:08 +00:00
Saleem Abdulrasool
6211740789 PE/COFF: add a check to ensure that we dont mix up architectures
Previously, we would not check the target machine type and the module (object)
machine type.  Add a check to ensure that we do not attempt to use an object
file with a different target architecture.

This change identified a couple of tests which were incorrectly mixing up
architecture types, using x86 input for a x64 target.  Adjust the tests
appropriately.  The renaming of the input and the architectures covers the
changes to the existing tests.

One significant change to the existing tests is that the newly added test input
for x64 uses the correct user label prefix for X64.

llvm-svn: 219093
2014-10-05 23:43:59 +00:00
Rui Ueyama
44a7c7f1aa [PECOFF] Set ordinal to alias atoms
Atoms are ordered in the output file by ordinal. File has file ordinal,
and atom has atom ordinal which is unique within the file.
No two atoms should have the same combination of ordinals.

However that contract was not satisifed for alias atoms. Alias atom
is defined by /alternatename:sym1=sym2. In this case sym1 is defined
as an alias for sym2. sym1 always got ordinal 0.

As a result LLD failed with an assertion failure.

This patch assigns ordinal to alias atoms.

llvm-svn: 218158
2014-09-19 21:58:54 +00:00
Saleem Abdulrasool
b9e9e0d5f3 PECOFF: loosen assumptions about x86-only targets
Rather than saving whether we are targeting 64-bit x86 (x86_64), simply convert
the single use of that information to the actual relocation type.  This will
permit the selection of non-x86 relocation types (e.g. for WoA support).

Inline the access of the machine type field as it is relatively cheap (a couple
of pointer dereferences) rather than storing the relocation type as a member
variable.

llvm-svn: 218104
2014-09-19 06:09:25 +00:00
Saleem Abdulrasool
42c7aab748 ReaderWriter: print magic in hex
When we encounter an unknown machine type, we print out the machine type magic.
However, we would print out the magic in decimal rather than hex.  Perform this
conversion to make it easier to identify what machine is unsupported.

llvm-svn: 218103
2014-09-19 06:09:18 +00:00
David Majnemer
3588c6b198 Adjust lld to handle LLVM r217812
llvm-svn: 217815
2014-09-15 19:54:53 +00:00
David Majnemer
a2626a584d [PECOFF] Add support for bigobj
lld shouldn't directly use the COFF header nor should it use raw
coff_symbols.  Instead, query the header properties from the
COFFObjectFile and use COFFSymbolRef to abstractly reference COFF
symbols.

This is just enough to get lld compiling with the changes to
llvm::object.  Bigobj specific testing will come later.

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

llvm-svn: 217497
2014-09-10 12:52:03 +00:00
Rui Ueyama
4c6847aab9 [PECOFF] Explicitly pass machine type
x86 and x64 are created equal -- taking x86 as the default argument
made it hard to find bugs.

llvm-svn: 216295
2014-08-22 22:03:16 +00:00
Rui Ueyama
5711df44b8 [PECOFF] Fix PE+ relocations
The implementation of AMD64 relocations was imcomplete
and wrong. On AMD64, we of course have to use AMD64
relocations instead of i386 ones. This patch fixes the
issue.

LLD is now able to link hello64.obj (created from
hello64.asm) against user32.lib and kernel32.lib to
create a Win64 binary.

llvm-svn: 216253
2014-08-22 01:15:43 +00:00
Rui Ueyama
5b6532fa49 Remove dead code.
llvm-svn: 216152
2014-08-21 03:05:12 +00:00
Rafael Espindola
2ed1c57b34 Update for llvm api change.
llvm-svn: 216003
2014-08-19 18:44:51 +00:00
Rui Ueyama
83095b5e8f [PECOFF] addDeadStripRoot is not thread-safe.
llvm-svn: 214835
2014-08-05 01:44:43 +00:00
Rui Ueyama
145ef0186c [PECOFF] Fix /include option in .drectve section.
/INCLUDE arguments passed as command line options are handled in the
same way as Unix -u. All option values are converted to an undefined
symbol and added to a dummy input file, so that the specified symbols
are resolved.

One tricky thing on Windows is that the option is also allowed to
appear in the object file's directive section. At the time when
it's being read, all (regular) command line options have already
been processed. We cannot add undefined atoms to the dummy file
anymore.

Previously, we added such /INCLUDE to a set that has already been
processed. As a result the options were ignored.

This patch fixes the issue. Now, /INCLUDE symbols in the directive
section are handled as real undefined symbol in the COFF file.
We create an undefined symbol for each /INCLUDE argument and add
it to the file being parsed.

llvm-svn: 214824
2014-08-04 23:48:57 +00:00
Rui Ueyama
dd44a7fb0f [PECOFF] Remove unused paraemter.
llvm-svn: 214791
2014-08-04 22:19:53 +00:00
Rafael Espindola
091d371cbc Update for llvm api change.
llvm-svn: 214378
2014-07-31 03:17:04 +00:00
David Blaikie
ced7b43a06 Fix lld build for llvm API changes committed in r213557
llvm-svn: 213560
2014-07-21 16:46:14 +00:00
Rui Ueyama
31fd9d09b2 [PECOFF] Invoke cvtres.exe in the driver.
Previously we invoked cvtres.exe for each compiled Windows
resource file. The generated files were then concatenated
and embedded to the executable.

That was not the correct way to merge compiled Windows
resource files. If you just concatenate generated files,
only the first file would be recognized and the rest would
be ignored as trailing garbage.

The right way to merge them is to call cvtres.exe with
multiple input files. In this patch we do that in the
Windows driver.

llvm-svn: 212763
2014-07-10 20:53:37 +00:00
Rui Ueyama
39dc40af07 [PECOFF] Fix .bss section alignment
Previously the alignment of the .bss section was not
properly set because of a bug in AtomizeDefinedSymbolsInSection.
We set the alignment of the section at the end of the function,
but we use an eraly return for the .bss section, so the code had
been skipped.

llvm-svn: 212571
2014-07-08 23:11:01 +00:00
Rafael Espindola
c2199ecf1e Update for llvm api change.
llvm-svn: 212407
2014-07-06 17:43:22 +00:00
Rafael Espindola
96b676c312 Update for llvm api change.
llvm-svn: 211548
2014-06-23 22:29:12 +00:00
Rui Ueyama
61d7f97000 [PECOFF] Support COMDAT associative sections.
COFF supports a feature similar to ELF's section groups. This
patch implements it.

In ELF, section groups are identified by their names, and they are
treated somewhat differently from regular symbols. In COFF, the
feature is realized in a more straightforward way. A section can
have an annotation saying "if Nth section is linked, link this
section too."

I added a new reference type, kindAssociate. If a target atom is
coalesced away, the referring atom is removed by Resolver, so that
they are treated as a group.

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

llvm-svn: 211106
2014-06-17 16:19:33 +00:00
Rafael Espindola
372bc70c63 Update for llvm api change.
llvm-svn: 210919
2014-06-13 17:20:48 +00:00
Rafael Espindola
54427ccef3 include system_error directly.
llvm-svn: 210801
2014-06-12 17:15:58 +00:00
Rafael Espindola
1675d51eac Run llvm/utils/sort_includes.py in a few files.
This will reduce the noise in a followup patch.

llvm-svn: 210800
2014-06-12 17:12:28 +00:00
Rafael Espindola
b1a4d3a26c Don't import error_code into the lld namespace.
llvm-svn: 210785
2014-06-12 14:53:47 +00:00
Rui Ueyama
e05d380486 Move Simple.h and Alias.h to include/Core.
Because the files in Core actually depend on these files.

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

llvm-svn: 210710
2014-06-11 21:47:51 +00:00
Rafael Espindola
7b8b9ae1cb Use std::error_code instead of llvm::error_code.
This is an update for a llvm api change.

llvm-svn: 210689
2014-06-11 19:05:58 +00:00
Rui Ueyama
0291dd2c8a Revert "[PECOFF] Support COMDAT associative sections."
This reverts accidental commit r210240.

llvm-svn: 210243
2014-06-05 07:40:59 +00:00
Rui Ueyama
f3cb9d1d57 [PECOFF] Support COMDAT associative sections.
COFF supports a feature similar to ELF's section groups. This
patch implements it.

In ELF, section groups are identified by their names, and they are
treated somewhat differently from regular symbols. In COFF, the
feature is realized in a more straightforward way. A section can
have an annotation saying "if Nth section is linked, link this
section too."

Implementing such feature is easy. We can add a reference from a
target atom to an original atom, so that if the target is linked,
the original atom is also linked. If not linked, both will be
dead-stripped. So they are treated as a group.

I added a new reference type, kindAssociate. It does nothing except
preventing referenced atoms from being dead-stripped.

No change to the Resolver is needed.

Reviewers: Bigcheese, shankarke, atanasyan

Subscribers: llvm-commits

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

llvm-svn: 210240
2014-06-05 07:37:20 +00:00
Rui Ueyama
eafa806b72 Improve error message.
Previously the parser always printed out an error message followed
by "Invalid file type" even if the file type is correct.

llvm-svn: 210093
2014-06-03 08:40:49 +00:00
Rui Ueyama
02162b9cfa Run clang-format.
llvm-svn: 210015
2014-06-02 11:13:11 +00:00
Rui Ueyama
d3159ce8d6 s/vector/std::vector/
llvm-svn: 210014
2014-06-02 10:58:47 +00:00
Rafael Espindola
63ed1a3519 Use error_code() instead of error_code::succes()
There is no std::error_code::success, so this removes much of the noise
in transitioning to std::error_code.

llvm-svn: 209948
2014-05-31 01:22:21 +00:00
Rui Ueyama
0e57b91f9c Use short identifier.
llvm-svn: 209497
2014-05-23 03:08:05 +00:00
Rui Ueyama
f713cced0e [PECOFF] Make a separate pass for /alternatename symbols.
/alternatename is a command line option to define a weak alias. You
can use it as /alternatename:foo=bar to define "foo" as a weak alias
for "bar".

Because it's a command line option, the weak alias mapping is in the
LinkingContext object, and not in a object file being read.

Previously, we looked up the mapping each time we read a new symbol
from a file, to check if there is a weak alias defined for the symbol.
That's not wrong, but had made function signature's a bit complicated --
we had to pass the mapping object to many functions. Now their
parameter lists are much cleaner.

This also has another (unrealized) benefit. parseFile() now read a
file and then add alias symbols to the file. In the first pass a
LinkingContext object is not used at all. That should make it easy
to read files from archive files speculatively, as the first pass
is free from side effect.

llvm-svn: 209486
2014-05-23 00:02:42 +00:00
Rui Ueyama
9f4674c828 [PECOFF] Check for a Characteristics field of a .debug section.
llvm-svn: 209317
2014-05-21 19:44:08 +00:00
Rui Ueyama
85a0321b15 [PECOFF] Discard .debug sections.
llvm-svn: 209274
2014-05-21 05:56:31 +00:00
Rui Ueyama
5c35c8c9ab [PECOFF] Make COFFObjectReader thread-safe.
llvm-svn: 209271
2014-05-21 04:17:05 +00:00
Rui Ueyama
7ad715d871 [PECOFF] Skip IMAGE_SYM_DEBUG sections correctly.
We don't use sections with IMAGE_SYM_DEBUG attribute so we basically
want to the symbols for them when reading symbol table. When we skip
them, we need to skip auxiliary symbols too. Otherwise weird error
would happen because aux symbols would be interpreted as regular ones.

llvm-svn: 206931
2014-04-22 23:48:42 +00:00
Chandler Carruth
9afe32d11d [Modules] Fix potential ODR violations by sinking the DEBUG_TYPE
definition below all of the header #include lines, LLD edition.

IF you want to know more details about this, you can see the recent
commits to Debug.h in LLVM. This is just the LLD segment of a cleanup
I'm doing globally for this macro.

llvm-svn: 206851
2014-04-22 03:21:31 +00:00
Rui Ueyama
20b075e526 [PECOFF] Fix common symbol alignment.
Differential Revision: http://reviews.llvm.org/D3322

llvm-svn: 205826
2014-04-09 01:01:51 +00:00
Rui Ueyama
7ad72ebc5e [PECOFF] Support yet another new type of weak symbol.
COMDAT_SELECT_LARGEST is a COMDAT type that make linker to choose the largest
definition from among all of the definition of a symbol. If the size is the
same, the choice is arbitrary.

Differential Revision: http://llvm-reviews.chandlerc.com/D3011

llvm-svn: 204172
2014-03-18 19:37:50 +00:00
Alexey Samsonov
67dc3e9538 Fix lld build
llvm-svn: 204122
2014-03-18 07:24:10 +00:00
Rui Ueyama
a7236598bb [PECOFF] Data type of SectionNumber is now unsigned (r203986).
So we don't need static_cast's to convert it from signed to unsigned.

llvm-svn: 203992
2014-03-15 00:39:12 +00:00
Rui Ueyama
74af50134b [PECOFF] Handle large objects having more than 32768 sections.
The COFF spec says that the SectionNumber field in the symbol table is 16 bit
signed type, but MSVC treats the field as if it is unsigned.

llvm-svn: 203901
2014-03-14 07:04:01 +00:00
Ahmed Charles
13c70b6d4b Replace OwningPtr with std::unique_ptr.
This results in some simplifications to the code where an OwningPtr had to
be used with the previous api and then ownership moved to a unique_ptr for
the rest of lld.

llvm-svn: 203809
2014-03-13 16:20:38 +00:00
Rui Ueyama
c83b4eb3a1 [PECOFF] Handle objects with unknown machine type header value.
An object whose machine type header value is unknown looks a bit odd but
is valid. If an object contains only machine-type-independent data, you
can leave the type field unspecified. Some files in oldname.lib are such
object files.

llvm-svn: 203752
2014-03-13 05:12:36 +00:00
Rui Ueyama
c79dd2f80a [PECOFF] Support a new type of weak symbol.
Summary:
COMDAT_SELECT_SAME_SIZE is a COMDAT type that I presume exist only in COFF.
The semantics of the type is that linker should merge such COMDAT sections if
their sizes are the same. Otherwise it's an error.

Reviewers: Bigcheese, shankarke, kledzik

CC: llvm-commits

Differential Revision: http://llvm-reviews.chandlerc.com/D2996

llvm-svn: 203308
2014-03-07 23:05:10 +00:00
Rui Ueyama
d6ad741e5e Add "override" to member functions where appropriate.
llvm-svn: 202998
2014-03-05 19:50:03 +00:00