summaryrefslogtreecommitdiff
path: root/lib/ReaderWriter/ELF/ELFLinkingContext.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ReaderWriter/ELF/ELFLinkingContext.cpp')
-rw-r--r--lib/ReaderWriter/ELF/ELFLinkingContext.cpp263
1 files changed, 0 insertions, 263 deletions
diff --git a/lib/ReaderWriter/ELF/ELFLinkingContext.cpp b/lib/ReaderWriter/ELF/ELFLinkingContext.cpp
deleted file mode 100644
index 70d6d618207d..000000000000
--- a/lib/ReaderWriter/ELF/ELFLinkingContext.cpp
+++ /dev/null
@@ -1,263 +0,0 @@
-//===- lib/ReaderWriter/ELF/ELFLinkingContext.cpp -------------------------===//
-//
-// The LLVM Linker
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "lld/ReaderWriter/ELFLinkingContext.h"
-#include "ELFFile.h"
-#include "OrderPass.h"
-#include "TargetHandler.h"
-#include "lld/Core/Instrumentation.h"
-#include "lld/Core/SharedLibraryFile.h"
-#include "llvm/ADT/STLExtras.h"
-#include "llvm/ADT/Triple.h"
-#include "llvm/Config/config.h"
-#include "llvm/Support/ELF.h"
-#include "llvm/Support/Errc.h"
-#include "llvm/Support/FileSystem.h"
-#include "llvm/Support/Path.h"
-
-#if defined(HAVE_CXXABI_H)
-#include <cxxabi.h>
-#endif
-
-using llvm::sys::fs::exists;
-using llvm::sys::path::is_absolute;
-
-namespace lld {
-
-class CommandLineUndefinedAtom : public SimpleUndefinedAtom {
-public:
- CommandLineUndefinedAtom(const File &f, StringRef name)
- : SimpleUndefinedAtom(f, name) {}
-
- CanBeNull canBeNull() const override {
- return CanBeNull::canBeNullAtBuildtime;
- }
-};
-
-void ELFLinkingContext::addPasses(PassManager &pm) {
- pm.add(llvm::make_unique<elf::OrderPass>());
-}
-
-uint16_t ELFLinkingContext::getOutputMachine() const {
- switch (getTriple().getArch()) {
- case llvm::Triple::x86:
- return llvm::ELF::EM_386;
- case llvm::Triple::x86_64:
- return llvm::ELF::EM_X86_64;
- case llvm::Triple::hexagon:
- return llvm::ELF::EM_HEXAGON;
- case llvm::Triple::mips:
- case llvm::Triple::mipsel:
- case llvm::Triple::mips64:
- case llvm::Triple::mips64el:
- return llvm::ELF::EM_MIPS;
- case llvm::Triple::aarch64:
- return llvm::ELF::EM_AARCH64;
- case llvm::Triple::arm:
- return llvm::ELF::EM_ARM;
- default:
- llvm_unreachable("Unhandled arch");
- }
-}
-
-StringRef ELFLinkingContext::entrySymbolName() const {
- if (_outputELFType == llvm::ELF::ET_EXEC && _entrySymbolName.empty())
- return "_start";
- return _entrySymbolName;
-}
-
-bool ELFLinkingContext::validateImpl(raw_ostream &diagnostics) {
- switch (outputFileType()) {
- case LinkingContext::OutputFileType::YAML:
- _writer = createWriterYAML(*this);
- break;
- default:
- _writer = createWriterELF(*this);
- break;
- }
-
- // If -dead_strip, set up initial live symbols.
- if (deadStrip())
- addDeadStripRoot(entrySymbolName());
- return true;
-}
-
-bool ELFLinkingContext::isDynamic() const {
- switch (_outputELFType) {
- case llvm::ELF::ET_EXEC:
- return !_isStaticExecutable;
- case llvm::ELF::ET_DYN:
- return true;
- }
- return false;
-}
-
-bool ELFLinkingContext::isRelativeReloc(const Reference &) const {
- return false;
-}
-
-Writer &ELFLinkingContext::writer() const { return *_writer; }
-
-static void buildSearchPath(SmallString<128> &path, StringRef dir,
- StringRef sysRoot) {
- if (dir.startswith("=/")) {
- // If a search directory begins with "=", "=" is replaced
- // with the sysroot path.
- path.assign(sysRoot);
- path.append(dir.substr(1));
- } else {
- path.assign(dir);
- }
-}
-
-ErrorOr<StringRef> ELFLinkingContext::searchLibrary(StringRef libName) const {
- bool hasColonPrefix = libName[0] == ':';
- SmallString<128> path;
- for (StringRef dir : _inputSearchPaths) {
- // Search for dynamic library
- if (!_isStaticExecutable) {
- buildSearchPath(path, dir, _sysrootPath);
- llvm::sys::path::append(path, hasColonPrefix
- ? libName.drop_front()
- : Twine("lib", libName) + ".so");
- if (exists(path.str()))
- return path.str().copy(_allocator);
- }
- // Search for static libraries too
- buildSearchPath(path, dir, _sysrootPath);
- llvm::sys::path::append(path, hasColonPrefix
- ? libName.drop_front()
- : Twine("lib", libName) + ".a");
- if (exists(path.str()))
- return path.str().copy(_allocator);
- }
- if (hasColonPrefix && exists(libName.drop_front()))
- return libName.drop_front();
-
- return make_error_code(llvm::errc::no_such_file_or_directory);
-}
-
-ErrorOr<StringRef> ELFLinkingContext::searchFile(StringRef fileName,
- bool isSysRooted) const {
- SmallString<128> path;
- if (is_absolute(fileName) && isSysRooted) {
- path.assign(_sysrootPath);
- path.append(fileName);
- if (exists(path.str()))
- return path.str().copy(_allocator);
- } else if (exists(fileName)) {
- return fileName;
- }
-
- if (is_absolute(fileName))
- return make_error_code(llvm::errc::no_such_file_or_directory);
-
- for (StringRef dir : _inputSearchPaths) {
- buildSearchPath(path, dir, _sysrootPath);
- llvm::sys::path::append(path, fileName);
- if (exists(path.str()))
- return path.str().copy(_allocator);
- }
- return make_error_code(llvm::errc::no_such_file_or_directory);
-}
-
-void ELFLinkingContext::createInternalFiles(
- std::vector<std::unique_ptr<File>> &files) const {
- std::unique_ptr<SimpleFile> file(
- new SimpleFile("<internal file for --defsym>"));
- for (auto &i : getAbsoluteSymbols()) {
- StringRef sym = i.first;
- uint64_t val = i.second;
- file->addAtom(*(new (_allocator) SimpleAbsoluteAtom(
- *file, sym, Atom::scopeGlobal, val)));
- }
- files.push_back(std::move(file));
- LinkingContext::createInternalFiles(files);
-}
-
-void ELFLinkingContext::finalizeInputFiles() {
- // Add virtual archive that resolves undefined symbols.
- if (_resolver)
- getNodes().push_back(llvm::make_unique<FileNode>(std::move(_resolver)));
-}
-
-std::unique_ptr<File> ELFLinkingContext::createUndefinedSymbolFile() const {
- if (_initialUndefinedSymbols.empty())
- return nullptr;
- std::unique_ptr<SimpleFile> undefinedSymFile(
- new SimpleFile("command line option -u"));
- for (auto undefSymStr : _initialUndefinedSymbols)
- undefinedSymFile->addAtom(*(new (_allocator) CommandLineUndefinedAtom(
- *undefinedSymFile, undefSymStr)));
- return std::move(undefinedSymFile);
-}
-
-void ELFLinkingContext::notifySymbolTableCoalesce(const Atom *existingAtom,
- const Atom *newAtom,
- bool &useNew) {
- // First suppose that the `existingAtom` is defined
- // and the `newAtom` is undefined.
- auto *da = dyn_cast<DefinedAtom>(existingAtom);
- auto *ua = dyn_cast<UndefinedAtom>(newAtom);
- if (!da && !ua) {
- // Then try to reverse the assumption.
- da = dyn_cast<DefinedAtom>(newAtom);
- ua = dyn_cast<UndefinedAtom>(existingAtom);
- }
-
- if (da && ua && da->scope() == Atom::scopeGlobal &&
- isa<SharedLibraryFile>(ua->file()))
- // If strong defined atom coalesces away an atom declared
- // in the shared object the strong atom needs to be dynamically exported.
- // Save its name.
- _dynamicallyExportedSymbols.insert(ua->name());
-}
-
-std::string ELFLinkingContext::demangle(StringRef symbolName) const {
-#if defined(HAVE_CXXABI_H)
- if (!demangleSymbols())
- return symbolName;
-
- // Only try to demangle symbols that look like C++ symbols
- if (!symbolName.startswith("_Z"))
- return symbolName;
-
- SmallString<256> symBuff;
- StringRef nullTermSym = Twine(symbolName).toNullTerminatedStringRef(symBuff);
- const char *cstr = nullTermSym.data();
- int status;
- char *demangled = abi::__cxa_demangle(cstr, nullptr, nullptr, &status);
- if (!demangled)
- return symbolName;
- std::string result(demangled);
- // __cxa_demangle() always uses a malloc'ed buffer to return the result.
- free(demangled);
- return result;
-#else
- return symbolName;
-#endif
-}
-
-void ELFLinkingContext::setUndefinesResolver(std::unique_ptr<File> resolver) {
- assert(isa<ArchiveLibraryFile>(resolver.get()) && "Wrong resolver type");
- _resolver = std::move(resolver);
-}
-
-void ELFLinkingContext::notifyInputSectionName(StringRef name) {
- // Save sections names which can be represented as a C identifier.
- if (name.find_first_not_of("0123456789"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- "abcdefghijklmnopqrstuvwxyz"
- "_") == StringRef::npos) {
- std::lock_guard<std::mutex> lock(_cidentMutex);
- _cidentSections.insert(name);
- }
-}
-
-} // end namespace lld