15ffd83dbSDimitry Andric //===----------- Mangling.cpp -- Name Mangling Utilities for ORC ----------===//
25ffd83dbSDimitry Andric //
35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65ffd83dbSDimitry Andric //
75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===//
85ffd83dbSDimitry Andric
95ffd83dbSDimitry Andric #include "llvm/ExecutionEngine/Orc/Mangling.h"
105ffd83dbSDimitry Andric #include "llvm/IR/Constants.h"
115ffd83dbSDimitry Andric #include "llvm/IR/Mangler.h"
125ffd83dbSDimitry Andric #include "llvm/Support/Debug.h"
135ffd83dbSDimitry Andric
145ffd83dbSDimitry Andric #define DEBUG_TYPE "orc"
155ffd83dbSDimitry Andric
165ffd83dbSDimitry Andric namespace llvm {
175ffd83dbSDimitry Andric namespace orc {
185ffd83dbSDimitry Andric
MangleAndInterner(ExecutionSession & ES,const DataLayout & DL)195ffd83dbSDimitry Andric MangleAndInterner::MangleAndInterner(ExecutionSession &ES, const DataLayout &DL)
205ffd83dbSDimitry Andric : ES(ES), DL(DL) {}
215ffd83dbSDimitry Andric
operator ()(StringRef Name)225ffd83dbSDimitry Andric SymbolStringPtr MangleAndInterner::operator()(StringRef Name) {
235ffd83dbSDimitry Andric std::string MangledName;
245ffd83dbSDimitry Andric {
255ffd83dbSDimitry Andric raw_string_ostream MangledNameStream(MangledName);
265ffd83dbSDimitry Andric Mangler::getNameWithPrefix(MangledNameStream, Name, DL);
275ffd83dbSDimitry Andric }
285ffd83dbSDimitry Andric return ES.intern(MangledName);
295ffd83dbSDimitry Andric }
305ffd83dbSDimitry Andric
add(ExecutionSession & ES,const ManglingOptions & MO,ArrayRef<GlobalValue * > GVs,SymbolFlagsMap & SymbolFlags,SymbolNameToDefinitionMap * SymbolToDefinition)315ffd83dbSDimitry Andric void IRSymbolMapper::add(ExecutionSession &ES, const ManglingOptions &MO,
325ffd83dbSDimitry Andric ArrayRef<GlobalValue *> GVs,
335ffd83dbSDimitry Andric SymbolFlagsMap &SymbolFlags,
345ffd83dbSDimitry Andric SymbolNameToDefinitionMap *SymbolToDefinition) {
355ffd83dbSDimitry Andric if (GVs.empty())
365ffd83dbSDimitry Andric return;
375ffd83dbSDimitry Andric
38*0fca6ea1SDimitry Andric MangleAndInterner Mangle(ES, GVs[0]->getDataLayout());
395ffd83dbSDimitry Andric for (auto *G : GVs) {
405ffd83dbSDimitry Andric assert(G && "GVs cannot contain null elements");
415ffd83dbSDimitry Andric if (!G->hasName() || G->isDeclaration() || G->hasLocalLinkage() ||
425ffd83dbSDimitry Andric G->hasAvailableExternallyLinkage() || G->hasAppendingLinkage())
435ffd83dbSDimitry Andric continue;
445ffd83dbSDimitry Andric
455ffd83dbSDimitry Andric if (G->isThreadLocal() && MO.EmulatedTLS) {
465ffd83dbSDimitry Andric auto *GV = cast<GlobalVariable>(G);
475ffd83dbSDimitry Andric
485ffd83dbSDimitry Andric auto Flags = JITSymbolFlags::fromGlobalValue(*GV);
495ffd83dbSDimitry Andric
505ffd83dbSDimitry Andric auto EmuTLSV = Mangle(("__emutls_v." + GV->getName()).str());
515ffd83dbSDimitry Andric SymbolFlags[EmuTLSV] = Flags;
525ffd83dbSDimitry Andric if (SymbolToDefinition)
535ffd83dbSDimitry Andric (*SymbolToDefinition)[EmuTLSV] = GV;
545ffd83dbSDimitry Andric
555ffd83dbSDimitry Andric // If this GV has a non-zero initializer we'll need to emit an
565ffd83dbSDimitry Andric // __emutls.t symbol too.
575ffd83dbSDimitry Andric if (GV->hasInitializer()) {
585ffd83dbSDimitry Andric const auto *InitVal = GV->getInitializer();
595ffd83dbSDimitry Andric
605ffd83dbSDimitry Andric // Skip zero-initializers.
615ffd83dbSDimitry Andric if (isa<ConstantAggregateZero>(InitVal))
625ffd83dbSDimitry Andric continue;
635ffd83dbSDimitry Andric const auto *InitIntValue = dyn_cast<ConstantInt>(InitVal);
645ffd83dbSDimitry Andric if (InitIntValue && InitIntValue->isZero())
655ffd83dbSDimitry Andric continue;
665ffd83dbSDimitry Andric
675ffd83dbSDimitry Andric auto EmuTLST = Mangle(("__emutls_t." + GV->getName()).str());
685ffd83dbSDimitry Andric SymbolFlags[EmuTLST] = Flags;
695ffd83dbSDimitry Andric if (SymbolToDefinition)
705ffd83dbSDimitry Andric (*SymbolToDefinition)[EmuTLST] = GV;
715ffd83dbSDimitry Andric }
725ffd83dbSDimitry Andric continue;
735ffd83dbSDimitry Andric }
745ffd83dbSDimitry Andric
755ffd83dbSDimitry Andric // Otherwise we just need a normal linker mangling.
765ffd83dbSDimitry Andric auto MangledName = Mangle(G->getName());
775ffd83dbSDimitry Andric SymbolFlags[MangledName] = JITSymbolFlags::fromGlobalValue(*G);
785ffd83dbSDimitry Andric if (SymbolToDefinition)
795ffd83dbSDimitry Andric (*SymbolToDefinition)[MangledName] = G;
805ffd83dbSDimitry Andric }
815ffd83dbSDimitry Andric }
825ffd83dbSDimitry Andric
835ffd83dbSDimitry Andric } // End namespace orc.
845ffd83dbSDimitry Andric } // End namespace llvm.
85