| Rui Ueyama | 0ca149f | 2013-08-06 22:31:59 +0000 | [diff] [blame] | 1 | //===- lib/Core/LinkingContext.cpp - Linker Context Object Interface ------===// | 
| Michael J. Spencer | d68d619 | 2013-01-22 02:15:30 +0000 | [diff] [blame] | 2 | // | 
|  | 3 | //                             The LLVM Linker | 
|  | 4 | // | 
|  | 5 | // This file is distributed under the University of Illinois Open Source | 
|  | 6 | // License. See LICENSE.TXT for details. | 
|  | 7 | // | 
|  | 8 | //===----------------------------------------------------------------------===// | 
|  | 9 |  | 
| Rui Ueyama | 0ca149f | 2013-08-06 22:31:59 +0000 | [diff] [blame] | 10 | #include "lld/Core/LinkingContext.h" | 
| Shankar Easwaran | d26c8e3 | 2013-08-31 05:27:38 +0000 | [diff] [blame] | 11 | #include "lld/Core/InputFiles.h" | 
| Nick Kledzik | c314b46 | 2013-04-04 18:59:24 +0000 | [diff] [blame] | 12 | #include "lld/ReaderWriter/Writer.h" | 
| Shankar Easwaran | d26c8e3 | 2013-08-31 05:27:38 +0000 | [diff] [blame] | 13 | #include "lld/ReaderWriter/Simple.h" | 
| Michael J. Spencer | d68d619 | 2013-01-22 02:15:30 +0000 | [diff] [blame] | 14 |  | 
|  | 15 | #include "llvm/ADT/Triple.h" | 
|  | 16 |  | 
|  | 17 | namespace lld { | 
| Nick Kledzik | c314b46 | 2013-04-04 18:59:24 +0000 | [diff] [blame] | 18 |  | 
| Rui Ueyama | 0ca149f | 2013-08-06 22:31:59 +0000 | [diff] [blame] | 19 | LinkingContext::LinkingContext() | 
| Shankar Easwaran | eeee23e | 2013-04-11 02:56:30 +0000 | [diff] [blame] | 20 | : Reader(*this), _deadStrip(false), _globalsAreDeadStripRoots(false), | 
|  | 21 | _searchArchivesToOverrideTentativeDefinitions(false), | 
|  | 22 | _searchSharedLibrariesToOverrideTentativeDefinitions(false), | 
|  | 23 | _warnIfCoalesableAtomsHaveDifferentCanBeNull(false), | 
|  | 24 | _warnIfCoalesableAtomsHaveDifferentLoadName(false), | 
| Joerg Sonnenberger | bd25241 | 2013-09-08 13:30:14 +0000 | [diff] [blame^] | 25 | _printRemainingUndefines(true), | 
| Shankar Easwaran | eeee23e | 2013-04-11 02:56:30 +0000 | [diff] [blame] | 26 | _allowRemainingUndefines(false), _logInputFiles(false), | 
|  | 27 | _allowShlibUndefines(false) {} | 
| Nick Kledzik | c314b46 | 2013-04-04 18:59:24 +0000 | [diff] [blame] | 28 |  | 
| Rui Ueyama | 0ca149f | 2013-08-06 22:31:59 +0000 | [diff] [blame] | 29 | LinkingContext::~LinkingContext() {} | 
| Michael J. Spencer | d68d619 | 2013-01-22 02:15:30 +0000 | [diff] [blame] | 30 |  | 
| Rui Ueyama | 0ca149f | 2013-08-06 22:31:59 +0000 | [diff] [blame] | 31 | bool LinkingContext::validate(raw_ostream &diagnostics) { | 
| Rafael Espindola | c1b3268 | 2013-06-11 12:36:05 +0000 | [diff] [blame] | 32 | _yamlReader = createReaderYAML(*this); | 
|  | 33 | return validateImpl(diagnostics); | 
|  | 34 | } | 
|  | 35 |  | 
| Rui Ueyama | 0ca149f | 2013-08-06 22:31:59 +0000 | [diff] [blame] | 36 | error_code LinkingContext::writeFile(const File &linkedFile) const { | 
|  | 37 | return this->writer().writeFile(linkedFile, _outputPath); | 
| Michael J. Spencer | d68d619 | 2013-01-22 02:15:30 +0000 | [diff] [blame] | 38 | } | 
|  | 39 |  | 
| Rui Ueyama | 0ca149f | 2013-08-06 22:31:59 +0000 | [diff] [blame] | 40 | void LinkingContext::addImplicitFiles(InputFiles &inputs) const { | 
|  | 41 | this->writer().addFiles(inputs); | 
| Michael J. Spencer | d68d619 | 2013-01-22 02:15:30 +0000 | [diff] [blame] | 42 | } | 
|  | 43 |  | 
| Shankar Easwaran | d26c8e3 | 2013-08-31 05:27:38 +0000 | [diff] [blame] | 44 | std::unique_ptr<File> LinkingContext::createEntrySymbolFile() { | 
|  | 45 | if (entrySymbolName().empty()) | 
|  | 46 | return nullptr; | 
|  | 47 | std::unique_ptr<SimpleFile> entryFile( | 
|  | 48 | new SimpleFile(*this, "command line option -entry")); | 
|  | 49 | entryFile->addAtom( | 
|  | 50 | *(new (_allocator) SimpleUndefinedAtom(*entryFile, entrySymbolName()))); | 
|  | 51 | return std::move(entryFile); | 
|  | 52 | } | 
|  | 53 |  | 
|  | 54 | std::unique_ptr<File> LinkingContext::createUndefinedSymbolFile() { | 
|  | 55 | if (_initialUndefinedSymbols.empty()) | 
|  | 56 | return nullptr; | 
|  | 57 | std::unique_ptr<SimpleFile> undefinedSymFile( | 
|  | 58 | new SimpleFile(*this, "command line option -u")); | 
|  | 59 | for (auto undefSymStr : _initialUndefinedSymbols) | 
|  | 60 | undefinedSymFile->addAtom(*(new (_allocator) SimpleUndefinedAtom( | 
|  | 61 | *undefinedSymFile, undefSymStr))); | 
|  | 62 | return std::move(undefinedSymFile); | 
|  | 63 | } | 
|  | 64 |  | 
|  | 65 | std::vector<std::unique_ptr<File> > LinkingContext::createInternalFiles() { | 
|  | 66 | std::vector<std::unique_ptr<File> > result; | 
|  | 67 | std::unique_ptr<File> internalFile; | 
|  | 68 | internalFile = createEntrySymbolFile(); | 
|  | 69 | if (internalFile) | 
|  | 70 | result.push_back(std::move(internalFile)); | 
|  | 71 | internalFile = createUndefinedSymbolFile(); | 
|  | 72 | if (internalFile) | 
|  | 73 | result.push_back(std::move(internalFile)); | 
|  | 74 | return result; | 
|  | 75 | } | 
|  | 76 |  | 
| Rui Ueyama | 0ca149f | 2013-08-06 22:31:59 +0000 | [diff] [blame] | 77 | void LinkingContext::addPasses(PassManager &pm) const {} | 
| Nick Kledzik | c314b46 | 2013-04-04 18:59:24 +0000 | [diff] [blame] | 78 |  | 
| Michael J. Spencer | d68d619 | 2013-01-22 02:15:30 +0000 | [diff] [blame] | 79 | } // end namespace lld |