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