Path: blob/main/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/Mangling.cpp
35266 views
//===----------- Mangling.cpp -- Name Mangling Utilities for ORC ----------===//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/Mangling.h"9#include "llvm/IR/Constants.h"10#include "llvm/IR/Mangler.h"11#include "llvm/Support/Debug.h"1213#define DEBUG_TYPE "orc"1415namespace llvm {16namespace orc {1718MangleAndInterner::MangleAndInterner(ExecutionSession &ES, const DataLayout &DL)19: ES(ES), DL(DL) {}2021SymbolStringPtr MangleAndInterner::operator()(StringRef Name) {22std::string MangledName;23{24raw_string_ostream MangledNameStream(MangledName);25Mangler::getNameWithPrefix(MangledNameStream, Name, DL);26}27return ES.intern(MangledName);28}2930void IRSymbolMapper::add(ExecutionSession &ES, const ManglingOptions &MO,31ArrayRef<GlobalValue *> GVs,32SymbolFlagsMap &SymbolFlags,33SymbolNameToDefinitionMap *SymbolToDefinition) {34if (GVs.empty())35return;3637MangleAndInterner Mangle(ES, GVs[0]->getDataLayout());38for (auto *G : GVs) {39assert(G && "GVs cannot contain null elements");40if (!G->hasName() || G->isDeclaration() || G->hasLocalLinkage() ||41G->hasAvailableExternallyLinkage() || G->hasAppendingLinkage())42continue;4344if (G->isThreadLocal() && MO.EmulatedTLS) {45auto *GV = cast<GlobalVariable>(G);4647auto Flags = JITSymbolFlags::fromGlobalValue(*GV);4849auto EmuTLSV = Mangle(("__emutls_v." + GV->getName()).str());50SymbolFlags[EmuTLSV] = Flags;51if (SymbolToDefinition)52(*SymbolToDefinition)[EmuTLSV] = GV;5354// If this GV has a non-zero initializer we'll need to emit an55// __emutls.t symbol too.56if (GV->hasInitializer()) {57const auto *InitVal = GV->getInitializer();5859// Skip zero-initializers.60if (isa<ConstantAggregateZero>(InitVal))61continue;62const auto *InitIntValue = dyn_cast<ConstantInt>(InitVal);63if (InitIntValue && InitIntValue->isZero())64continue;6566auto EmuTLST = Mangle(("__emutls_t." + GV->getName()).str());67SymbolFlags[EmuTLST] = Flags;68if (SymbolToDefinition)69(*SymbolToDefinition)[EmuTLST] = GV;70}71continue;72}7374// Otherwise we just need a normal linker mangling.75auto MangledName = Mangle(G->getName());76SymbolFlags[MangledName] = JITSymbolFlags::fromGlobalValue(*G);77if (SymbolToDefinition)78(*SymbolToDefinition)[MangledName] = G;79}80}8182} // End namespace orc.83} // End namespace llvm.848586