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