xref: /llvm-project/llvm/lib/ExecutionEngine/Orc/Mangling.cpp (revision 1f4d91ecb8529678a3d3919d7523743bd21942ca)
185fb9976SLang Hames //===----------- Mangling.cpp -- Name Mangling Utilities for ORC ----------===//
285fb9976SLang Hames //
385fb9976SLang Hames // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
485fb9976SLang Hames // See https://llvm.org/LICENSE.txt for license information.
585fb9976SLang Hames // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
685fb9976SLang Hames //
785fb9976SLang Hames //===----------------------------------------------------------------------===//
885fb9976SLang Hames 
985fb9976SLang Hames #include "llvm/ExecutionEngine/Orc/Mangling.h"
1085fb9976SLang Hames #include "llvm/IR/Constants.h"
1185fb9976SLang Hames #include "llvm/IR/Mangler.h"
1285fb9976SLang Hames 
1385fb9976SLang Hames #define DEBUG_TYPE "orc"
1485fb9976SLang Hames 
1585fb9976SLang Hames namespace llvm {
1685fb9976SLang Hames namespace orc {
1785fb9976SLang Hames 
1885fb9976SLang Hames MangleAndInterner::MangleAndInterner(ExecutionSession &ES, const DataLayout &DL)
1985fb9976SLang Hames     : ES(ES), DL(DL) {}
2085fb9976SLang Hames 
2185fb9976SLang Hames SymbolStringPtr MangleAndInterner::operator()(StringRef Name) {
2285fb9976SLang Hames   std::string MangledName;
2385fb9976SLang Hames   {
2485fb9976SLang Hames     raw_string_ostream MangledNameStream(MangledName);
2585fb9976SLang Hames     Mangler::getNameWithPrefix(MangledNameStream, Name, DL);
2685fb9976SLang Hames   }
2785fb9976SLang Hames   return ES.intern(MangledName);
2885fb9976SLang Hames }
2985fb9976SLang Hames 
3085fb9976SLang Hames void IRSymbolMapper::add(ExecutionSession &ES, const ManglingOptions &MO,
3185fb9976SLang Hames                          ArrayRef<GlobalValue *> GVs,
3285fb9976SLang Hames                          SymbolFlagsMap &SymbolFlags,
3385fb9976SLang Hames                          SymbolNameToDefinitionMap *SymbolToDefinition) {
3485fb9976SLang Hames   if (GVs.empty())
3585fb9976SLang Hames     return;
3685fb9976SLang Hames 
37*9df71d76SNikita Popov   MangleAndInterner Mangle(ES, GVs[0]->getDataLayout());
3885fb9976SLang Hames   for (auto *G : GVs) {
3985fb9976SLang Hames     assert(G && "GVs cannot contain null elements");
4085fb9976SLang Hames     if (!G->hasName() || G->isDeclaration() || G->hasLocalLinkage() ||
4185fb9976SLang Hames         G->hasAvailableExternallyLinkage() || G->hasAppendingLinkage())
4285fb9976SLang Hames       continue;
4385fb9976SLang Hames 
4485fb9976SLang Hames     if (G->isThreadLocal() && MO.EmulatedTLS) {
4585fb9976SLang Hames       auto *GV = cast<GlobalVariable>(G);
4685fb9976SLang Hames 
4785fb9976SLang Hames       auto Flags = JITSymbolFlags::fromGlobalValue(*GV);
4885fb9976SLang Hames 
4985fb9976SLang Hames       auto EmuTLSV = Mangle(("__emutls_v." + GV->getName()).str());
5085fb9976SLang Hames       SymbolFlags[EmuTLSV] = Flags;
5185fb9976SLang Hames       if (SymbolToDefinition)
5285fb9976SLang Hames         (*SymbolToDefinition)[EmuTLSV] = GV;
5385fb9976SLang Hames 
5485fb9976SLang Hames       // If this GV has a non-zero initializer we'll need to emit an
5585fb9976SLang Hames       // __emutls.t symbol too.
5685fb9976SLang Hames       if (GV->hasInitializer()) {
5785fb9976SLang Hames         const auto *InitVal = GV->getInitializer();
5885fb9976SLang Hames 
5985fb9976SLang Hames         // Skip zero-initializers.
6085fb9976SLang Hames         if (isa<ConstantAggregateZero>(InitVal))
6185fb9976SLang Hames           continue;
6285fb9976SLang Hames         const auto *InitIntValue = dyn_cast<ConstantInt>(InitVal);
6385fb9976SLang Hames         if (InitIntValue && InitIntValue->isZero())
6485fb9976SLang Hames           continue;
6585fb9976SLang Hames 
6685fb9976SLang Hames         auto EmuTLST = Mangle(("__emutls_t." + GV->getName()).str());
6785fb9976SLang Hames         SymbolFlags[EmuTLST] = Flags;
6885fb9976SLang Hames         if (SymbolToDefinition)
6985fb9976SLang Hames           (*SymbolToDefinition)[EmuTLST] = GV;
7085fb9976SLang Hames       }
7185fb9976SLang Hames       continue;
7285fb9976SLang Hames     }
7385fb9976SLang Hames 
7485fb9976SLang Hames     // Otherwise we just need a normal linker mangling.
7585fb9976SLang Hames     auto MangledName = Mangle(G->getName());
7685fb9976SLang Hames     SymbolFlags[MangledName] = JITSymbolFlags::fromGlobalValue(*G);
7785fb9976SLang Hames     if (SymbolToDefinition)
7885fb9976SLang Hames       (*SymbolToDefinition)[MangledName] = G;
7985fb9976SLang Hames   }
8085fb9976SLang Hames }
8185fb9976SLang Hames 
8285fb9976SLang Hames } // End namespace orc.
8385fb9976SLang Hames } // End namespace llvm.
84