//===----------- Mangling.cpp -- Name Mangling Utilities for ORC ----------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "llvm/ExecutionEngine/Orc/Mangling.h" #include "llvm/IR/Constants.h" #include "llvm/IR/Mangler.h" #include "llvm/Support/Debug.h" #define DEBUG_TYPE "orc" namespace llvm { namespace orc { MangleAndInterner::MangleAndInterner(ExecutionSession &ES, const DataLayout &DL) : ES(ES), DL(DL) {} SymbolStringPtr MangleAndInterner::operator()(StringRef Name) { std::string MangledName; { raw_string_ostream MangledNameStream(MangledName); Mangler::getNameWithPrefix(MangledNameStream, Name, DL); } return ES.intern(MangledName); } void IRSymbolMapper::add(ExecutionSession &ES, const ManglingOptions &MO, ArrayRef GVs, SymbolFlagsMap &SymbolFlags, SymbolNameToDefinitionMap *SymbolToDefinition) { if (GVs.empty()) return; MangleAndInterner Mangle(ES, GVs[0]->getDataLayout()); for (auto *G : GVs) { assert(G && "GVs cannot contain null elements"); if (!G->hasName() || G->isDeclaration() || G->hasLocalLinkage() || G->hasAvailableExternallyLinkage() || G->hasAppendingLinkage()) continue; if (G->isThreadLocal() && MO.EmulatedTLS) { auto *GV = cast(G); auto Flags = JITSymbolFlags::fromGlobalValue(*GV); auto EmuTLSV = Mangle(("__emutls_v." + GV->getName()).str()); SymbolFlags[EmuTLSV] = Flags; if (SymbolToDefinition) (*SymbolToDefinition)[EmuTLSV] = GV; // If this GV has a non-zero initializer we'll need to emit an // __emutls.t symbol too. if (GV->hasInitializer()) { const auto *InitVal = GV->getInitializer(); // Skip zero-initializers. if (isa(InitVal)) continue; const auto *InitIntValue = dyn_cast(InitVal); if (InitIntValue && InitIntValue->isZero()) continue; auto EmuTLST = Mangle(("__emutls_t." + GV->getName()).str()); SymbolFlags[EmuTLST] = Flags; if (SymbolToDefinition) (*SymbolToDefinition)[EmuTLST] = GV; } continue; } // Otherwise we just need a normal linker mangling. auto MangledName = Mangle(G->getName()); SymbolFlags[MangledName] = JITSymbolFlags::fromGlobalValue(*G); if (SymbolToDefinition) (*SymbolToDefinition)[MangledName] = G; } } } // End namespace orc. } // End namespace llvm.