1 //===- lib/Core/LinkingContext.cpp - Linker Context Object Interface ------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "lld/Core/LinkingContext.h" 10 #include "lld/Core/File.h" 11 #include "lld/Core/Node.h" 12 #include "lld/Core/Simple.h" 13 #include "lld/Core/Writer.h" 14 #include <algorithm> 15 16 namespace lld { 17 18 LinkingContext::LinkingContext() = default; 19 20 LinkingContext::~LinkingContext() = default; 21 validate()22bool LinkingContext::validate() { 23 return validateImpl(); 24 } 25 writeFile(const File & linkedFile) const26llvm::Error LinkingContext::writeFile(const File &linkedFile) const { 27 return this->writer().writeFile(linkedFile, _outputPath); 28 } 29 createEntrySymbolFile() const30std::unique_ptr<File> LinkingContext::createEntrySymbolFile() const { 31 return createEntrySymbolFile("<command line option -e>"); 32 } 33 34 std::unique_ptr<File> createEntrySymbolFile(StringRef filename) const35LinkingContext::createEntrySymbolFile(StringRef filename) const { 36 if (entrySymbolName().empty()) 37 return nullptr; 38 std::unique_ptr<SimpleFile> entryFile(new SimpleFile(filename, 39 File::kindEntryObject)); 40 entryFile->addAtom( 41 *(new (_allocator) SimpleUndefinedAtom(*entryFile, entrySymbolName()))); 42 return std::move(entryFile); 43 } 44 createUndefinedSymbolFile() const45std::unique_ptr<File> LinkingContext::createUndefinedSymbolFile() const { 46 return createUndefinedSymbolFile("<command line option -u or --defsym>"); 47 } 48 49 std::unique_ptr<File> createUndefinedSymbolFile(StringRef filename) const50LinkingContext::createUndefinedSymbolFile(StringRef filename) const { 51 if (_initialUndefinedSymbols.empty()) 52 return nullptr; 53 std::unique_ptr<SimpleFile> undefinedSymFile( 54 new SimpleFile(filename, File::kindUndefinedSymsObject)); 55 for (StringRef undefSym : _initialUndefinedSymbols) 56 undefinedSymFile->addAtom(*(new (_allocator) SimpleUndefinedAtom( 57 *undefinedSymFile, undefSym))); 58 return std::move(undefinedSymFile); 59 } 60 createInternalFiles(std::vector<std::unique_ptr<File>> & result) const61void LinkingContext::createInternalFiles( 62 std::vector<std::unique_ptr<File>> &result) const { 63 if (std::unique_ptr<File> file = createEntrySymbolFile()) 64 result.push_back(std::move(file)); 65 if (std::unique_ptr<File> file = createUndefinedSymbolFile()) 66 result.push_back(std::move(file)); 67 } 68 69 } // end namespace lld 70