1*85fb9976SLang Hames //===----------- Mangling.cpp -- Name Mangling Utilities for ORC ----------===//
2*85fb9976SLang Hames //
3*85fb9976SLang Hames // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*85fb9976SLang Hames // See https://llvm.org/LICENSE.txt for license information.
5*85fb9976SLang Hames // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*85fb9976SLang Hames //
7*85fb9976SLang Hames //===----------------------------------------------------------------------===//
8*85fb9976SLang Hames
9*85fb9976SLang Hames #include "llvm/ExecutionEngine/Orc/Mangling.h"
10*85fb9976SLang Hames #include "llvm/IR/Constants.h"
11*85fb9976SLang Hames #include "llvm/IR/Mangler.h"
12*85fb9976SLang Hames #include "llvm/Support/Debug.h"
13*85fb9976SLang Hames
14*85fb9976SLang Hames #define DEBUG_TYPE "orc"
15*85fb9976SLang Hames
16*85fb9976SLang Hames namespace llvm {
17*85fb9976SLang Hames namespace orc {
18*85fb9976SLang Hames
MangleAndInterner(ExecutionSession & ES,const DataLayout & DL)19*85fb9976SLang Hames MangleAndInterner::MangleAndInterner(ExecutionSession &ES, const DataLayout &DL)
20*85fb9976SLang Hames : ES(ES), DL(DL) {}
21*85fb9976SLang Hames
operator ()(StringRef Name)22*85fb9976SLang Hames SymbolStringPtr MangleAndInterner::operator()(StringRef Name) {
23*85fb9976SLang Hames std::string MangledName;
24*85fb9976SLang Hames {
25*85fb9976SLang Hames raw_string_ostream MangledNameStream(MangledName);
26*85fb9976SLang Hames Mangler::getNameWithPrefix(MangledNameStream, Name, DL);
27*85fb9976SLang Hames }
28*85fb9976SLang Hames return ES.intern(MangledName);
29*85fb9976SLang Hames }
30*85fb9976SLang Hames
add(ExecutionSession & ES,const ManglingOptions & MO,ArrayRef<GlobalValue * > GVs,SymbolFlagsMap & SymbolFlags,SymbolNameToDefinitionMap * SymbolToDefinition)31*85fb9976SLang Hames void IRSymbolMapper::add(ExecutionSession &ES, const ManglingOptions &MO,
32*85fb9976SLang Hames ArrayRef<GlobalValue *> GVs,
33*85fb9976SLang Hames SymbolFlagsMap &SymbolFlags,
34*85fb9976SLang Hames SymbolNameToDefinitionMap *SymbolToDefinition) {
35*85fb9976SLang Hames if (GVs.empty())
36*85fb9976SLang Hames return;
37*85fb9976SLang Hames
38*85fb9976SLang Hames MangleAndInterner Mangle(ES, GVs[0]->getParent()->getDataLayout());
39*85fb9976SLang Hames for (auto *G : GVs) {
40*85fb9976SLang Hames assert(G && "GVs cannot contain null elements");
41*85fb9976SLang Hames if (!G->hasName() || G->isDeclaration() || G->hasLocalLinkage() ||
42*85fb9976SLang Hames G->hasAvailableExternallyLinkage() || G->hasAppendingLinkage())
43*85fb9976SLang Hames continue;
44*85fb9976SLang Hames
45*85fb9976SLang Hames if (G->isThreadLocal() && MO.EmulatedTLS) {
46*85fb9976SLang Hames auto *GV = cast<GlobalVariable>(G);
47*85fb9976SLang Hames
48*85fb9976SLang Hames auto Flags = JITSymbolFlags::fromGlobalValue(*GV);
49*85fb9976SLang Hames
50*85fb9976SLang Hames auto EmuTLSV = Mangle(("__emutls_v." + GV->getName()).str());
51*85fb9976SLang Hames SymbolFlags[EmuTLSV] = Flags;
52*85fb9976SLang Hames if (SymbolToDefinition)
53*85fb9976SLang Hames (*SymbolToDefinition)[EmuTLSV] = GV;
54*85fb9976SLang Hames
55*85fb9976SLang Hames // If this GV has a non-zero initializer we'll need to emit an
56*85fb9976SLang Hames // __emutls.t symbol too.
57*85fb9976SLang Hames if (GV->hasInitializer()) {
58*85fb9976SLang Hames const auto *InitVal = GV->getInitializer();
59*85fb9976SLang Hames
60*85fb9976SLang Hames // Skip zero-initializers.
61*85fb9976SLang Hames if (isa<ConstantAggregateZero>(InitVal))
62*85fb9976SLang Hames continue;
63*85fb9976SLang Hames const auto *InitIntValue = dyn_cast<ConstantInt>(InitVal);
64*85fb9976SLang Hames if (InitIntValue && InitIntValue->isZero())
65*85fb9976SLang Hames continue;
66*85fb9976SLang Hames
67*85fb9976SLang Hames auto EmuTLST = Mangle(("__emutls_t." + GV->getName()).str());
68*85fb9976SLang Hames SymbolFlags[EmuTLST] = Flags;
69*85fb9976SLang Hames if (SymbolToDefinition)
70*85fb9976SLang Hames (*SymbolToDefinition)[EmuTLST] = GV;
71*85fb9976SLang Hames }
72*85fb9976SLang Hames continue;
73*85fb9976SLang Hames }
74*85fb9976SLang Hames
75*85fb9976SLang Hames // Otherwise we just need a normal linker mangling.
76*85fb9976SLang Hames auto MangledName = Mangle(G->getName());
77*85fb9976SLang Hames SymbolFlags[MangledName] = JITSymbolFlags::fromGlobalValue(*G);
78*85fb9976SLang Hames if (SymbolToDefinition)
79*85fb9976SLang Hames (*SymbolToDefinition)[MangledName] = G;
80*85fb9976SLang Hames }
81*85fb9976SLang Hames }
82*85fb9976SLang Hames
83*85fb9976SLang Hames } // End namespace orc.
84*85fb9976SLang Hames } // End namespace llvm.
85