Path: blob/main/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/LinkGraphLayer.cpp
213799 views
//===----- LinkGraphLayer.cpp - Add LinkGraphs to an ExecutionSession -----===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "llvm/ExecutionEngine/Orc/LinkGraphLayer.h"910#include "llvm/ExecutionEngine/JITLink/JITLink.h"11#include "llvm/ExecutionEngine/Orc/Shared/MachOObjectFormat.h"12#include "llvm/ExecutionEngine/Orc/Shared/ObjectFormats.h"1314#define DEBUG_TYPE "orc"1516using namespace llvm;17using namespace llvm::jitlink;18using namespace llvm::orc;1920namespace {2122bool hasInitializerSection(LinkGraph &G) {23bool IsMachO = G.getTargetTriple().isOSBinFormatMachO();24bool IsElf = G.getTargetTriple().isOSBinFormatELF();25if (!IsMachO && !IsElf)26return false;2728for (auto &Sec : G.sections()) {29if (IsMachO && isMachOInitializerSection(Sec.getName()))30return true;31if (IsElf && isELFInitializerSection(Sec.getName()))32return true;33}3435return false;36}3738} // end anonymous namespace3940namespace llvm::orc {4142LinkGraphLayer::~LinkGraphLayer() = default;4344MaterializationUnit::Interface LinkGraphLayer::getInterface(LinkGraph &G) {4546MaterializationUnit::Interface LGI;4748auto AddSymbol = [&](Symbol *Sym) {49// Skip local symbols.50if (Sym->getScope() == Scope::Local)51return;52assert(Sym->hasName() && "Anonymous non-local symbol?");5354LGI.SymbolFlags[Sym->getName()] = getJITSymbolFlagsForSymbol(*Sym);55};5657for (auto *Sym : G.defined_symbols())58AddSymbol(Sym);59for (auto *Sym : G.absolute_symbols())60AddSymbol(Sym);6162if (hasInitializerSection(G)) {63std::string InitSymString;64{65raw_string_ostream(InitSymString)66<< "$." << G.getName() << ".__inits" << Counter++;67}68LGI.InitSymbol = ES.intern(InitSymString);69}7071return LGI;72}7374JITSymbolFlags LinkGraphLayer::getJITSymbolFlagsForSymbol(Symbol &Sym) {75JITSymbolFlags Flags;7677if (Sym.getLinkage() == Linkage::Weak)78Flags |= JITSymbolFlags::Weak;7980if (Sym.getScope() == Scope::Default)81Flags |= JITSymbolFlags::Exported;82else if (Sym.getScope() == Scope::SideEffectsOnly)83Flags |= JITSymbolFlags::MaterializationSideEffectsOnly;8485if (Sym.isCallable())86Flags |= JITSymbolFlags::Callable;8788return Flags;89}9091StringRef LinkGraphMaterializationUnit::getName() const { return G->getName(); }9293void LinkGraphMaterializationUnit::discard(const JITDylib &JD,94const SymbolStringPtr &Name) {95for (auto *Sym : G->defined_symbols())96if (Sym->getName() == Name) {97assert(Sym->getLinkage() == Linkage::Weak &&98"Discarding non-weak definition");99G->makeExternal(*Sym);100break;101}102}103104} // namespace llvm::orc105106107