xref: /freebsd/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/Mangling.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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