1ef860a24SChandler Carruth //===-- LLVMContext.cpp - Implement LLVMContext ---------------------------===// 2ef860a24SChandler Carruth // 3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6ef860a24SChandler Carruth // 7ef860a24SChandler Carruth //===----------------------------------------------------------------------===// 8ef860a24SChandler Carruth // 9ef860a24SChandler Carruth // This file implements LLVMContext, as a wrapper around the opaque 10ef860a24SChandler Carruth // class LLVMContextImpl. 11ef860a24SChandler Carruth // 12ef860a24SChandler Carruth //===----------------------------------------------------------------------===// 13ef860a24SChandler Carruth 149fb823bbSChandler Carruth #include "llvm/IR/LLVMContext.h" 156bda14b3SChandler Carruth #include "LLVMContextImpl.h" 165354a8aaSEugene Zelenko #include "llvm/ADT/SmallVector.h" 175354a8aaSEugene Zelenko #include "llvm/ADT/StringMap.h" 185354a8aaSEugene Zelenko #include "llvm/ADT/StringRef.h" 195354a8aaSEugene Zelenko #include "llvm/ADT/Twine.h" 20b4c44d23SQuentin Colombet #include "llvm/IR/DiagnosticInfo.h" 21b4c44d23SQuentin Colombet #include "llvm/IR/DiagnosticPrinter.h" 229fb823bbSChandler Carruth #include "llvm/IR/Metadata.h" 235354a8aaSEugene Zelenko #include "llvm/IR/Module.h" 245354a8aaSEugene Zelenko #include "llvm/Support/Casting.h" 255354a8aaSEugene Zelenko #include "llvm/Support/ErrorHandling.h" 265354a8aaSEugene Zelenko #include "llvm/Support/raw_ostream.h" 275354a8aaSEugene Zelenko #include <cassert> 285354a8aaSEugene Zelenko #include <cstdlib> 295354a8aaSEugene Zelenko #include <string> 305354a8aaSEugene Zelenko #include <utility> 315354a8aaSEugene Zelenko 32ef860a24SChandler Carruth using namespace llvm; 33ef860a24SChandler Carruth 34ef860a24SChandler Carruth LLVMContext::LLVMContext() : pImpl(new LLVMContextImpl(*this)) { 35ef860a24SChandler Carruth // Create the fixed metadata kinds. This is done in the same order as the 36ef860a24SChandler Carruth // MD_* enum values so that they correspond. 376f0b4f2eSPeter Collingbourne std::pair<unsigned, StringRef> MDKinds[] = { 386f0b4f2eSPeter Collingbourne {MD_dbg, "dbg"}, 396f0b4f2eSPeter Collingbourne {MD_tbaa, "tbaa"}, 406f0b4f2eSPeter Collingbourne {MD_prof, "prof"}, 416f0b4f2eSPeter Collingbourne {MD_fpmath, "fpmath"}, 426f0b4f2eSPeter Collingbourne {MD_range, "range"}, 436f0b4f2eSPeter Collingbourne {MD_tbaa_struct, "tbaa.struct"}, 446f0b4f2eSPeter Collingbourne {MD_invariant_load, "invariant.load"}, 456f0b4f2eSPeter Collingbourne {MD_alias_scope, "alias.scope"}, 466f0b4f2eSPeter Collingbourne {MD_noalias, "noalias"}, 476f0b4f2eSPeter Collingbourne {MD_nontemporal, "nontemporal"}, 486f0b4f2eSPeter Collingbourne {MD_mem_parallel_loop_access, "llvm.mem.parallel_loop_access"}, 496f0b4f2eSPeter Collingbourne {MD_nonnull, "nonnull"}, 506f0b4f2eSPeter Collingbourne {MD_dereferenceable, "dereferenceable"}, 516f0b4f2eSPeter Collingbourne {MD_dereferenceable_or_null, "dereferenceable_or_null"}, 526f0b4f2eSPeter Collingbourne {MD_make_implicit, "make.implicit"}, 536f0b4f2eSPeter Collingbourne {MD_unpredictable, "unpredictable"}, 546f0b4f2eSPeter Collingbourne {MD_invariant_group, "invariant.group"}, 556f0b4f2eSPeter Collingbourne {MD_align, "align"}, 566f0b4f2eSPeter Collingbourne {MD_loop, "llvm.loop"}, 576f0b4f2eSPeter Collingbourne {MD_type, "type"}, 586f0b4f2eSPeter Collingbourne {MD_section_prefix, "section_prefix"}, 59235c275bSPeter Collingbourne {MD_absolute_symbol, "absolute_symbol"}, 6051c962f7SEvgeniy Stepanov {MD_associated, "associated"}, 6136bbc8ceSMatthew Simpson {MD_callees, "callees"}, 62dce9def3SHiroshi Yamauchi {MD_irr_loop, "irr_loop"}, 63978ba615SMichael Kruse {MD_access_group, "llvm.access.group"}, 6418251842SJohannes Doerfert {MD_callback, "callback"}, 656f0b4f2eSPeter Collingbourne }; 66ef860a24SChandler Carruth 676f0b4f2eSPeter Collingbourne for (auto &MDKind : MDKinds) { 686f0b4f2eSPeter Collingbourne unsigned ID = getMDKindID(MDKind.second); 696f0b4f2eSPeter Collingbourne assert(ID == MDKind.first && "metadata kind id drifted"); 706f0b4f2eSPeter Collingbourne (void)ID; 716f0b4f2eSPeter Collingbourne } 72302b69c9SDehao Chen 73cdafd849SSanjoy Das auto *DeoptEntry = pImpl->getOrInsertBundleTag("deopt"); 74cdafd849SSanjoy Das assert(DeoptEntry->second == LLVMContext::OB_deopt && 75cdafd849SSanjoy Das "deopt operand bundle id drifted!"); 76cdafd849SSanjoy Das (void)DeoptEntry; 773bb88c02SDavid Majnemer 783bb88c02SDavid Majnemer auto *FuncletEntry = pImpl->getOrInsertBundleTag("funclet"); 793bb88c02SDavid Majnemer assert(FuncletEntry->second == LLVMContext::OB_funclet && 803bb88c02SDavid Majnemer "funclet operand bundle id drifted!"); 813bb88c02SDavid Majnemer (void)FuncletEntry; 82a34ce95bSSanjoy Das 83a34ce95bSSanjoy Das auto *GCTransitionEntry = pImpl->getOrInsertBundleTag("gc-transition"); 84a34ce95bSSanjoy Das assert(GCTransitionEntry->second == LLVMContext::OB_gc_transition && 85a34ce95bSSanjoy Das "gc-transition operand bundle id drifted!"); 86a34ce95bSSanjoy Das (void)GCTransitionEntry; 87bb80d3e1SKonstantin Zhuravlyov 88bb80d3e1SKonstantin Zhuravlyov SyncScope::ID SingleThreadSSID = 89bb80d3e1SKonstantin Zhuravlyov pImpl->getOrInsertSyncScopeID("singlethread"); 90bb80d3e1SKonstantin Zhuravlyov assert(SingleThreadSSID == SyncScope::SingleThread && 91bb80d3e1SKonstantin Zhuravlyov "singlethread synchronization scope ID drifted!"); 92878fdee0SKonstantin Zhuravlyov (void)SingleThreadSSID; 93bb80d3e1SKonstantin Zhuravlyov 94bb80d3e1SKonstantin Zhuravlyov SyncScope::ID SystemSSID = 95bb80d3e1SKonstantin Zhuravlyov pImpl->getOrInsertSyncScopeID(""); 96bb80d3e1SKonstantin Zhuravlyov assert(SystemSSID == SyncScope::System && 97bb80d3e1SKonstantin Zhuravlyov "system synchronization scope ID drifted!"); 98878fdee0SKonstantin Zhuravlyov (void)SystemSSID; 99ef860a24SChandler Carruth } 1005354a8aaSEugene Zelenko 101ef860a24SChandler Carruth LLVMContext::~LLVMContext() { delete pImpl; } 102ef860a24SChandler Carruth 103ef860a24SChandler Carruth void LLVMContext::addModule(Module *M) { 104ef860a24SChandler Carruth pImpl->OwnedModules.insert(M); 105ef860a24SChandler Carruth } 106ef860a24SChandler Carruth 107ef860a24SChandler Carruth void LLVMContext::removeModule(Module *M) { 108ef860a24SChandler Carruth pImpl->OwnedModules.erase(M); 109ef860a24SChandler Carruth } 110ef860a24SChandler Carruth 111ef860a24SChandler Carruth //===----------------------------------------------------------------------===// 112ef860a24SChandler Carruth // Recoverable Backend Errors 113ef860a24SChandler Carruth //===----------------------------------------------------------------------===// 114ef860a24SChandler Carruth 115a594fab4SBob Wilson void LLVMContext:: 116a594fab4SBob Wilson setInlineAsmDiagnosticHandler(InlineAsmDiagHandlerTy DiagHandler, 117ef860a24SChandler Carruth void *DiagContext) { 118a594fab4SBob Wilson pImpl->InlineAsmDiagHandler = DiagHandler; 119a594fab4SBob Wilson pImpl->InlineAsmDiagContext = DiagContext; 120ef860a24SChandler Carruth } 121ef860a24SChandler Carruth 122a594fab4SBob Wilson /// getInlineAsmDiagnosticHandler - Return the diagnostic handler set by 123a594fab4SBob Wilson /// setInlineAsmDiagnosticHandler. 124a594fab4SBob Wilson LLVMContext::InlineAsmDiagHandlerTy 125a594fab4SBob Wilson LLVMContext::getInlineAsmDiagnosticHandler() const { 126a594fab4SBob Wilson return pImpl->InlineAsmDiagHandler; 127ef860a24SChandler Carruth } 128ef860a24SChandler Carruth 129a594fab4SBob Wilson /// getInlineAsmDiagnosticContext - Return the diagnostic context set by 130a594fab4SBob Wilson /// setInlineAsmDiagnosticHandler. 131a594fab4SBob Wilson void *LLVMContext::getInlineAsmDiagnosticContext() const { 132a594fab4SBob Wilson return pImpl->InlineAsmDiagContext; 133ef860a24SChandler Carruth } 134ef860a24SChandler Carruth 135b5ab895eSVivek Pandya void LLVMContext::setDiagnosticHandlerCallBack( 136b5ab895eSVivek Pandya DiagnosticHandler::DiagnosticHandlerTy DiagnosticHandler, 137b5ab895eSVivek Pandya void *DiagnosticContext, bool RespectFilters) { 138b5ab895eSVivek Pandya pImpl->DiagHandler->DiagHandlerCallback = DiagnosticHandler; 139b5ab895eSVivek Pandya pImpl->DiagHandler->DiagnosticContext = DiagnosticContext; 140b5ab895eSVivek Pandya pImpl->RespectDiagnosticFilters = RespectFilters; 141b5ab895eSVivek Pandya } 142b5ab895eSVivek Pandya 143b5ab895eSVivek Pandya void LLVMContext::setDiagnosticHandler(std::unique_ptr<DiagnosticHandler> &&DH, 14430c9242cSDuncan P. N. Exon Smith bool RespectFilters) { 145b5ab895eSVivek Pandya pImpl->DiagHandler = std::move(DH); 14630c9242cSDuncan P. N. Exon Smith pImpl->RespectDiagnosticFilters = RespectFilters; 147b4c44d23SQuentin Colombet } 148b4c44d23SQuentin Colombet 14944e5f6c4SBrian Gesiak void LLVMContext::setDiagnosticsHotnessRequested(bool Requested) { 15044e5f6c4SBrian Gesiak pImpl->DiagnosticsHotnessRequested = Requested; 15144e5f6c4SBrian Gesiak } 15244e5f6c4SBrian Gesiak bool LLVMContext::getDiagnosticsHotnessRequested() const { 15344e5f6c4SBrian Gesiak return pImpl->DiagnosticsHotnessRequested; 154aad81608SAdam Nemet } 155aad81608SAdam Nemet 1564ef3daafSBrian Gesiak void LLVMContext::setDiagnosticsHotnessThreshold(uint64_t Threshold) { 1574ef3daafSBrian Gesiak pImpl->DiagnosticsHotnessThreshold = Threshold; 1584ef3daafSBrian Gesiak } 1594ef3daafSBrian Gesiak uint64_t LLVMContext::getDiagnosticsHotnessThreshold() const { 1604ef3daafSBrian Gesiak return pImpl->DiagnosticsHotnessThreshold; 1614ef3daafSBrian Gesiak } 1624ef3daafSBrian Gesiak 163a62b7e1aSAdam Nemet yaml::Output *LLVMContext::getDiagnosticsOutputFile() { 164a62b7e1aSAdam Nemet return pImpl->DiagnosticsOutputFile.get(); 165a62b7e1aSAdam Nemet } 166a62b7e1aSAdam Nemet 1676f408368SMehdi Amini void LLVMContext::setDiagnosticsOutputFile(std::unique_ptr<yaml::Output> F) { 1686f408368SMehdi Amini pImpl->DiagnosticsOutputFile = std::move(F); 169a62b7e1aSAdam Nemet } 170a62b7e1aSAdam Nemet 171b5ab895eSVivek Pandya DiagnosticHandler::DiagnosticHandlerTy 172b5ab895eSVivek Pandya LLVMContext::getDiagnosticHandlerCallBack() const { 173b5ab895eSVivek Pandya return pImpl->DiagHandler->DiagHandlerCallback; 174b4c44d23SQuentin Colombet } 175b4c44d23SQuentin Colombet 176b4c44d23SQuentin Colombet void *LLVMContext::getDiagnosticContext() const { 177b5ab895eSVivek Pandya return pImpl->DiagHandler->DiagnosticContext; 178b4c44d23SQuentin Colombet } 179b4c44d23SQuentin Colombet 18034390c70SJuergen Ributzka void LLVMContext::setYieldCallback(YieldCallbackTy Callback, void *OpaqueHandle) 18134390c70SJuergen Ributzka { 18234390c70SJuergen Ributzka pImpl->YieldCallback = Callback; 18334390c70SJuergen Ributzka pImpl->YieldOpaqueHandle = OpaqueHandle; 18434390c70SJuergen Ributzka } 18534390c70SJuergen Ributzka 18634390c70SJuergen Ributzka void LLVMContext::yield() { 18734390c70SJuergen Ributzka if (pImpl->YieldCallback) 18834390c70SJuergen Ributzka pImpl->YieldCallback(this, pImpl->YieldOpaqueHandle); 18934390c70SJuergen Ributzka } 19034390c70SJuergen Ributzka 191ef860a24SChandler Carruth void LLVMContext::emitError(const Twine &ErrorStr) { 192dec8d55bSQuentin Colombet diagnose(DiagnosticInfoInlineAsm(ErrorStr)); 193ef860a24SChandler Carruth } 194ef860a24SChandler Carruth 195bfb44ef9SBob Wilson void LLVMContext::emitError(const Instruction *I, const Twine &ErrorStr) { 196dec8d55bSQuentin Colombet assert (I && "Invalid instruction"); 197dec8d55bSQuentin Colombet diagnose(DiagnosticInfoInlineAsm(*I, ErrorStr)); 198ef860a24SChandler Carruth } 199ef860a24SChandler Carruth 20030c9242cSDuncan P. N. Exon Smith static bool isDiagnosticEnabled(const DiagnosticInfo &DI) { 2017f8af8bfSDiego Novillo // Optimization remarks are selective. They need to check whether the regexp 2027f8af8bfSDiego Novillo // pattern, passed via one of the -pass-remarks* flags, matches the name of 2037f8af8bfSDiego Novillo // the pass that is emitting the diagnostic. If there is no match, ignore the 2047f8af8bfSDiego Novillo // diagnostic and return. 205f31b1f31SAdam Nemet // 206f31b1f31SAdam Nemet // Also noisy remarks are only enabled if we have hotness information to sort 207f31b1f31SAdam Nemet // them. 208e9148dd6SAkira Hatanaka if (auto *Remark = dyn_cast<DiagnosticInfoOptimizationBase>(&DI)) 209f31b1f31SAdam Nemet return Remark->isEnabled() && 210f31b1f31SAdam Nemet (!Remark->isVerbose() || Remark->getHotness()); 211e9148dd6SAkira Hatanaka 21230c9242cSDuncan P. N. Exon Smith return true; 21330c9242cSDuncan P. N. Exon Smith } 21430c9242cSDuncan P. N. Exon Smith 2154b9c0d4dSRenato Golin const char * 2164b9c0d4dSRenato Golin LLVMContext::getDiagnosticMessagePrefix(DiagnosticSeverity Severity) { 217735c47ecSAlex Lorenz switch (Severity) { 218735c47ecSAlex Lorenz case DS_Error: 219735c47ecSAlex Lorenz return "error"; 220735c47ecSAlex Lorenz case DS_Warning: 221735c47ecSAlex Lorenz return "warning"; 222735c47ecSAlex Lorenz case DS_Remark: 223735c47ecSAlex Lorenz return "remark"; 224735c47ecSAlex Lorenz case DS_Note: 225735c47ecSAlex Lorenz return "note"; 226735c47ecSAlex Lorenz } 2275220476aSAaron Ballman llvm_unreachable("Unknown DiagnosticSeverity"); 228735c47ecSAlex Lorenz } 229735c47ecSAlex Lorenz 23030c9242cSDuncan P. N. Exon Smith void LLVMContext::diagnose(const DiagnosticInfo &DI) { 2316c381b7aSAdam Nemet if (auto *OptDiagBase = dyn_cast<DiagnosticInfoOptimizationBase>(&DI)) { 2326c381b7aSAdam Nemet yaml::Output *Out = getDiagnosticsOutputFile(); 2336c381b7aSAdam Nemet if (Out) { 2346c381b7aSAdam Nemet // For remarks the << operator takes a reference to a pointer. 2356c381b7aSAdam Nemet auto *P = const_cast<DiagnosticInfoOptimizationBase *>(OptDiagBase); 2366c381b7aSAdam Nemet *Out << P; 2376c381b7aSAdam Nemet } 2386c381b7aSAdam Nemet } 23930c9242cSDuncan P. N. Exon Smith // If there is a report handler, use it. 240b5ab895eSVivek Pandya if (pImpl->DiagHandler && 241b5ab895eSVivek Pandya (!pImpl->RespectDiagnosticFilters || isDiagnosticEnabled(DI)) && 242b5ab895eSVivek Pandya pImpl->DiagHandler->handleDiagnostics(DI)) 24330c9242cSDuncan P. N. Exon Smith return; 24430c9242cSDuncan P. N. Exon Smith 24530c9242cSDuncan P. N. Exon Smith if (!isDiagnosticEnabled(DI)) 24630c9242cSDuncan P. N. Exon Smith return; 247df655013SDiego Novillo 248b4c44d23SQuentin Colombet // Otherwise, print the message with a prefix based on the severity. 249735c47ecSAlex Lorenz DiagnosticPrinterRawOStream DP(errs()); 250735c47ecSAlex Lorenz errs() << getDiagnosticMessagePrefix(DI.getSeverity()) << ": "; 251b4c44d23SQuentin Colombet DI.print(DP); 252735c47ecSAlex Lorenz errs() << "\n"; 253735c47ecSAlex Lorenz if (DI.getSeverity() == DS_Error) 254b4c44d23SQuentin Colombet exit(1); 255b4c44d23SQuentin Colombet } 256b4c44d23SQuentin Colombet 257ef860a24SChandler Carruth void LLVMContext::emitError(unsigned LocCookie, const Twine &ErrorStr) { 258dec8d55bSQuentin Colombet diagnose(DiagnosticInfoInlineAsm(LocCookie, ErrorStr)); 259ef860a24SChandler Carruth } 260ef860a24SChandler Carruth 261ef860a24SChandler Carruth //===----------------------------------------------------------------------===// 262ef860a24SChandler Carruth // Metadata Kind Uniquing 263ef860a24SChandler Carruth //===----------------------------------------------------------------------===// 264ef860a24SChandler Carruth 2651ac0d2deSFilipe Cabecinhas /// Return a unique non-zero ID for the specified metadata kind. 266ef860a24SChandler Carruth unsigned LLVMContext::getMDKindID(StringRef Name) const { 267ef860a24SChandler Carruth // If this is new, assign it its ID. 2681ac0d2deSFilipe Cabecinhas return pImpl->CustomMDKindNames.insert( 2691ac0d2deSFilipe Cabecinhas std::make_pair( 2701ac0d2deSFilipe Cabecinhas Name, pImpl->CustomMDKindNames.size())) 2715106ce78SDavid Blaikie .first->second; 272ef860a24SChandler Carruth } 273ef860a24SChandler Carruth 2744104337dSSanjay Patel /// getHandlerNames - Populate client-supplied smallvector using custom 275ef860a24SChandler Carruth /// metadata name and ID. 276ef860a24SChandler Carruth void LLVMContext::getMDKindNames(SmallVectorImpl<StringRef> &Names) const { 277ef860a24SChandler Carruth Names.resize(pImpl->CustomMDKindNames.size()); 278ef860a24SChandler Carruth for (StringMap<unsigned>::const_iterator I = pImpl->CustomMDKindNames.begin(), 279ef860a24SChandler Carruth E = pImpl->CustomMDKindNames.end(); I != E; ++I) 280ef860a24SChandler Carruth Names[I->second] = I->first(); 281ef860a24SChandler Carruth } 2829303c246SSanjoy Das 2839303c246SSanjoy Das void LLVMContext::getOperandBundleTags(SmallVectorImpl<StringRef> &Tags) const { 2849303c246SSanjoy Das pImpl->getOperandBundleTags(Tags); 2859303c246SSanjoy Das } 2869303c246SSanjoy Das 2879303c246SSanjoy Das uint32_t LLVMContext::getOperandBundleTagID(StringRef Tag) const { 2889303c246SSanjoy Das return pImpl->getOperandBundleTagID(Tag); 2899303c246SSanjoy Das } 290599ebf27SMehdi Amini 291bb80d3e1SKonstantin Zhuravlyov SyncScope::ID LLVMContext::getOrInsertSyncScopeID(StringRef SSN) { 292bb80d3e1SKonstantin Zhuravlyov return pImpl->getOrInsertSyncScopeID(SSN); 293bb80d3e1SKonstantin Zhuravlyov } 294bb80d3e1SKonstantin Zhuravlyov 295bb80d3e1SKonstantin Zhuravlyov void LLVMContext::getSyncScopeNames(SmallVectorImpl<StringRef> &SSNs) const { 296bb80d3e1SKonstantin Zhuravlyov pImpl->getSyncScopeNames(SSNs); 297bb80d3e1SKonstantin Zhuravlyov } 298bb80d3e1SKonstantin Zhuravlyov 299599ebf27SMehdi Amini void LLVMContext::setGC(const Function &Fn, std::string GCName) { 300599ebf27SMehdi Amini auto It = pImpl->GCNames.find(&Fn); 301599ebf27SMehdi Amini 302599ebf27SMehdi Amini if (It == pImpl->GCNames.end()) { 303599ebf27SMehdi Amini pImpl->GCNames.insert(std::make_pair(&Fn, std::move(GCName))); 304599ebf27SMehdi Amini return; 305599ebf27SMehdi Amini } 306599ebf27SMehdi Amini It->second = std::move(GCName); 307599ebf27SMehdi Amini } 3085354a8aaSEugene Zelenko 309599ebf27SMehdi Amini const std::string &LLVMContext::getGC(const Function &Fn) { 310599ebf27SMehdi Amini return pImpl->GCNames[&Fn]; 311599ebf27SMehdi Amini } 3125354a8aaSEugene Zelenko 313599ebf27SMehdi Amini void LLVMContext::deleteGC(const Function &Fn) { 314599ebf27SMehdi Amini pImpl->GCNames.erase(&Fn); 315599ebf27SMehdi Amini } 31609b4a8daSMehdi Amini 317e7090155SMehdi Amini bool LLVMContext::shouldDiscardValueNames() const { 318e7090155SMehdi Amini return pImpl->DiscardValueNames; 319e7090155SMehdi Amini } 32009b4a8daSMehdi Amini 321ed8fdb2aSDuncan P. N. Exon Smith bool LLVMContext::isODRUniquingDebugTypes() const { return !!pImpl->DITypeMap; } 3225ab2be09SDuncan P. N. Exon Smith 323ed8fdb2aSDuncan P. N. Exon Smith void LLVMContext::enableDebugTypeODRUniquing() { 3245ab2be09SDuncan P. N. Exon Smith if (pImpl->DITypeMap) 3255ab2be09SDuncan P. N. Exon Smith return; 3265ab2be09SDuncan P. N. Exon Smith 327e8b555c6SDuncan P. N. Exon Smith pImpl->DITypeMap.emplace(); 3285ab2be09SDuncan P. N. Exon Smith } 3295ab2be09SDuncan P. N. Exon Smith 330ed8fdb2aSDuncan P. N. Exon Smith void LLVMContext::disableDebugTypeODRUniquing() { pImpl->DITypeMap.reset(); } 3315ab2be09SDuncan P. N. Exon Smith 33209b4a8daSMehdi Amini void LLVMContext::setDiscardValueNames(bool Discard) { 33309b4a8daSMehdi Amini pImpl->DiscardValueNames = Discard; 33409b4a8daSMehdi Amini } 335aa641a51SAndrew Kaylor 336d29884c7SFedor Sergeev OptPassGate &LLVMContext::getOptPassGate() const { 33798014e43SFedor Sergeev return pImpl->getOptPassGate(); 338aa641a51SAndrew Kaylor } 339b5ab895eSVivek Pandya 340d29884c7SFedor Sergeev void LLVMContext::setOptPassGate(OptPassGate& OPG) { 341d29884c7SFedor Sergeev pImpl->setOptPassGate(OPG); 342d29884c7SFedor Sergeev } 343d29884c7SFedor Sergeev 344b5ab895eSVivek Pandya const DiagnosticHandler *LLVMContext::getDiagHandlerPtr() const { 345b5ab895eSVivek Pandya return pImpl->DiagHandler.get(); 346b5ab895eSVivek Pandya } 347b5ab895eSVivek Pandya 348b5ab895eSVivek Pandya std::unique_ptr<DiagnosticHandler> LLVMContext::getDiagnosticHandler() { 349b5ab895eSVivek Pandya return std::move(pImpl->DiagHandler); 350b5ab895eSVivek Pandya } 351