Commit Graph

3397 Commits

Author SHA1 Message Date
Rui Ueyama 617f5ccb5c COFF: Separate DefinedCOMDAT from DefinedRegular symbol type. NFC.
Before this change, you got to cast a symbol to DefinedRegular and then
call isCOMDAT() to determine if a given symbol is a COMDAT symbol.
Now you can just use isa<DefinedCOMDAT>().

As to the class definition of DefinedCOMDAT, I could remove duplicate
code from DefinedRegular and DefinedCOMDAT by introducing another base
class for them, but I chose to not do that to keep the class hierarchy
shallow. This amount of code duplication doesn't worth to define a new
class.

llvm-svn: 240319
2015-06-22 19:56:01 +00:00
Rui Ueyama 610962061f Fix typo.
llvm-svn: 240298
2015-06-22 17:26:27 +00:00
Simon Atanasyan 356d7c52b6 [Mips] Support R_MICROMIPS_HI0_LO16 relocation handling
llvm-svn: 240268
2015-06-22 09:27:05 +00:00
Simon Atanasyan f44f854af3 [Mips] Support R_MICROMIPS_LITERAL relocation handling
llvm-svn: 240267
2015-06-22 09:26:57 +00:00
Simon Atanasyan 692e792575 [Mips] Support R_MIPS_LITERAL relocation handling
llvm-svn: 240266
2015-06-22 09:26:48 +00:00
Simon Atanasyan ca0fe2f4a4 [Mips] Support R_MICROMIPS_SUB relocation handling
llvm-svn: 240265
2015-06-22 09:26:41 +00:00
Simon Atanasyan 1af72b898c [Mips] Reject R_MIPS_GPREL32 against external symbols
llvm-svn: 240264
2015-06-22 09:26:33 +00:00
Simon Atanasyan 74a07c5457 [Mips] Fix test case - do not use R_MIPS_GPREL32 against external symbols
No functional changes.

llvm-svn: 240263
2015-06-22 09:26:25 +00:00
Simon Atanasyan b5d26b1433 [Mips] Reject position-dependent relocations in case of shared library linking
llvm-svn: 240262
2015-06-22 09:26:20 +00:00
Simon Atanasyan 7851f3b111 [Mips] Fix test case - do not use R_MIPS_HI16 for shared library linking
No functional changes.

llvm-svn: 240261
2015-06-22 09:26:12 +00:00
Simon Atanasyan 46d97f246b [Mips] Support R_MICROMIPS_HIGHER / R_MICROMIPS_HIGHEST relocations handling
llvm-svn: 240260
2015-06-22 09:26:05 +00:00
Simon Atanasyan e55110454d [Mips] Support R_MIPS_HIGHER / R_MIPS_HIGHEST relocations handling
llvm-svn: 240259
2015-06-22 09:25:57 +00:00
Rui Ueyama a77336bd5d COFF: Support delay-load import tables.
DLLs are usually resolved at process startup, but you can
delay-load them by passing /delayload option to the linker.

If a /delayload is specified, the linker has to create data
which is similar to regular import table.
One notable difference is that the pointers in a delay-load
import table are originally pointing to thunks that resolves
themselves. Each thunk loads a DLL, resolve its name, and then
overwrites the pointer with the result so that subsequent
function calls directly call a desired function. The linker
has to emit thunks.

llvm-svn: 240250
2015-06-21 22:31:52 +00:00
David Blaikie b2b1c7c3e1 ArrayRef-ify Driver::parse and related functions.
llvm-svn: 240236
2015-06-21 06:32:10 +00:00
David Blaikie 8da889f1a5 ArrayRef-ify ParseArgs
llvm-svn: 240235
2015-06-21 06:32:04 +00:00
Rui Ueyama 1a109285c2 COFF: Use short varaible name. NFC.
llvm-svn: 240232
2015-06-21 04:10:54 +00:00
Rui Ueyama 4d769c3a57 COFF: Support exception table.
.pdata section contains a list of triplets of function start address,
function end address and its unwind information. Linkers have to
sort section contents by function start address and set the section
address to the file header (so that runtime is able to find it and
do binary search.)

This change seems to resolve all but one remaining test failures in
check{,-clang,-lld} when building the entire stuff with clang-cl and
lld-link.

llvm-svn: 240231
2015-06-21 04:00:54 +00:00
Rui Ueyama e3a335076a COFF: Combine add{Object,Archive,Bitcode,Import} functions. NFC.
llvm-svn: 240229
2015-06-20 23:10:05 +00:00
Rui Ueyama 5e31d0b2e9 COFF: Fix common symbol alignment.
llvm-svn: 240217
2015-06-20 07:25:45 +00:00
Rui Ueyama efb7e1aa29 COFF: Fix a common symbol bug.
This is a case that one mistake caused a very mysterious bug.
I made a mistake to calculate addresses of common symbols, so
each common symbol pointed not to the beginning of its location
but to the end of its location. (Ouch!)

Common symbols are aligned on 16 byte boundaries. If a common
symbol is small enough to fit between the end of its real
location and whatever comes next, this bug didn't cause any harm.

However, if a common symbol is larger than that, its memory
naturally overlapped with other symbols. That means some
uninitialized variables accidentally shared memory. Because
totally unrelated memory writes mutated other varaibles, it was
hard to debug.

It's surprising that LLD was able to link itself and all LLD
tests except gunit tests passed with this nasty bug.

With this fix, the new COFF linker is able to pass all tests
for LLVM, Clang and LLD if I use MSVC cl.exe as a compiler.
Only three tests are failing when used with clang-cl.

llvm-svn: 240216
2015-06-20 07:21:57 +00:00
Peter Collingbourne 74ecc89c46 COFF: Take reference to argument vector using std::vector::data() instead of operator[](0).
This avoids undefined behaviour caused by an out-of-range access if the
vector is empty, which can happen if an object file's directive section
contains only whitespace.

llvm-svn: 240183
2015-06-19 22:40:05 +00:00
Rui Ueyama f00df0af2d COFF: Fix precedence between LIB and /libpath.
/libpath should take precedence over LIB.
Previously, LIB took precedence over /libpath.

llvm-svn: 240182
2015-06-19 22:39:48 +00:00
Rui Ueyama 165b254e06 COFF: Add search paths in the correct order.
Previously, we added search paths in reverse order.

llvm-svn: 240180
2015-06-19 21:44:32 +00:00
Rui Ueyama 29792a82a9 COFF: Cache Archive::Symbol::getName(). NFC.
getName() does strlen() on the symbol table, so it's not very fast.
It's not as bad as r239332 because the number of symbols exported
from archive files are fewer than object files, and they are usually
shorter, though.

llvm-svn: 240178
2015-06-19 21:25:44 +00:00
Rui Ueyama 573bf7de9c COFF: Continue reading object files until converge.
In this linker model, adding an undefined symbol may trigger chain
reactions. It may trigger a Lazy symbol to read a new file.
A new file may contain a directive section, which may contain various
command line options.

Previously, we didn't handle chain reactions well. We visited /include'd
symbols only once, so newly-added /include symbols were ignored.
This patch fixes that bug.

Now, the symbol table is versioned; every time the symbol table is
updated, the version number is incremented. We repeat adding undefined
symbols until the version number does not change. It is guaranteed to
converge -- the number of undefined symbol in the system is finite,
and adding the same undefined symbol more than once is basically no-op.

llvm-svn: 240177
2015-06-19 21:12:48 +00:00
David Blaikie dccc8e2cc1 Fix no-asserts build failure due to unused variable, and cleanup some unique_ptr usage while I'm here
llvm-svn: 240169
2015-06-19 19:55:25 +00:00
David Blaikie 25ddcb4c27 Simplify Pass::perform to take a SimpleFile& instead of unique_ptr<SimpleFile>&
None of the implementations replace the SimpleFile with some other file,
they just modify the SimpleFile in-place, so a direct reference to the
file is sufficient.

llvm-svn: 240167
2015-06-19 19:43:43 +00:00
Rui Ueyama 4d2834bd7b COFF: Don't add new undefined symbols for /alternatename.
Alternatename option is in the form of /alternatename:<from>=<to>.
It's effect is to resolve <from> as <to> if <from> is still undefined
at end of name resolution.

If <from> is not undefined but completely a new symbol, alternatename
shouldn't do anything. Previously, it introduced a new undefined
symbol for <from>, which resulted in undefined symbol error.

llvm-svn: 240161
2015-06-19 19:23:43 +00:00
Lang Hames b09c2c6edb [lld] Allow LLD passes to return error codes.
llvm-svn: 240147
2015-06-19 17:51:46 +00:00
Rui Ueyama ce86c9962c COFF: Add /nodefaultlib and /merge for .drectve.
llvm-svn: 240077
2015-06-18 23:22:39 +00:00
Rui Ueyama 08d5e1875f COFF: Handle /include in .drectve.
We don't want to insert a new symbol to the symbol table while reading
a .drectve section because it's going to be too complicated.
That we are reading a directive section means that we are currently
reading some object file. Adding a new undefined symbol to the symbol
table can trigger a library file to read a new file, so it would make
the call stack too deep.

In this patch, I add new symbol names to a list to resolve them later.

llvm-svn: 240076
2015-06-18 23:20:11 +00:00
Rui Ueyama e8d56b5258 COFF: Allow identical alternatename options.
Alternatename option is in the form of /alternatename:<from>=<to>.
It is an error if there are two options having the same <from> but
different <to>. It is *not* an error if both are the same.

llvm-svn: 240075
2015-06-18 23:04:26 +00:00
Rui Ueyama 562daa8148 COFF: Unknown options in .drectve section is an error.
We skip unknown options in the command line with a warning message
being printed out, but we shouldn't do that for .drectve section.
The section is not visible to the user. We should handle unknown
options as an error.

llvm-svn: 240067
2015-06-18 21:50:38 +00:00
Rui Ueyama 75b098b29d COFF: Handle /failifmismatch in the same manner as other options.
No functionality change intended.

llvm-svn: 240061
2015-06-18 21:23:34 +00:00
Rui Ueyama 223fe1b9e7 COFF: Fix unsafe memory access.
llvm-svn: 240046
2015-06-18 20:29:41 +00:00
Rui Ueyama b95188cb2c COFF: Add /implib option.
llvm-svn: 240045
2015-06-18 20:27:09 +00:00
Rui Ueyama ea63a28364 COFF: Handle both / and \ as path separator.
llvm-svn: 240042
2015-06-18 20:16:26 +00:00
Rui Ueyama 2edb35a264 COFF: Handle /alternatename in .drectve section.
llvm-svn: 240037
2015-06-18 19:09:30 +00:00
Rui Ueyama 23ed96d95f COFF: Rename a function. NFC.
llvm-svn: 240031
2015-06-18 17:29:50 +00:00
Peter Collingbourne 8b2492f2a0 COFF: Implement DLL symbol exports for bitcode files.
Differential Revision: http://reviews.llvm.org/D10530

llvm-svn: 239994
2015-06-18 05:22:15 +00:00
Rui Ueyama ae36985af7 COFF: Fix entry point inference bug.
Previously, LLD couldn't find a default entry point if it's
defined by a library.

llvm-svn: 239982
2015-06-18 00:40:33 +00:00
Rui Ueyama 24c5fd0419 COFF: Support /manifest{,uac,dependency,file} options.
The linker has to create an XML file for each executable.
This patch supports that feature.

You can optionally embed an XML file to an executable as .rsrc
section. If you choose to do that (by passing /manifest:embed
option), the linker has to create a textual resource file
containing an XML file, compile that using rc.exe to a binary
resource file, conver that resource file to a COFF file using
cvtres.exe, and then link that COFF file. This patch implements
that feature too.

llvm-svn: 239978
2015-06-18 00:12:42 +00:00
Simon Atanasyan faf558224d [Mips] Use new llvm-readobj -mips-reginfo flag to check .reginfo content
No functional changes.

llvm-svn: 239962
2015-06-17 22:28:38 +00:00
Simon Atanasyan 13cda3edf6 [Mips] Write inline some more relocation calculations
No functional changes.

llvm-svn: 239961
2015-06-17 22:28:16 +00:00
Simon Atanasyan f8b082a6aa [Mips] Support R_MICROMIPS_GPREL16 / R_MICROMIPS_GPREL7_S2 relocations handling
llvm-svn: 239960
2015-06-17 22:27:54 +00:00
Simon Atanasyan 17478c5804 [Mips] Support R_MIPS_16 relocation handling
llvm-svn: 239959
2015-06-17 22:27:39 +00:00
Simon Atanasyan 6f1e05f388 [Mips] Do not use functions to calculate trivial relocations
No functional changes.

llvm-svn: 239957
2015-06-17 22:27:27 +00:00
Davide Italiano 6cac62797f [ELF] Now that there's an API for ELF symbol types in LLVM, use it.
Common symbols will be handled in a separate patch because it seems
Hexagon redefines the notion of common symbol, which I'm not (yet)
very familiar with.

llvm-svn: 239951
2015-06-17 21:50:51 +00:00
Rui Ueyama a9c8838f69 COFF: Simplify. NFC.
Executor is a convenience class to run an external command.

llvm-svn: 239945
2015-06-17 21:01:56 +00:00
Rui Ueyama 151d862d97 COFF: Create import library files.
On Windows, we have to create a .lib file for each .dll.
When linking against DLLs, the linker doesn't use the DLL files,
but instead read a list of dllexported symbols from corresponding
lib files.

A library file containing descriptors of a DLL is called an
import library file.

lib.exe has a feature to create an import library file from a
module-definition file. In this patch, we create a module-definition
file and pass that to lib.exe.

We eventually want to create an import library file by ourselves
to eliminate dependency to lib.exe. For now, we just use the MSVC
tool.

llvm-svn: 239937
2015-06-17 20:40:43 +00:00