1f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===- MCContext.h - Machine Code Context -----------------------*- C++ -*-===// 2f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 3f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// The LLVM Compiler Infrastructure 4f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 5f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// This file is distributed under the University of Illinois Open Source 6f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// License. See LICENSE.TXT for details. 7f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 8f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===----------------------------------------------------------------------===// 9f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 10f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#ifndef LLVM_MC_MCCONTEXT_H 11f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#define LLVM_MC_MCCONTEXT_H 12f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 13f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/DenseMap.h" 14f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/SetVector.h" 15f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/SmallString.h" 16f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/SmallVector.h" 17f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/StringMap.h" 18f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/StringRef.h" 19f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/Twine.h" 20f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/BinaryFormat/Dwarf.h" 21f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/MC/MCDwarf.h" 22f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/MC/MCSubtargetInfo.h" 23f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/MC/SectionKind.h" 24f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/Support/Allocator.h" 25f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/Support/Compiler.h" 26f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/Support/raw_ostream.h" 27f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <algorithm> 28f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <cassert> 29f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <cstddef> 30f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <cstdint> 31f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <map> 32f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <memory> 33f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <string> 34f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <utility> 35f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <vector> 36f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 37f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotnamespace llvm { 38f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 39f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class CodeViewContext; 40f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class MCAsmInfo; 41f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class MCLabel; 42f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class MCObjectFileInfo; 43f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class MCRegisterInfo; 44f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class MCSection; 45f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class MCSectionCOFF; 46f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class MCSectionELF; 47f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class MCSectionMachO; 48f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class MCSectionWasm; 49f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class MCStreamer; 50f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class MCSymbol; 51f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class MCSymbolELF; 52f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class MCSymbolWasm; 53f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class SMLoc; 54f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class SourceMgr; 55f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 56f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Context object for machine code objects. This class owns all of the 57f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// sections that it creates. 58f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 59f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class MCContext { 60f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot public: 61f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot using SymbolTable = StringMap<MCSymbol *, BumpPtrAllocator &>; 62f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 63f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot private: 64f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The SourceMgr for this object, if any. 65f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const SourceMgr *SrcMgr; 66f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 67f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The SourceMgr for inline assembly, if any. 68f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SourceMgr *InlineSrcMgr; 69f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 70f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The MCAsmInfo for this target. 71f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const MCAsmInfo *MAI; 72f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 73f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The MCRegisterInfo for this target. 74f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const MCRegisterInfo *MRI; 75f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 76f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The MCObjectFileInfo for this target. 77f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const MCObjectFileInfo *MOFI; 78f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 79f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::unique_ptr<CodeViewContext> CVContext; 80f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 81f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Allocator object used for creating machine code objects. 82f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 83f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// We use a bump pointer allocator to avoid the need to track all allocated 84f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// objects. 85f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot BumpPtrAllocator Allocator; 86f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 87f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SpecificBumpPtrAllocator<MCSectionCOFF> COFFAllocator; 88f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SpecificBumpPtrAllocator<MCSectionELF> ELFAllocator; 89f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SpecificBumpPtrAllocator<MCSectionMachO> MachOAllocator; 90f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SpecificBumpPtrAllocator<MCSectionWasm> WasmAllocator; 91f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 92f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Bindings of names to symbols. 93f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SymbolTable Symbols; 94f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 95f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// A mapping from a local label number and an instance count to a symbol. 96f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// For example, in the assembly 97f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 1: 98f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 2: 99f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 1: 100f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// We have three labels represented by the pairs (1, 0), (2, 0) and (1, 1) 101f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DenseMap<std::pair<unsigned, unsigned>, MCSymbol *> LocalSymbols; 102f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 103f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Keeps tracks of names that were used both for used declared and 104f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// artificial symbols. The value is "true" if the name has been used for a 105f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// non-section symbol (there can be at most one of those, plus an unlimited 106f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// number of section symbols with the same name). 107f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringMap<bool, BumpPtrAllocator &> UsedNames; 108f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 109f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The next ID to dole out to an unnamed assembler temporary symbol with 110f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// a given prefix. 111f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringMap<unsigned> NextID; 112f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 113f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Instances of directional local labels. 114f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DenseMap<unsigned, MCLabel *> Instances; 115f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// NextInstance() creates the next instance of the directional local label 116f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// for the LocalLabelVal and adds it to the map if needed. 117f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned NextInstance(unsigned LocalLabelVal); 118f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// GetInstance() gets the current instance of the directional local label 119f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// for the LocalLabelVal and adds it to the map if needed. 120f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned GetInstance(unsigned LocalLabelVal); 121f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 122f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The file name of the log file from the environment variable 123f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// AS_SECURE_LOG_FILE. Which must be set before the .secure_log_unique 124f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// directive is used or it is an error. 125f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot char *SecureLogFile; 126f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The stream that gets written to for the .secure_log_unique directive. 127f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::unique_ptr<raw_fd_ostream> SecureLog; 128f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Boolean toggled when .secure_log_unique / .secure_log_reset is seen to 129f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// catch errors if .secure_log_unique appears twice without 130f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// .secure_log_reset appearing between them. 131f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool SecureLogUsed = false; 132f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 133f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The compilation directory to use for DW_AT_comp_dir. 134f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SmallString<128> CompilationDir; 135f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 136f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The main file name if passed in explicitly. 137f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::string MainFileName; 138f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 139f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The dwarf file and directory tables from the dwarf .file directive. 140f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// We now emit a line table for each compile unit. To reduce the prologue 141f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// size of each line table, the files and directories used by each compile 142f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// unit are separated. 143f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::map<unsigned, MCDwarfLineTable> MCDwarfLineTablesCUMap; 144f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 145f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The current dwarf line information from the last dwarf .loc directive. 146f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCDwarfLoc CurrentDwarfLoc; 147f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool DwarfLocSeen = false; 148f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 149f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Generate dwarf debugging info for assembly source files. 150f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool GenDwarfForAssembly = false; 151f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 152f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The current dwarf file number when generate dwarf debugging info for 153f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// assembly source files. 154f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned GenDwarfFileNumber = 0; 155f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 156f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Sections for generating the .debug_ranges and .debug_aranges sections. 157f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SetVector<MCSection *> SectionsForRanges; 158f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 159f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The information gathered from labels that will have dwarf label 160f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// entries when generating dwarf assembly source files. 161f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::vector<MCGenDwarfLabelEntry> MCGenDwarfLabelEntries; 162f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 163f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The string to embed in the debug information for the compile unit, if 164f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// non-empty. 165f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef DwarfDebugFlags; 166f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 167f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The string to embed in as the dwarf AT_producer for the compile unit, if 168f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// non-empty. 169f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef DwarfDebugProducer; 170f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 171f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The maximum version of dwarf that we should emit. 172f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint16_t DwarfVersion = 4; 173f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 174f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Honor temporary labels, this is useful for debugging semantic 175f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// differences between temporary and non-temporary labels (primarily on 176f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Darwin). 177f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool AllowTemporaryLabels = true; 178f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool UseNamesOnTempLabels = true; 179f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 180f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The Compile Unit ID that we are currently processing. 181f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned DwarfCompileUnitID = 0; 182f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 183f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot struct ELFSectionKey { 184f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::string SectionName; 185f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef GroupName; 186f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned UniqueID; 187f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 188f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ELFSectionKey(StringRef SectionName, StringRef GroupName, 189f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned UniqueID) 190f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot : SectionName(SectionName), GroupName(GroupName), UniqueID(UniqueID) { 191f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 192f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 193f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool operator<(const ELFSectionKey &Other) const { 194f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if (SectionName != Other.SectionName) 195f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return SectionName < Other.SectionName; 196f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if (GroupName != Other.GroupName) 197f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return GroupName < Other.GroupName; 198f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return UniqueID < Other.UniqueID; 199f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 200f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 201f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 202f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot struct COFFSectionKey { 203f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::string SectionName; 204f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef GroupName; 205f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot int SelectionKey; 206f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned UniqueID; 207f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 208f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot COFFSectionKey(StringRef SectionName, StringRef GroupName, 209f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot int SelectionKey, unsigned UniqueID) 210f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot : SectionName(SectionName), GroupName(GroupName), 211f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SelectionKey(SelectionKey), UniqueID(UniqueID) {} 212f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 213f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool operator<(const COFFSectionKey &Other) const { 214f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if (SectionName != Other.SectionName) 215f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return SectionName < Other.SectionName; 216f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if (GroupName != Other.GroupName) 217f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return GroupName < Other.GroupName; 218f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if (SelectionKey != Other.SelectionKey) 219f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return SelectionKey < Other.SelectionKey; 220f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return UniqueID < Other.UniqueID; 221f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 222f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 223f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 224f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot struct WasmSectionKey { 225f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::string SectionName; 226f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef GroupName; 227f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned UniqueID; 228f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 229f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot WasmSectionKey(StringRef SectionName, StringRef GroupName, 230f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned UniqueID) 231f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot : SectionName(SectionName), GroupName(GroupName), UniqueID(UniqueID) { 232f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 233f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 234f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool operator<(const WasmSectionKey &Other) const { 235f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if (SectionName != Other.SectionName) 236f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return SectionName < Other.SectionName; 237f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if (GroupName != Other.GroupName) 238f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return GroupName < Other.GroupName; 239f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return UniqueID < Other.UniqueID; 240f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 241f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 242f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 243f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringMap<MCSectionMachO *> MachOUniquingMap; 244f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::map<ELFSectionKey, MCSectionELF *> ELFUniquingMap; 245f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::map<COFFSectionKey, MCSectionCOFF *> COFFUniquingMap; 246f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::map<WasmSectionKey, MCSectionWasm *> WasmUniquingMap; 247f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringMap<bool> RelSecNames; 248f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 249f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SpecificBumpPtrAllocator<MCSubtargetInfo> MCSubtargetAllocator; 250f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 251f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Do automatic reset in destructor 252f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool AutoReset; 253f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 254f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool HadError = false; 255f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 256f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSymbol *createSymbolImpl(const StringMapEntry<bool> *Name, 257f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool CanBeUnnamed); 258f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSymbol *createSymbol(StringRef Name, bool AlwaysAddSuffix, 259f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool IsTemporary); 260f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 261f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSymbol *getOrCreateDirectionalLocalSymbol(unsigned LocalLabelVal, 262f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned Instance); 263f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 264f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSectionELF *createELFSectionImpl(StringRef Section, unsigned Type, 265f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned Flags, SectionKind K, 266f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned EntrySize, 267f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const MCSymbolELF *Group, 268f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned UniqueID, 269f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const MCSymbolELF *Associated); 270f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 271f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot public: 272f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot explicit MCContext(const MCAsmInfo *MAI, const MCRegisterInfo *MRI, 273f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const MCObjectFileInfo *MOFI, 274f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const SourceMgr *Mgr = nullptr, bool DoAutoReset = true); 275f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCContext(const MCContext &) = delete; 276f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCContext &operator=(const MCContext &) = delete; 277f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ~MCContext(); 278f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 279f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const SourceMgr *getSourceManager() const { return SrcMgr; } 280f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 281f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setInlineSourceManager(SourceMgr *SM) { InlineSrcMgr = SM; } 282f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 283f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const MCAsmInfo *getAsmInfo() const { return MAI; } 284f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 285f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const MCRegisterInfo *getRegisterInfo() const { return MRI; } 286f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 287f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const MCObjectFileInfo *getObjectFileInfo() const { return MOFI; } 288f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 289f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot CodeViewContext &getCVContext(); 290f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 291f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setAllowTemporaryLabels(bool Value) { AllowTemporaryLabels = Value; } 292f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setUseNamesOnTempLabels(bool Value) { UseNamesOnTempLabels = Value; } 293f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 294f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \name Module Lifetime Management 295f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// @{ 296f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 297f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// reset - return object to right after construction state to prepare 298f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// to process a new module 299f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void reset(); 300f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 301f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// @} 302f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 303f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \name Symbol Management 304f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// @{ 305f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 306f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Create and return a new linker temporary symbol with a unique but 307f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// unspecified name. 308f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSymbol *createLinkerPrivateTempSymbol(); 309f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 310f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Create and return a new assembler temporary symbol with a unique but 311f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// unspecified name. 312f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSymbol *createTempSymbol(bool CanBeUnnamed = true); 313f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 314f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSymbol *createTempSymbol(const Twine &Name, bool AlwaysAddSuffix, 315f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool CanBeUnnamed = true); 316f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 317f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Create the definition of a directional local symbol for numbered label 318f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// (used for "1:" definitions). 319f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSymbol *createDirectionalLocalSymbol(unsigned LocalLabelVal); 320f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 321f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Create and return a directional local symbol for numbered label (used 322f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// for "1b" or 1f" references). 323f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSymbol *getDirectionalLocalSymbol(unsigned LocalLabelVal, bool Before); 324f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 325f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Lookup the symbol inside with the specified \p Name. If it exists, 326f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// return it. If not, create a forward reference and return it. 327f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 328f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \param Name - The symbol name, which must be unique across all symbols. 329f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSymbol *getOrCreateSymbol(const Twine &Name); 330f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 331f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Gets a symbol that will be defined to the final stack offset of a local 332f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// variable after codegen. 333f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 334f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \param Idx - The index of a local variable passed to @llvm.localescape. 335f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSymbol *getOrCreateFrameAllocSymbol(StringRef FuncName, unsigned Idx); 336f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 337f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSymbol *getOrCreateParentFrameOffsetSymbol(StringRef FuncName); 338f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 339f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSymbol *getOrCreateLSDASymbol(StringRef FuncName); 340f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 341f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Get the symbol for \p Name, or null. 342f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSymbol *lookupSymbol(const Twine &Name) const; 343f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 344f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Set value for a symbol. 345f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setSymbolValue(MCStreamer &Streamer, StringRef Sym, uint64_t Val); 346f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 347f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// getSymbols - Get a reference for the symbol table for clients that 348f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// want to, for example, iterate over all symbols. 'const' because we 349f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// still want any modifications to the table itself to use the MCContext 350f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// APIs. 351f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const SymbolTable &getSymbols() const { return Symbols; } 352f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 353f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// @} 354f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 355f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \name Section Management 356f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// @{ 357f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 358f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot enum : unsigned { 359f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Pass this value as the UniqueID during section creation to get the 360f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// generic section with the given name and characteristics. The usual 361f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// sections such as .text use this ID. 362f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot GenericSectionID = ~0U 363f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 364f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 365f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return the MCSection for the specified mach-o section. This requires 366f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// the operands to be valid. 367f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSectionMachO *getMachOSection(StringRef Segment, StringRef Section, 368f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned TypeAndAttributes, 369f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned Reserved2, SectionKind K, 370f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const char *BeginSymName = nullptr); 371f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 372f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSectionMachO *getMachOSection(StringRef Segment, StringRef Section, 373f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned TypeAndAttributes, SectionKind K, 374f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const char *BeginSymName = nullptr) { 375f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return getMachOSection(Segment, Section, TypeAndAttributes, 0, K, 376f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot BeginSymName); 377f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 378f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 379f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSectionELF *getELFSection(const Twine &Section, unsigned Type, 380f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned Flags) { 381f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return getELFSection(Section, Type, Flags, 0, ""); 382f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 383f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 384f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSectionELF *getELFSection(const Twine &Section, unsigned Type, 385f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned Flags, unsigned EntrySize, 386f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const Twine &Group) { 387f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return getELFSection(Section, Type, Flags, EntrySize, Group, ~0); 388f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 389f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 390f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSectionELF *getELFSection(const Twine &Section, unsigned Type, 391f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned Flags, unsigned EntrySize, 392f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const Twine &Group, unsigned UniqueID) { 393f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return getELFSection(Section, Type, Flags, EntrySize, Group, UniqueID, 394f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot nullptr); 395f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 396f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 397f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSectionELF *getELFSection(const Twine &Section, unsigned Type, 398f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned Flags, unsigned EntrySize, 399f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const Twine &Group, unsigned UniqueID, 400f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const MCSymbolELF *Associated); 401f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 402f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSectionELF *getELFSection(const Twine &Section, unsigned Type, 403f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned Flags, unsigned EntrySize, 404f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const MCSymbolELF *Group, unsigned UniqueID, 405f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const MCSymbolELF *Associated); 406f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 407f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Get a section with the provided group identifier. This section is 408f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// named by concatenating \p Prefix with '.' then \p Suffix. The \p Type 409f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// describes the type of the section and \p Flags are used to further 410f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// configure this named section. 411f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSectionELF *getELFNamedSection(const Twine &Prefix, const Twine &Suffix, 412f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned Type, unsigned Flags, 413f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned EntrySize = 0); 414f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 415f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSectionELF *createELFRelSection(const Twine &Name, unsigned Type, 416f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned Flags, unsigned EntrySize, 417f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const MCSymbolELF *Group, 418f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const MCSectionELF *RelInfoSection); 419f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 420f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void renameELFSection(MCSectionELF *Section, StringRef Name); 421f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 422f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSectionELF *createELFGroupSection(const MCSymbolELF *Group); 423f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 424f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSectionCOFF *getCOFFSection(StringRef Section, unsigned Characteristics, 425f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SectionKind Kind, StringRef COMDATSymName, 426f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot int Selection, 427f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned UniqueID = GenericSectionID, 428f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const char *BeginSymName = nullptr); 429f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 430f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSectionCOFF *getCOFFSection(StringRef Section, unsigned Characteristics, 431f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SectionKind Kind, 432f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const char *BeginSymName = nullptr); 433f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 434f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSectionCOFF *getCOFFSection(StringRef Section); 435f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 436f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Gets or creates a section equivalent to Sec that is associated with the 437f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// section containing KeySym. For example, to create a debug info section 438f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// associated with an inline function, pass the normal debug info section 439f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// as Sec and the function symbol as KeySym. 440f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSectionCOFF * 441f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot getAssociativeCOFFSection(MCSectionCOFF *Sec, const MCSymbol *KeySym, 442f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned UniqueID = GenericSectionID); 443f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 444f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSectionWasm *getWasmSection(const Twine &Section, unsigned Type) { 445f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return getWasmSection(Section, Type, nullptr); 446f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 447f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 448f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSectionWasm *getWasmSection(const Twine &Section, unsigned Type, 449f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const char *BeginSymName) { 450f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return getWasmSection(Section, Type, "", ~0, BeginSymName); 451f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 452f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 453f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSectionWasm *getWasmSection(const Twine &Section, unsigned Type, 454f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const Twine &Group, unsigned UniqueID) { 455f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return getWasmSection(Section, Type, Group, UniqueID, nullptr); 456f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 457f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 458f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSectionWasm *getWasmSection(const Twine &Section, unsigned Type, 459f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const Twine &Group, unsigned UniqueID, 460f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const char *BeginSymName); 461f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 462f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSectionWasm *getWasmSection(const Twine &Section, unsigned Type, 463f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const MCSymbolWasm *Group, unsigned UniqueID, 464f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const char *BeginSymName); 465f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 466f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Create and save a copy of STI and return a reference to the copy. 467f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSubtargetInfo &getSubtargetCopy(const MCSubtargetInfo &STI); 468f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 469f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// @} 470f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 471f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \name Dwarf Management 472f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// @{ 473f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 474f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Get the compilation directory for DW_AT_comp_dir 475f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The compilation directory should be set with \c setCompilationDir before 476f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// calling this function. If it is unset, an empty string will be returned. 477f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef getCompilationDir() const { return CompilationDir; } 478f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 479f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Set the compilation directory for DW_AT_comp_dir 480f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setCompilationDir(StringRef S) { CompilationDir = S.str(); } 481f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 482f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Get the main file name for use in error messages and debug 483f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// info. This can be set to ensure we've got the correct file name 484f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// after preprocessing or for -save-temps. 485f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const std::string &getMainFileName() const { return MainFileName; } 486f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 487f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Set the main file name and override the default. 488f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setMainFileName(StringRef S) { MainFileName = S; } 489f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 490f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Creates an entry in the dwarf file and directory tables. 491f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned getDwarfFile(StringRef Directory, StringRef FileName, 492f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned FileNumber, unsigned CUID); 493f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 494f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isValidDwarfFileNumber(unsigned FileNumber, unsigned CUID = 0); 495f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 496f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const std::map<unsigned, MCDwarfLineTable> &getMCDwarfLineTables() const { 497f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return MCDwarfLineTablesCUMap; 498f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 499f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 500f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCDwarfLineTable &getMCDwarfLineTable(unsigned CUID) { 501f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return MCDwarfLineTablesCUMap[CUID]; 502f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 503f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 504f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const MCDwarfLineTable &getMCDwarfLineTable(unsigned CUID) const { 505f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot auto I = MCDwarfLineTablesCUMap.find(CUID); 506f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(I != MCDwarfLineTablesCUMap.end()); 507f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return I->second; 508f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 509f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 510f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const SmallVectorImpl<MCDwarfFile> &getMCDwarfFiles(unsigned CUID = 0) { 511f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return getMCDwarfLineTable(CUID).getMCDwarfFiles(); 512f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 513f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 514f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const SmallVectorImpl<std::string> &getMCDwarfDirs(unsigned CUID = 0) { 515f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return getMCDwarfLineTable(CUID).getMCDwarfDirs(); 516f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 517f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 518f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool hasMCLineSections() const { 519f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot for (const auto &Table : MCDwarfLineTablesCUMap) 520f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if (!Table.second.getMCDwarfFiles().empty() || Table.second.getLabel()) 521f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return true; 522f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return false; 523f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 524f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 525f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned getDwarfCompileUnitID() { return DwarfCompileUnitID; } 526f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 527f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setDwarfCompileUnitID(unsigned CUIndex) { 528f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DwarfCompileUnitID = CUIndex; 529f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 530f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 531f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setMCLineTableCompilationDir(unsigned CUID, StringRef CompilationDir) { 532f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot getMCDwarfLineTable(CUID).setCompilationDir(CompilationDir); 533f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 534f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 535f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Saves the information from the currently parsed dwarf .loc directive 536f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// and sets DwarfLocSeen. When the next instruction is assembled an entry 537f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// in the line number table with this information and the address of the 538f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// instruction will be created. 539f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setCurrentDwarfLoc(unsigned FileNum, unsigned Line, unsigned Column, 540f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned Flags, unsigned Isa, 541f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned Discriminator) { 542f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot CurrentDwarfLoc.setFileNum(FileNum); 543f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot CurrentDwarfLoc.setLine(Line); 544f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot CurrentDwarfLoc.setColumn(Column); 545f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot CurrentDwarfLoc.setFlags(Flags); 546f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot CurrentDwarfLoc.setIsa(Isa); 547f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot CurrentDwarfLoc.setDiscriminator(Discriminator); 548f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DwarfLocSeen = true; 549f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 550f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 551f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void clearDwarfLocSeen() { DwarfLocSeen = false; } 552f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 553f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool getDwarfLocSeen() { return DwarfLocSeen; } 554f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const MCDwarfLoc &getCurrentDwarfLoc() { return CurrentDwarfLoc; } 555f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 556f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool getGenDwarfForAssembly() { return GenDwarfForAssembly; } 557f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setGenDwarfForAssembly(bool Value) { GenDwarfForAssembly = Value; } 558f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned getGenDwarfFileNumber() { return GenDwarfFileNumber; } 559f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 560f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setGenDwarfFileNumber(unsigned FileNumber) { 561f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot GenDwarfFileNumber = FileNumber; 562f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 563f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 564f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const SetVector<MCSection *> &getGenDwarfSectionSyms() { 565f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return SectionsForRanges; 566f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 567f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 568f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool addGenDwarfSection(MCSection *Sec) { 569f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return SectionsForRanges.insert(Sec); 570f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 571f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 572f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void finalizeDwarfSections(MCStreamer &MCOS); 573f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 574f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const std::vector<MCGenDwarfLabelEntry> &getMCGenDwarfLabelEntries() const { 575f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return MCGenDwarfLabelEntries; 576f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 577f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 578f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void addMCGenDwarfLabelEntry(const MCGenDwarfLabelEntry &E) { 579f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCGenDwarfLabelEntries.push_back(E); 580f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 581f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 582f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setDwarfDebugFlags(StringRef S) { DwarfDebugFlags = S; } 583f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef getDwarfDebugFlags() { return DwarfDebugFlags; } 584f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 585f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setDwarfDebugProducer(StringRef S) { DwarfDebugProducer = S; } 586f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef getDwarfDebugProducer() { return DwarfDebugProducer; } 587f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 588f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot dwarf::DwarfFormat getDwarfFormat() const { 589f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // TODO: Support DWARF64 590f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return dwarf::DWARF32; 591f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 592f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 593f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setDwarfVersion(uint16_t v) { DwarfVersion = v; } 594f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint16_t getDwarfVersion() const { return DwarfVersion; } 595f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 596f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// @} 597f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 598f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot char *getSecureLogFile() { return SecureLogFile; } 599f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot raw_fd_ostream *getSecureLog() { return SecureLog.get(); } 600f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 601f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setSecureLog(std::unique_ptr<raw_fd_ostream> Value) { 602f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SecureLog = std::move(Value); 603f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 604f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 605f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool getSecureLogUsed() { return SecureLogUsed; } 606f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setSecureLogUsed(bool Value) { SecureLogUsed = Value; } 607f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 608f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void *allocate(unsigned Size, unsigned Align = 8) { 609f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Allocator.Allocate(Size, Align); 610f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 611f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 612f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void deallocate(void *Ptr) {} 613f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 614f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool hadError() { return HadError; } 615f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void reportError(SMLoc L, const Twine &Msg); 616f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Unrecoverable error has occurred. Display the best diagnostic we can 617f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // and bail via exit(1). For now, most MC backend errors are unrecoverable. 618f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // FIXME: We should really do something about that. 619f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot LLVM_ATTRIBUTE_NORETURN void reportFatalError(SMLoc L, 620f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const Twine &Msg); 621f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 622f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 623f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} // end namespace llvm 624f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 625f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// operator new and delete aren't allowed inside namespaces. 626f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// The throw specifications are mandated by the standard. 627f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \brief Placement new for using the MCContext's allocator. 628f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 629f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// This placement form of operator new uses the MCContext's allocator for 630f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// obtaining memory. It is a non-throwing new, which means that it returns 631f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// null on error. (If that is what the allocator does. The current does, so if 632f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// this ever changes, this operator will have to be changed, too.) 633f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// Usage looks like this (assuming there's an MCContext 'Context' in scope): 634f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \code 635f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// // Default alignment (8) 636f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// IntegerLiteral *Ex = new (Context) IntegerLiteral(arguments); 637f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// // Specific alignment 638f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// IntegerLiteral *Ex2 = new (Context, 4) IntegerLiteral(arguments); 639f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \endcode 640f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// Please note that you cannot use delete on the pointer; it must be 641f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// deallocated using an explicit destructor call followed by 642f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \c Context.Deallocate(Ptr). 643f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 644f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \param Bytes The number of bytes to allocate. Calculated by the compiler. 645f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \param C The MCContext that provides the allocator. 646f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \param Alignment The alignment of the allocated memory (if the underlying 647f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// allocator supports it). 648f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \return The allocated memory. Could be NULL. 649f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotinline void *operator new(size_t Bytes, llvm::MCContext &C, 650f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot size_t Alignment = 8) noexcept { 651f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return C.allocate(Bytes, Alignment); 652f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} 653f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \brief Placement delete companion to the new above. 654f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 655f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// This operator is just a companion to the new above. There is no way of 656f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// invoking it directly; see the new operator for more details. This operator 657f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// is called implicitly by the compiler if a placement new expression using 658f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// the MCContext throws in the object constructor. 659f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotinline void operator delete(void *Ptr, llvm::MCContext &C, size_t) noexcept { 660f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot C.deallocate(Ptr); 661f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} 662f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 663f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// This placement form of operator new[] uses the MCContext's allocator for 664f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// obtaining memory. It is a non-throwing new[], which means that it returns 665f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// null on error. 666f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// Usage looks like this (assuming there's an MCContext 'Context' in scope): 667f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \code 668f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// // Default alignment (8) 669f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// char *data = new (Context) char[10]; 670f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// // Specific alignment 671f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// char *data = new (Context, 4) char[10]; 672f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \endcode 673f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// Please note that you cannot use delete on the pointer; it must be 674f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// deallocated using an explicit destructor call followed by 675f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \c Context.Deallocate(Ptr). 676f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 677f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \param Bytes The number of bytes to allocate. Calculated by the compiler. 678f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \param C The MCContext that provides the allocator. 679f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \param Alignment The alignment of the allocated memory (if the underlying 680f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// allocator supports it). 681f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \return The allocated memory. Could be NULL. 682f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotinline void *operator new[](size_t Bytes, llvm::MCContext &C, 683f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot size_t Alignment = 8) noexcept { 684f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return C.allocate(Bytes, Alignment); 685f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} 686f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 687f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \brief Placement delete[] companion to the new[] above. 688f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 689f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// This operator is just a companion to the new[] above. There is no way of 690f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// invoking it directly; see the new[] operator for more details. This operator 691f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// is called implicitly by the compiler if a placement new[] expression using 692f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// the MCContext throws in the object constructor. 693f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotinline void operator delete[](void *Ptr, llvm::MCContext &C) noexcept { 694f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot C.deallocate(Ptr); 695f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} 696f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 697f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#endif // LLVM_MC_MCCONTEXT_H 698