MCContext.h revision 3de61b4c0144748e4b9157e2c22fe4ea685981a2
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===- MCContext.h - Machine Code Context -----------------------*- C++ -*-===// 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The LLVM Compiler Infrastructure 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// License. See LICENSE.TXT for details. 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===----------------------------------------------------------------------===// 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef LLVM_MC_MCCONTEXT_H 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define LLVM_MC_MCCONTEXT_H 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "llvm/ADT/DenseMap.h" 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "llvm/ADT/StringMap.h" 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "llvm/MC/MCDwarf.h" 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "llvm/MC/SectionKind.h" 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "llvm/Support/Allocator.h" 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "llvm/Support/Compiler.h" 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "llvm/Support/raw_ostream.h" 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <map> 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <vector> // FIXME: Shouldn't be needed. 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace llvm { 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) class MCAsmInfo; 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) class MCExpr; 2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) class MCSection; 2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) class MCSymbol; 2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) class MCLabel; 2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) class MCDwarfFile; 3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) class MCDwarfLoc; 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) class MCObjectFileInfo; 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) class MCRegisterInfo; 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) class MCLineSection; 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) class SMLoc; 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) class StringRef; 3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) class Twine; 3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) class MCSectionMachO; 3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) class MCSectionELF; 3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) /// MCContext - Context object for machine code objects. This class owns all 4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) /// of the sections that it creates. 4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) /// 4302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch class MCContext { 443c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch MCContext(const MCContext&) LLVM_DELETED_FUNCTION; 4502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch MCContext &operator=(const MCContext&) LLVM_DELETED_FUNCTION; 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public: 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) typedef StringMap<MCSymbol*, BumpPtrAllocator&> SymbolTable; 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) private: 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// The SourceMgr for this object, if any. 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const SourceMgr *SrcMgr; 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// The MCAsmInfo for this target. 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const MCAsmInfo &MAI; 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// The MCRegisterInfo for this target. 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const MCRegisterInfo &MRI; 57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// The MCObjectFileInfo for this target. 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const MCObjectFileInfo *MOFI; 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// Allocator - Allocator object used for creating machine code objects. 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// We use a bump pointer allocator to avoid the need to track all allocated 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// objects. 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) BumpPtrAllocator Allocator; 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// Symbols - Bindings of names to symbols. 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SymbolTable Symbols; 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// UsedNames - Keeps tracks of names that were used both for used declared 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// and artificial symbols. 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) StringMap<bool, BumpPtrAllocator&> UsedNames; 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// NextUniqueID - The next ID to dole out to an unnamed assembler temporary 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// symbol. 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned NextUniqueID; 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// Instances of directional local labels. 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DenseMap<unsigned, MCLabel *> Instances; 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// NextInstance() creates the next instance of the directional local label 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// for the LocalLabelVal and adds it to the map if needed. 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned NextInstance(int64_t LocalLabelVal); 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// GetInstance() gets the current instance of the directional local label 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// for the LocalLabelVal and adds it to the map if needed. 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned GetInstance(int64_t LocalLabelVal); 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 87e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch /// The file name of the log file from the environment variable 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// AS_SECURE_LOG_FILE. Which must be set before the .secure_log_unique 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// directive is used or it is an error. 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) char *SecureLogFile; 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// The stream that gets written to for the .secure_log_unique directive. 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) raw_ostream *SecureLog; 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// Boolean toggled when .secure_log_unique / .secure_log_reset is seen to 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// catch errors if .secure_log_unique appears twice without 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// .secure_log_reset appearing between them. 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool SecureLogUsed; 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// The compilation directory to use for DW_AT_comp_dir. 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) std::string CompilationDir; 1005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// The main file name if passed in explicitly. 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) std::string MainFileName; 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// The dwarf file and directory tables from the dwarf .file directive. 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// We now emit a line table for each compile unit. To reduce the prologue 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// size of each line table, the files and directories used by each compile 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// unit are separated. 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) typedef std::map<unsigned, std::vector<MCDwarfFile *> > MCDwarfFilesMap; 1095267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) MCDwarfFilesMap MCDwarfFilesCUMap; 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) std::map<unsigned, std::vector<StringRef> > MCDwarfDirsCUMap; 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) /// The current dwarf line information from the last dwarf .loc directive. 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MCDwarfLoc CurrentDwarfLoc; 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool DwarfLocSeen; 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// Generate dwarf debugging info for assembly source files. 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool GenDwarfForAssembly; 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) /// The current dwarf file number when generate dwarf debugging info for 1205267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) /// assembly source files. 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned GenDwarfFileNumber; 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// The default initial text section that we generate dwarf debugging line 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// info for when generating dwarf assembly source files. 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const MCSection *GenDwarfSection; 1265267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) /// Symbols created for the start and end of this section. 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MCSymbol *GenDwarfSectionStartSym, *GenDwarfSectionEndSym; 1285267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// The information gathered from labels that will have dwarf label 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// entries when generating dwarf assembly source files. 1315267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) std::vector<const MCGenDwarfLabelEntry *> MCGenDwarfLabelEntries; 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// The string to embed in the debug information for the compile unit, if 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// non-empty. 135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) StringRef DwarfDebugFlags; 136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) /// The string to embed in as the dwarf AT_producer for the compile unit, if 138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) /// non-empty. 139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) StringRef DwarfDebugProducer; 140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) /// Honor temporary labels, this is useful for debugging semantic 142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) /// differences between temporary and non-temporary labels (primarily on 143591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch /// Darwin). 144591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch bool AllowTemporaryLabels; 145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 146926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) /// The dwarf line information from the .loc directives for the sections 147926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) /// with assembled machine instructions have after seeing .loc directives. 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DenseMap<const MCSection *, MCLineSection *> MCLineSections; 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// We need a deterministic iteration order, so we remember the order 150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) /// the elements were added. 151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) std::vector<const MCSection *> MCLineSectionOrder; 152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) /// The Compile Unit ID that we are currently processing. 153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) unsigned DwarfCompileUnitID; 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// The line table start symbol for each Compile Unit. 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DenseMap<unsigned, MCSymbol *> MCLineTableSymbols; 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void *MachOUniquingMap, *ELFUniquingMap, *COFFUniquingMap; 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// Do automatic reset in destructor 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool AutoReset; 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MCSymbol *CreateSymbol(StringRef Name); 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public: 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) explicit MCContext(const MCAsmInfo &MAI, const MCRegisterInfo &MRI, 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const MCObjectFileInfo *MOFI, const SourceMgr *Mgr = 0, 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool DoAutoReset = true); 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ~MCContext(); 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const SourceMgr *getSourceManager() const { return SrcMgr; } 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const MCAsmInfo &getAsmInfo() const { return MAI; } 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const MCRegisterInfo &getRegisterInfo() const { return MRI; } 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const MCObjectFileInfo *getObjectFileInfo() const { return MOFI; } 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setAllowTemporaryLabels(bool Value) { AllowTemporaryLabels = Value; } 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// @name Module Lifetime Management 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// @{ 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// reset - return object to right after construction state to prepare 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// to process a new module 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void reset(); 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// @} 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) /// @name Symbol Management 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// @{ 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// CreateTempSymbol - Create and return a new assembler temporary symbol 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// with a unique but unspecified name. 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MCSymbol *CreateTempSymbol(); 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// getUniqueSymbolID() - Return a unique identifier for use in constructing 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// symbol names. 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned getUniqueSymbolID() { return NextUniqueID++; } 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// CreateDirectionalLocalSymbol - Create the definition of a directional 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// local symbol for numbered label (used for "1:" definitions). 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MCSymbol *CreateDirectionalLocalSymbol(int64_t LocalLabelVal); 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// GetDirectionalLocalSymbol - Create and return a directional local 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// symbol for numbered label (used for "1b" or 1f" references). 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MCSymbol *GetDirectionalLocalSymbol(int64_t LocalLabelVal, int bORf); 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// GetOrCreateSymbol - Lookup the symbol inside with the specified 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// @p Name. If it exists, return it. If not, create a forward 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// reference and return it. 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// @param Name - The symbol name, which must be unique across all symbols. 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MCSymbol *GetOrCreateSymbol(StringRef Name); 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MCSymbol *GetOrCreateSymbol(const Twine &Name); 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch /// LookupSymbol - Get the symbol for \p Name, or null. 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MCSymbol *LookupSymbol(StringRef Name) const; 218e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) MCSymbol *LookupSymbol(const Twine &Name) const; 219e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 220e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) /// getSymbols - Get a reference for the symbol table for clients that 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// want to, for example, iterate over all symbols. 'const' because we 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// still want any modifications to the table itself to use the MCContext 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// APIs. 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const SymbolTable &getSymbols() const { 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Symbols; 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// @} 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// @name Section Management 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// @{ 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// getMachOSection - Return the MCSection for the specified mach-o section. 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// This requires the operands to be valid. 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const MCSectionMachO *getMachOSection(StringRef Segment, 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) StringRef Section, 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned TypeAndAttributes, 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned Reserved2, 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SectionKind K); 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const MCSectionMachO *getMachOSection(StringRef Segment, 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) StringRef Section, 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned TypeAndAttributes, 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SectionKind K) { 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return getMachOSection(Segment, Section, TypeAndAttributes, 0, K); 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const MCSectionELF *getELFSection(StringRef Section, unsigned Type, 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned Flags, SectionKind Kind); 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const MCSectionELF *getELFSection(StringRef Section, unsigned Type, 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned Flags, SectionKind Kind, 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned EntrySize, StringRef Group); 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const MCSectionELF *CreateELFGroupSection(); 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const MCSection *getCOFFSection(StringRef Section, unsigned Characteristics, 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int Selection, SectionKind Kind); 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const MCSection *getCOFFSection(StringRef Section, unsigned Characteristics, 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SectionKind Kind) { 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return getCOFFSection (Section, Characteristics, 0, Kind); 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// @} 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// @name Dwarf Management 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// @{ 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// \brief Get the compilation directory for DW_AT_comp_dir 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// This can be overridden by clients which want to control the reported 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// compilation directory and have it be something other than the current 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// working directory. 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const std::string &getCompilationDir() const { return CompilationDir; } 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// \brief Set the compilation directory for DW_AT_comp_dir 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// Override the default (CWD) compilation directory. 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setCompilationDir(StringRef S) { CompilationDir = S.str(); } 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// \brief Get the main file name for use in error messages and debug 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// info. This can be set to ensure we've got the correct file name 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// after preprocessing or for -save-temps. 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const std::string &getMainFileName() const { return MainFileName; } 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// \brief Set the main file name and override the default. 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setMainFileName(StringRef S) { MainFileName = S.str(); } 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// GetDwarfFile - creates an entry in the dwarf file and directory tables. 2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned GetDwarfFile(StringRef Directory, StringRef FileName, 2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned FileNumber, unsigned CUID); 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isValidDwarfFileNumber(unsigned FileNumber, unsigned CUID = 0); 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool hasDwarfFiles() const { 2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Traverse MCDwarfFilesCUMap and check whether each entry is empty. 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MCDwarfFilesMap::const_iterator MapB, MapE; 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (MapB = MCDwarfFilesCUMap.begin(), MapE = MCDwarfFilesCUMap.end(); 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MapB != MapE; MapB++) 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!MapB->second.empty()) 3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const std::vector<MCDwarfFile *> &getMCDwarfFiles(unsigned CUID = 0) { 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return MCDwarfFilesCUMap[CUID]; 306f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) } 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const std::vector<StringRef> &getMCDwarfDirs(unsigned CUID = 0) { 3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return MCDwarfDirsCUMap[CUID]; 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const DenseMap<const MCSection *, MCLineSection *> 3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) &getMCLineSections() const { 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return MCLineSections; 3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const std::vector<const MCSection *> &getMCLineSectionOrder() const { 3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return MCLineSectionOrder; 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void addMCLineSection(const MCSection *Sec, MCLineSection *Line) { 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MCLineSections[Sec] = Line; 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MCLineSectionOrder.push_back(Sec); 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned getDwarfCompileUnitID() { 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return DwarfCompileUnitID; 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setDwarfCompileUnitID(unsigned CUIndex) { 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DwarfCompileUnitID = CUIndex; 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const DenseMap<unsigned, MCSymbol *> &getMCLineTableSymbols() const { 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return MCLineTableSymbols; 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MCSymbol *getMCLineTableSymbol(unsigned ID) const { 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DenseMap<unsigned, MCSymbol *>::const_iterator CIter = 3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MCLineTableSymbols.find(ID); 3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (CIter == MCLineTableSymbols.end()) 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return NULL; 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return CIter->second; 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setMCLineTableSymbol(MCSymbol *Sym, unsigned ID) { 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MCLineTableSymbols[ID] = Sym; 3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// setCurrentDwarfLoc - saves the information from the currently parsed 3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// dwarf .loc directive and sets DwarfLocSeen. When the next instruction 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// is assembled an entry in the line number table with this information and 3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// the address of the instruction will be created. 3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setCurrentDwarfLoc(unsigned FileNum, unsigned Line, unsigned Column, 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned Flags, unsigned Isa, 34802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch unsigned Discriminator) { 34902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch CurrentDwarfLoc.setFileNum(FileNum); 35002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch CurrentDwarfLoc.setLine(Line); 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CurrentDwarfLoc.setColumn(Column); 3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CurrentDwarfLoc.setFlags(Flags); 3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CurrentDwarfLoc.setIsa(Isa); 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CurrentDwarfLoc.setDiscriminator(Discriminator); 3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DwarfLocSeen = true; 35602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch } 3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void ClearDwarfLocSeen() { DwarfLocSeen = false; } 3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool getDwarfLocSeen() { return DwarfLocSeen; } 3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const MCDwarfLoc &getCurrentDwarfLoc() { return CurrentDwarfLoc; } 3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool getGenDwarfForAssembly() { return GenDwarfForAssembly; } 3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setGenDwarfForAssembly(bool Value) { GenDwarfForAssembly = Value; } 3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned getGenDwarfFileNumber() { return GenDwarfFileNumber; } 3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned nextGenDwarfFileNumber() { return ++GenDwarfFileNumber; } 3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const MCSection *getGenDwarfSection() { return GenDwarfSection; } 3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setGenDwarfSection(const MCSection *Sec) { GenDwarfSection = Sec; } 3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MCSymbol *getGenDwarfSectionStartSym() { return GenDwarfSectionStartSym; } 3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setGenDwarfSectionStartSym(MCSymbol *Sym) { 3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) GenDwarfSectionStartSym = Sym; 371926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MCSymbol *getGenDwarfSectionEndSym() { return GenDwarfSectionEndSym; } 3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setGenDwarfSectionEndSym(MCSymbol *Sym) { 3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) GenDwarfSectionEndSym = Sym; 3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 376926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const std::vector<const MCGenDwarfLabelEntry *> 3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) &getMCGenDwarfLabelEntries() const { 3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return MCGenDwarfLabelEntries; 3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void addMCGenDwarfLabelEntry(const MCGenDwarfLabelEntry *E) { 3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MCGenDwarfLabelEntries.push_back(E); 3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setDwarfDebugFlags(StringRef S) { DwarfDebugFlags = S; } 38502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch StringRef getDwarfDebugFlags() { return DwarfDebugFlags; } 3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setDwarfDebugProducer(StringRef S) { DwarfDebugProducer = S; } 3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) StringRef getDwarfDebugProducer() { return DwarfDebugProducer; } 38902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /// @} 3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) char *getSecureLogFile() { return SecureLogFile; } 3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) raw_ostream *getSecureLog() { return SecureLog; } 39402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch bool getSecureLogUsed() { return SecureLogUsed; } 3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setSecureLog(raw_ostream *Value) { 3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SecureLog = Value; 3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setSecureLogUsed(bool Value) { 3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SecureLogUsed = Value; 4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 40102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void *Allocate(unsigned Size, unsigned Align = 8) { 4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Allocator.Allocate(Size, Align); 40402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch } 4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void Deallocate(void *Ptr) { 4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Unrecoverable error has occured. Display the best diagnostic we can 4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and bail via exit(1). For now, most MC backend errors are unrecoverable. 4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: We should really do something about that. 4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_ATTRIBUTE_NORETURN void FatalError(SMLoc L, const Twine &Msg); 4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // end namespace llvm 4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// operator new and delete aren't allowed inside namespaces. 4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The throw specifications are mandated by the standard. 4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// @brief Placement new for using the MCContext's allocator. 419926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/// 4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// This placement form of operator new uses the MCContext's allocator for 4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// obtaining memory. It is a non-throwing new, which means that it returns 42202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch/// null on error. (If that is what the allocator does. The current does, so if 4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// this ever changes, this operator will have to be changed, too.) 4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// Usage looks like this (assuming there's an MCContext 'Context' in scope): 4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// @code 4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// // Default alignment (16) 4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// IntegerLiteral *Ex = new (Context) IntegerLiteral(arguments); 4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// // Specific alignment 4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// IntegerLiteral *Ex2 = new (Context, 8) IntegerLiteral(arguments); 4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// @endcode 43102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch/// Please note that you cannot use delete on the pointer; it must be 43202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch/// deallocated using an explicit destructor call followed by 43302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch/// @c Context.Deallocate(Ptr). 4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// 4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// @param Bytes The number of bytes to allocate. Calculated by the compiler. 4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// @param C The MCContext that provides the allocator. 4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// @param Alignment The alignment of the allocated memory (if the underlying 4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// allocator supports it). 43902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch/// @return The allocated memory. Could be NULL. 4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void *operator new(size_t Bytes, llvm::MCContext &C, 4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t Alignment = 16) throw () { 4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return C.Allocate(Bytes, Alignment); 4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// @brief Placement delete companion to the new above. 4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// 4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// This operator is just a companion to the new above. There is no way of 4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// invoking it directly; see the new operator for more details. This operator 4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// is called implicitly by the compiler if a placement new expression using 4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// the MCContext throws in the object constructor. 4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void operator delete(void *Ptr, llvm::MCContext &C, size_t) 4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) throw () { 4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) C.Deallocate(Ptr); 4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 454926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// This placement form of operator new[] uses the MCContext's allocator for 4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// obtaining memory. It is a non-throwing new[], which means that it returns 4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// null on error. 458926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/// Usage looks like this (assuming there's an MCContext 'Context' in scope): 4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// @code 4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// // Default alignment (16) 4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// char *data = new (Context) char[10]; 4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// // Specific alignment 4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// char *data = new (Context, 8) char[10]; 4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// @endcode 4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// Please note that you cannot use delete on the pointer; it must be 4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// deallocated using an explicit destructor call followed by 4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// @c Context.Deallocate(Ptr). 4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// 4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// @param Bytes The number of bytes to allocate. Calculated by the compiler. 4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// @param C The MCContext that provides the allocator. 4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// @param Alignment The alignment of the allocated memory (if the underlying 4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// allocator supports it). 4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// @return The allocated memory. Could be NULL. 4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void *operator new[](size_t Bytes, llvm::MCContext& C, 4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t Alignment = 16) throw () { 4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return C.Allocate(Bytes, Alignment); 4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// @brief Placement delete[] companion to the new[] above. 4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// 4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// This operator is just a companion to the new[] above. There is no way of 4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// invoking it directly; see the new[] operator for more details. This operator 4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// is called implicitly by the compiler if a placement new[] expression using 4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// the MCContext throws in the object constructor. 4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void operator delete[](void *Ptr, llvm::MCContext &C) throw () { 4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) C.Deallocate(Ptr); 4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)