#ifndef LLVM_MC_MCCONTEXT_H
#define LLVM_MC_MCCONTEXT_H
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Twine.h"
#include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/BinaryFormat/XCOFF.h"
#include "llvm/MC/MCAsmMacro.h"
#include "llvm/MC/MCDwarf.h"
#include "llvm/MC/MCPseudoProbe.h"
#include "llvm/MC/MCSection.h"
#include "llvm/MC/SectionKind.h"
#include "llvm/Support/Allocator.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/MD5.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <cassert>
#include <cstddef>
#include <cstdint>
#include <functional>
#include <map>
#include <memory>
#include <string>
#include <utility>
#include <vector>
namespace llvm {
class CodeViewContext;
class MCAsmInfo;
class MCInst;
class MCLabel;
class MCObjectFileInfo;
class MCRegisterInfo;
class MCSection;
class MCSectionCOFF;
class MCSectionDXContainer;
class MCSectionELF;
class MCSectionGOFF;
class MCSectionMachO;
class MCSectionSPIRV;
class MCSectionWasm;
class MCSectionXCOFF;
class MCStreamer;
class MCSubtargetInfo;
class MCSymbol;
class MCSymbolELF;
class MCSymbolWasm;
class MCSymbolXCOFF;
class MCTargetOptions;
class MDNode;
template <typename T> class SmallVectorImpl;
class SMDiagnostic;
class SMLoc;
class SourceMgr;
enum class EmitDwarfUnwindType;
class MCContext {
public:
using SymbolTable = StringMap<MCSymbol *, BumpPtrAllocator &>;
using DiagHandlerTy =
std::function<void(const SMDiagnostic &, bool, const SourceMgr &,
std::vector<const MDNode *> &)>;
enum Environment {
IsMachO,
IsELF,
IsGOFF,
IsCOFF,
IsSPIRV,
IsWasm,
IsXCOFF,
IsDXContainer
};
private:
Environment Env;
StringRef Swift5ReflectionSegmentName;
Triple TT;
const SourceMgr *SrcMgr;
std::unique_ptr<SourceMgr> InlineSrcMgr;
std::vector<const MDNode *> LocInfos;
DiagHandlerTy DiagHandler;
const MCAsmInfo *MAI;
const MCRegisterInfo *MRI;
const MCObjectFileInfo *MOFI;
const MCSubtargetInfo *MSTI;
std::unique_ptr<CodeViewContext> CVContext;
BumpPtrAllocator Allocator;
SpecificBumpPtrAllocator<MCSectionCOFF> COFFAllocator;
SpecificBumpPtrAllocator<MCSectionDXContainer> DXCAllocator;
SpecificBumpPtrAllocator<MCSectionELF> ELFAllocator;
SpecificBumpPtrAllocator<MCSectionMachO> MachOAllocator;
SpecificBumpPtrAllocator<MCSectionGOFF> GOFFAllocator;
SpecificBumpPtrAllocator<MCSectionSPIRV> SPIRVAllocator;
SpecificBumpPtrAllocator<MCSectionWasm> WasmAllocator;
SpecificBumpPtrAllocator<MCSectionXCOFF> XCOFFAllocator;
SpecificBumpPtrAllocator<MCInst> MCInstAllocator;
SymbolTable Symbols;
DenseMap<std::pair<unsigned, unsigned>, MCSymbol *> LocalSymbols;
StringMap<bool, BumpPtrAllocator &> UsedNames;
SymbolTable InlineAsmUsedLabelNames;
StringMap<unsigned> NextID;
DenseMap<unsigned, MCLabel *> Instances;
unsigned NextInstance(unsigned LocalLabelVal);
unsigned GetInstance(unsigned LocalLabelVal);
uint8_t BBAddrMapVersion = 1;
char *SecureLogFile;
std::unique_ptr<raw_fd_ostream> SecureLog;
bool SecureLogUsed = false;
SmallString<128> CompilationDir;
std::map<std::string, const std::string, std::greater<std::string>>
DebugPrefixMap;
std::string MainFileName;
std::map<unsigned, MCDwarfLineTable> MCDwarfLineTablesCUMap;
MCDwarfLoc CurrentDwarfLoc;
bool DwarfLocSeen = false;
bool GenDwarfForAssembly = false;
unsigned GenDwarfFileNumber = 0;
SetVector<MCSection *> SectionsForRanges;
std::vector<MCGenDwarfLabelEntry> MCGenDwarfLabelEntries;
StringRef DwarfDebugFlags;
StringRef DwarfDebugProducer;
uint16_t DwarfVersion = 4;
dwarf::DwarfFormat DwarfFormat = dwarf::DWARF32;
bool AllowTemporaryLabels = true;
bool UseNamesOnTempLabels = false;
unsigned DwarfCompileUnitID = 0;
MCPseudoProbeTable PseudoProbeTable;
struct ELFSectionKey {
std::string SectionName;
StringRef GroupName;
StringRef LinkedToName;
unsigned UniqueID;
ELFSectionKey(StringRef SectionName, StringRef GroupName,
StringRef LinkedToName, unsigned UniqueID)
: SectionName(SectionName), GroupName(GroupName),
LinkedToName(LinkedToName), UniqueID(UniqueID) {}
bool operator<(const ELFSectionKey &Other) const {
if (SectionName != Other.SectionName)
return SectionName < Other.SectionName;
if (GroupName != Other.GroupName)
return GroupName < Other.GroupName;
if (int O = LinkedToName.compare(Other.LinkedToName))
return O < 0;
return UniqueID < Other.UniqueID;
}
};
struct COFFSectionKey {
std::string SectionName;
StringRef GroupName;
int SelectionKey;
unsigned UniqueID;
COFFSectionKey(StringRef SectionName, StringRef GroupName, int SelectionKey,
unsigned UniqueID)
: SectionName(SectionName), GroupName(GroupName),
SelectionKey(SelectionKey), UniqueID(UniqueID) {}
bool operator<(const COFFSectionKey &Other) const {
if (SectionName != Other.SectionName)
return SectionName < Other.SectionName;
if (GroupName != Other.GroupName)
return GroupName < Other.GroupName;
if (SelectionKey != Other.SelectionKey)
return SelectionKey < Other.SelectionKey;
return UniqueID < Other.UniqueID;
}
};
struct WasmSectionKey {
std::string SectionName;
StringRef GroupName;
unsigned UniqueID;
WasmSectionKey(StringRef SectionName, StringRef GroupName,
unsigned UniqueID)
: SectionName(SectionName), GroupName(GroupName), UniqueID(UniqueID) {}
bool operator<(const WasmSectionKey &Other) const {
if (SectionName != Other.SectionName)
return SectionName < Other.SectionName;
if (GroupName != Other.GroupName)
return GroupName < Other.GroupName;
return UniqueID < Other.UniqueID;
}
};
struct XCOFFSectionKey {
std::string SectionName;
union {
XCOFF::StorageMappingClass MappingClass;
XCOFF::DwarfSectionSubtypeFlags DwarfSubtypeFlags;
};
bool IsCsect;
XCOFFSectionKey(StringRef SectionName,
XCOFF::StorageMappingClass MappingClass)
: SectionName(SectionName), MappingClass(MappingClass), IsCsect(true) {}
XCOFFSectionKey(StringRef SectionName,
XCOFF::DwarfSectionSubtypeFlags DwarfSubtypeFlags)
: SectionName(SectionName), DwarfSubtypeFlags(DwarfSubtypeFlags),
IsCsect(false) {}
bool operator<(const XCOFFSectionKey &Other) const {
if (IsCsect && Other.IsCsect)
return std::tie(SectionName, MappingClass) <
std::tie(Other.SectionName, Other.MappingClass);
if (IsCsect != Other.IsCsect)
return IsCsect;
return std::tie(SectionName, DwarfSubtypeFlags) <
std::tie(Other.SectionName, Other.DwarfSubtypeFlags);
}
};
StringMap<MCSectionMachO *> MachOUniquingMap;
std::map<ELFSectionKey, MCSectionELF *> ELFUniquingMap;
std::map<COFFSectionKey, MCSectionCOFF *> COFFUniquingMap;
std::map<std::string, MCSectionGOFF *> GOFFUniquingMap;
std::map<WasmSectionKey, MCSectionWasm *> WasmUniquingMap;
std::map<XCOFFSectionKey, MCSectionXCOFF *> XCOFFUniquingMap;
StringMap<MCSectionDXContainer *> DXCUniquingMap;
StringMap<bool> RelSecNames;
SpecificBumpPtrAllocator<MCSubtargetInfo> MCSubtargetAllocator;
bool AutoReset;
MCTargetOptions const *TargetOptions;
bool HadError = false;
void reportCommon(SMLoc Loc,
std::function<void(SMDiagnostic &, const SourceMgr *)>);
MCSymbol *createSymbolImpl(const StringMapEntry<bool> *Name,
bool CanBeUnnamed);
MCSymbol *createSymbol(StringRef Name, bool AlwaysAddSuffix,
bool IsTemporary);
MCSymbol *getOrCreateDirectionalLocalSymbol(unsigned LocalLabelVal,
unsigned Instance);
MCSectionELF *createELFSectionImpl(StringRef Section, unsigned Type,
unsigned Flags, SectionKind K,
unsigned EntrySize,
const MCSymbolELF *Group, bool IsComdat,
unsigned UniqueID,
const MCSymbolELF *LinkedToSym);
MCSymbolXCOFF *createXCOFFSymbolImpl(const StringMapEntry<bool> *Name,
bool IsTemporary);
StringMap<MCAsmMacro> MacroMap;
struct ELFEntrySizeKey {
std::string SectionName;
unsigned Flags;
unsigned EntrySize;
ELFEntrySizeKey(StringRef SectionName, unsigned Flags, unsigned EntrySize)
: SectionName(SectionName), Flags(Flags), EntrySize(EntrySize) {}
bool operator<(const ELFEntrySizeKey &Other) const {
if (SectionName != Other.SectionName)
return SectionName < Other.SectionName;
if (Flags != Other.Flags)
return Flags < Other.Flags;
return EntrySize < Other.EntrySize;
}
};
std::map<ELFEntrySizeKey, unsigned> ELFEntrySizeMap;
DenseSet<StringRef> ELFSeenGenericMergeableSections;
public:
explicit MCContext(const Triple &TheTriple, const MCAsmInfo *MAI,
const MCRegisterInfo *MRI, const MCSubtargetInfo *MSTI,
const SourceMgr *Mgr = nullptr,
MCTargetOptions const *TargetOpts = nullptr,
bool DoAutoReset = true,
StringRef Swift5ReflSegmentName = {});
MCContext(const MCContext &) = delete;
MCContext &operator=(const MCContext &) = delete;
~MCContext();
Environment getObjectFileType() const { return Env; }
const StringRef &getSwift5ReflectionSegmentName() const {
return Swift5ReflectionSegmentName;
}
const Triple &getTargetTriple() const { return TT; }
const SourceMgr *getSourceManager() const { return SrcMgr; }
void initInlineSourceManager();
SourceMgr *getInlineSourceManager() { return InlineSrcMgr.get(); }
std::vector<const MDNode *> &getLocInfos() { return LocInfos; }
void setDiagnosticHandler(DiagHandlerTy DiagHandler) {
this->DiagHandler = DiagHandler;
}
void setObjectFileInfo(const MCObjectFileInfo *Mofi) { MOFI = Mofi; }
const MCAsmInfo *getAsmInfo() const { return MAI; }
const MCRegisterInfo *getRegisterInfo() const { return MRI; }
const MCObjectFileInfo *getObjectFileInfo() const { return MOFI; }
const MCSubtargetInfo *getSubtargetInfo() const { return MSTI; }
CodeViewContext &getCVContext();
void setAllowTemporaryLabels(bool Value) { AllowTemporaryLabels = Value; }
void setUseNamesOnTempLabels(bool Value) { UseNamesOnTempLabels = Value; }
void reset();
MCInst *createMCInst();
MCSymbol *createLinkerPrivateTempSymbol();
MCSymbol *createTempSymbol();
MCSymbol *createTempSymbol(const Twine &Name, bool AlwaysAddSuffix = true);
MCSymbol *createNamedTempSymbol();
MCSymbol *createNamedTempSymbol(const Twine &Name);
MCSymbol *createDirectionalLocalSymbol(unsigned LocalLabelVal);
MCSymbol *getDirectionalLocalSymbol(unsigned LocalLabelVal, bool Before);
MCSymbol *getOrCreateSymbol(const Twine &Name);
MCSymbol *getOrCreateFrameAllocSymbol(StringRef FuncName, unsigned Idx);
MCSymbol *getOrCreateParentFrameOffsetSymbol(StringRef FuncName);
MCSymbol *getOrCreateLSDASymbol(StringRef FuncName);
MCSymbol *lookupSymbol(const Twine &Name) const;
void setSymbolValue(MCStreamer &Streamer, StringRef Sym, uint64_t Val);
const SymbolTable &getSymbols() const { return Symbols; }
MCSymbol *getInlineAsmLabel(StringRef Name) const {
return InlineAsmUsedLabelNames.lookup(Name);
}
void registerInlineAsmLabel(MCSymbol *Sym);
enum : unsigned {
GenericSectionID = ~0U
};
MCSectionMachO *getMachOSection(StringRef Segment, StringRef Section,
unsigned TypeAndAttributes,
unsigned Reserved2, SectionKind K,
const char *BeginSymName = nullptr);
MCSectionMachO *getMachOSection(StringRef Segment, StringRef Section,
unsigned TypeAndAttributes, SectionKind K,
const char *BeginSymName = nullptr) {
return getMachOSection(Segment, Section, TypeAndAttributes, 0, K,
BeginSymName);
}
MCSectionELF *getELFSection(const Twine &Section, unsigned Type,
unsigned Flags) {
return getELFSection(Section, Type, Flags, 0, "", false);
}
MCSectionELF *getELFSection(const Twine &Section, unsigned Type,
unsigned Flags, unsigned EntrySize) {
return getELFSection(Section, Type, Flags, EntrySize, "", false,
MCSection::NonUniqueID, nullptr);
}
MCSectionELF *getELFSection(const Twine &Section, unsigned Type,
unsigned Flags, unsigned EntrySize,
const Twine &Group, bool IsComdat) {
return getELFSection(Section, Type, Flags, EntrySize, Group, IsComdat,
MCSection::NonUniqueID, nullptr);
}
MCSectionELF *getELFSection(const Twine &Section, unsigned Type,
unsigned Flags, unsigned EntrySize,
const Twine &Group, bool IsComdat,
unsigned UniqueID,
const MCSymbolELF *LinkedToSym);
MCSectionELF *getELFSection(const Twine &Section, unsigned Type,
unsigned Flags, unsigned EntrySize,
const MCSymbolELF *Group, bool IsComdat,
unsigned UniqueID,
const MCSymbolELF *LinkedToSym);
MCSectionELF *getELFNamedSection(const Twine &Prefix, const Twine &Suffix,
unsigned Type, unsigned Flags,
unsigned EntrySize = 0);
MCSectionELF *createELFRelSection(const Twine &Name, unsigned Type,
unsigned Flags, unsigned EntrySize,
const MCSymbolELF *Group,
const MCSectionELF *RelInfoSection);
MCSectionELF *createELFGroupSection(const MCSymbolELF *Group, bool IsComdat);
void recordELFMergeableSectionInfo(StringRef SectionName, unsigned Flags,
unsigned UniqueID, unsigned EntrySize);
bool isELFImplicitMergeableSectionNamePrefix(StringRef Name);
bool isELFGenericMergeableSection(StringRef Name);
Optional<unsigned> getELFUniqueIDForEntsize(StringRef SectionName,
unsigned Flags,
unsigned EntrySize);
MCSectionGOFF *getGOFFSection(StringRef Section, SectionKind Kind,
MCSection *Parent, const MCExpr *SubsectionId);
MCSectionCOFF *getCOFFSection(StringRef Section, unsigned Characteristics,
SectionKind Kind, StringRef COMDATSymName,
int Selection,
unsigned UniqueID = GenericSectionID,
const char *BeginSymName = nullptr);
MCSectionCOFF *getCOFFSection(StringRef Section, unsigned Characteristics,
SectionKind Kind,
const char *BeginSymName = nullptr);
MCSectionCOFF *
getAssociativeCOFFSection(MCSectionCOFF *Sec, const MCSymbol *KeySym,
unsigned UniqueID = GenericSectionID);
MCSectionSPIRV *getSPIRVSection();
MCSectionWasm *getWasmSection(const Twine &Section, SectionKind K,
unsigned Flags = 0) {
return getWasmSection(Section, K, Flags, nullptr);
}
MCSectionWasm *getWasmSection(const Twine &Section, SectionKind K,
unsigned Flags, const char *BeginSymName) {
return getWasmSection(Section, K, Flags, "", ~0, BeginSymName);
}
MCSectionWasm *getWasmSection(const Twine &Section, SectionKind K,
unsigned Flags, const Twine &Group,
unsigned UniqueID) {
return getWasmSection(Section, K, Flags, Group, UniqueID, nullptr);
}
MCSectionWasm *getWasmSection(const Twine &Section, SectionKind K,
unsigned Flags, const Twine &Group,
unsigned UniqueID, const char *BeginSymName);
MCSectionWasm *getWasmSection(const Twine &Section, SectionKind K,
unsigned Flags, const MCSymbolWasm *Group,
unsigned UniqueID, const char *BeginSymName);
MCSectionDXContainer *getDXContainerSection(StringRef Section, SectionKind K);
bool hasXCOFFSection(StringRef Section,
XCOFF::CsectProperties CsectProp) const;
MCSectionXCOFF *getXCOFFSection(
StringRef Section, SectionKind K,
Optional<XCOFF::CsectProperties> CsectProp = None,
bool MultiSymbolsAllowed = false, const char *BeginSymName = nullptr,
Optional<XCOFF::DwarfSectionSubtypeFlags> DwarfSubtypeFlags = None);
MCSubtargetInfo &getSubtargetCopy(const MCSubtargetInfo &STI);
uint8_t getBBAddrMapVersion() const { return BBAddrMapVersion; }
StringRef getCompilationDir() const { return CompilationDir; }
void setCompilationDir(StringRef S) { CompilationDir = S.str(); }
void addDebugPrefixMapEntry(const std::string &From, const std::string &To);
void remapDebugPath(SmallVectorImpl<char> &Path);
void RemapDebugPaths();
const std::string &getMainFileName() const { return MainFileName; }
void setMainFileName(StringRef S) { MainFileName = std::string(S); }
Expected<unsigned> getDwarfFile(StringRef Directory, StringRef FileName,
unsigned FileNumber,
Optional<MD5::MD5Result> Checksum,
Optional<StringRef> Source, unsigned CUID);
bool isValidDwarfFileNumber(unsigned FileNumber, unsigned CUID = 0);
const std::map<unsigned, MCDwarfLineTable> &getMCDwarfLineTables() const {
return MCDwarfLineTablesCUMap;
}
MCDwarfLineTable &getMCDwarfLineTable(unsigned CUID) {
return MCDwarfLineTablesCUMap[CUID];
}
const MCDwarfLineTable &getMCDwarfLineTable(unsigned CUID) const {
auto I = MCDwarfLineTablesCUMap.find(CUID);
assert(I != MCDwarfLineTablesCUMap.end());
return I->second;
}
const SmallVectorImpl<MCDwarfFile> &getMCDwarfFiles(unsigned CUID = 0) {
return getMCDwarfLineTable(CUID).getMCDwarfFiles();
}
const SmallVectorImpl<std::string> &getMCDwarfDirs(unsigned CUID = 0) {
return getMCDwarfLineTable(CUID).getMCDwarfDirs();
}
unsigned getDwarfCompileUnitID() { return DwarfCompileUnitID; }
void setDwarfCompileUnitID(unsigned CUIndex) { DwarfCompileUnitID = CUIndex; }
void setMCLineTableRootFile(unsigned CUID, StringRef CompilationDir,
StringRef Filename,
Optional<MD5::MD5Result> Checksum,
Optional<StringRef> Source) {
getMCDwarfLineTable(CUID).setRootFile(CompilationDir, Filename, Checksum,
Source);
}
bool isDwarfMD5UsageConsistent(unsigned CUID) const {
return getMCDwarfLineTable(CUID).isMD5UsageConsistent();
}
void setCurrentDwarfLoc(unsigned FileNum, unsigned Line, unsigned Column,
unsigned Flags, unsigned Isa,
unsigned Discriminator) {
CurrentDwarfLoc.setFileNum(FileNum);
CurrentDwarfLoc.setLine(Line);
CurrentDwarfLoc.setColumn(Column);
CurrentDwarfLoc.setFlags(Flags);
CurrentDwarfLoc.setIsa(Isa);
CurrentDwarfLoc.setDiscriminator(Discriminator);
DwarfLocSeen = true;
}
void clearDwarfLocSeen() { DwarfLocSeen = false; }
bool getDwarfLocSeen() { return DwarfLocSeen; }
const MCDwarfLoc &getCurrentDwarfLoc() { return CurrentDwarfLoc; }
bool getGenDwarfForAssembly() { return GenDwarfForAssembly; }
void setGenDwarfForAssembly(bool Value) { GenDwarfForAssembly = Value; }
unsigned getGenDwarfFileNumber() { return GenDwarfFileNumber; }
EmitDwarfUnwindType emitDwarfUnwindInfo() const;
void setGenDwarfFileNumber(unsigned FileNumber) {
GenDwarfFileNumber = FileNumber;
}
void setGenDwarfRootFile(StringRef FileName, StringRef Buffer);
const SetVector<MCSection *> &getGenDwarfSectionSyms() {
return SectionsForRanges;
}
bool addGenDwarfSection(MCSection *Sec) {
return SectionsForRanges.insert(Sec);
}
void finalizeDwarfSections(MCStreamer &MCOS);
const std::vector<MCGenDwarfLabelEntry> &getMCGenDwarfLabelEntries() const {
return MCGenDwarfLabelEntries;
}
void addMCGenDwarfLabelEntry(const MCGenDwarfLabelEntry &E) {
MCGenDwarfLabelEntries.push_back(E);
}
void setDwarfDebugFlags(StringRef S) { DwarfDebugFlags = S; }
StringRef getDwarfDebugFlags() { return DwarfDebugFlags; }
void setDwarfDebugProducer(StringRef S) { DwarfDebugProducer = S; }
StringRef getDwarfDebugProducer() { return DwarfDebugProducer; }
void setDwarfFormat(dwarf::DwarfFormat f) { DwarfFormat = f; }
dwarf::DwarfFormat getDwarfFormat() const { return DwarfFormat; }
void setDwarfVersion(uint16_t v) { DwarfVersion = v; }
uint16_t getDwarfVersion() const { return DwarfVersion; }
char *getSecureLogFile() { return SecureLogFile; }
raw_fd_ostream *getSecureLog() { return SecureLog.get(); }
void setSecureLog(std::unique_ptr<raw_fd_ostream> Value) {
SecureLog = std::move(Value);
}
bool getSecureLogUsed() { return SecureLogUsed; }
void setSecureLogUsed(bool Value) { SecureLogUsed = Value; }
void *allocate(unsigned Size, unsigned Align = 8) {
return Allocator.Allocate(Size, Align);
}
void deallocate(void *Ptr) {}
bool hadError() { return HadError; }
void diagnose(const SMDiagnostic &SMD);
void reportError(SMLoc L, const Twine &Msg);
void reportWarning(SMLoc L, const Twine &Msg);
const MCAsmMacro *lookupMacro(StringRef Name) {
StringMap<MCAsmMacro>::iterator I = MacroMap.find(Name);
return (I == MacroMap.end()) ? nullptr : &I->getValue();
}
void defineMacro(StringRef Name, MCAsmMacro Macro) {
MacroMap.insert(std::make_pair(Name, std::move(Macro)));
}
void undefineMacro(StringRef Name) { MacroMap.erase(Name); }
MCPseudoProbeTable &getMCPseudoProbeTable() { return PseudoProbeTable; }
};
}
inline void *operator new(size_t Bytes, llvm::MCContext &C,
size_t Alignment = 8) noexcept {
return C.allocate(Bytes, Alignment);
}
inline void operator delete(void *Ptr, llvm::MCContext &C, size_t) noexcept {
C.deallocate(Ptr);
}
inline void *operator new[](size_t Bytes, llvm::MCContext &C,
size_t Alignment = 8) noexcept {
return C.allocate(Bytes, Alignment);
}
inline void operator delete[](void *Ptr, llvm::MCContext &C) noexcept {
C.deallocate(Ptr);
}
#endif