1 //===- lib/Core/LinkingContext.cpp - Linker Context Object Interface ------===// 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 10 #include "lld/Core/LinkingContext.h" 11 #include "lld/Core/File.h" 12 #include "lld/Core/Node.h" 13 #include "lld/Core/Simple.h" 14 #include "lld/Core/Writer.h" 15 #include <algorithm> 16 17 namespace lld { 18 19 LinkingContext::LinkingContext() = default; 20 21 LinkingContext::~LinkingContext() = default; 22 validate()23bool LinkingContext::validate() { 24 return validateImpl(); 25 } 26 writeFile(const File & linkedFile) const27llvm::Error LinkingContext::writeFile(const File &linkedFile) const { 28 return this->writer().writeFile(linkedFile, _outputPath); 29 } 30 createEntrySymbolFile() const31std::unique_ptr<File> LinkingContext::createEntrySymbolFile() const { 32 return createEntrySymbolFile("<command line option -e>"); 33 } 34 35 std::unique_ptr<File> createEntrySymbolFile(StringRef filename) const36LinkingContext::createEntrySymbolFile(StringRef filename) const { 37 if (entrySymbolName().empty()) 38 return nullptr; 39 std::unique_ptr<SimpleFile> entryFile(new SimpleFile(filename, 40 File::kindEntryObject)); 41 entryFile->addAtom( 42 *(new (_allocator) SimpleUndefinedAtom(*entryFile, entrySymbolName()))); 43 return std::move(entryFile); 44 } 45 createUndefinedSymbolFile() const46std::unique_ptr<File> LinkingContext::createUndefinedSymbolFile() const { 47 return createUndefinedSymbolFile("<command line option -u or --defsym>"); 48 } 49 50 std::unique_ptr<File> createUndefinedSymbolFile(StringRef filename) const51LinkingContext::createUndefinedSymbolFile(StringRef filename) const { 52 if (_initialUndefinedSymbols.empty()) 53 return nullptr; 54 std::unique_ptr<SimpleFile> undefinedSymFile( 55 new SimpleFile(filename, File::kindUndefinedSymsObject)); 56 for (StringRef undefSym : _initialUndefinedSymbols) 57 undefinedSymFile->addAtom(*(new (_allocator) SimpleUndefinedAtom( 58 *undefinedSymFile, undefSym))); 59 return std::move(undefinedSymFile); 60 } 61 createInternalFiles(std::vector<std::unique_ptr<File>> & result) const62void LinkingContext::createInternalFiles( 63 std::vector<std::unique_ptr<File>> &result) const { 64 if (std::unique_ptr<File> file = createEntrySymbolFile()) 65 result.push_back(std::move(file)); 66 if (std::unique_ptr<File> file = createUndefinedSymbolFile()) 67 result.push_back(std::move(file)); 68 } 69 70 } // end namespace lld 71